一个Java对象可以在内部持有若干其他Java対象,并对外提供访问接口,这种Java对象称为集合。
有了数组为什么还需要其他集合类?
java.util提供了集合类,包括:
Collection:集合类的根接口
Java集合设计的特点:
接口和实现相分离:
List接口: ArrayList, LinkedList
支持泛型:
List list = new ArrayList<>();
访问集合有统一的方法:
迭代器(Iterator)
总结
List是一种有序链表
数组也是有序结构,但是大小固定,且删除元素时需要移动后续元素。
ArrayList:内部使用数组存储所有元素
LinkedList:内部每个元素都指向下一个元素
使用get(int index)
// ArrayList效率高一点
List list = ...
for (int i=0; i
使用Iterator
List list = ...
for (Iterator it = list.iterator();
it.hasNext();) {
String s = it.next() ;
}
使用foreach
所有实现了Iterable借口的类都可以使用foreach循环遍历
List list = ...
for (String s : list){
}
把List变为Array
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Integer[] array = list.toArray (new Integer [3]);
// Integer[] [ 1, 2, 3 ]
Integer[] array = list.toArray (new Integer [2]);
//{1,2,3}
Integer[] array2 = list.toArray (new Integer[5]);
//{1, 2,3, null, null}
Integer[] array3 = list.toArray (new Integer[list.size]);
//
把Array变为List
Integer[] array = {1,2,3};
List list = Arrays.asList(array);
//注意返回的1ist并不是ArrayList,并且是只读的
list.add(4) ; // UnsupportedOperationException !
//把Array转变为ArrayList
List list = Arrays.asList (array) ;
List arrayList = new ArrayList<> ();
arrayList.addAll(list) ;
List arrayList =new ArrayList<> (Arrays.asList(array)) ;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("Apple");
list.add("Pear");
list.add("Orange");
for (String s : list) {
System.out.println(s);
}
}
}
List list = new ArrayList<>();
list.add("Apple");
list.add("Pear");
list.add("Orange");
String[] ss = list.toArray(new String[list.size()];
for (String s : ss) {
System.out.println(s);
}
boolean contains(Object o)的方法实现的原理是equals。
返回的是false,原因是Person类中的equals方法是用==来实现的。
这里尝试编写编写equals方法复写Person类中的equals方法。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new Person("Ming", 12));
list.add(new Person("Hong", 15));
list.add(new Person("Jun", 18));
System.out.println(list);
System.out.println(list.contains(new Person("Jun", 18)));
}
}
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "(Person: " + name + ", " + age + ")";
}
public boolean equals(Object o){
if(this == o){
return true;
}
if(o instanceof Person){
Person p = (Person)o;
//return (p.name == this.name || p.name != null && p.name.equals(this.name)) && p.age == this.age ;
return Objects.equals(p.name,this.name) && p.age == this.age;
}
}
}
如果要在List中查找元素:
JDK提供的String、Integer等已经覆写了equals方法
如果不在List中查找元素: