Java集合
1、Java 集合可分为 Collection 和 Map 两种体系
Collection接口:单列数据,定义了存取一组对象的方法的集合
List:元素有序、可重复的集合
Set:元素无序、不可重复的集合
Map接口:双列数据,保存具有映射关系“key-value对”的集合
Collection 接口方法
1、添加 add(Object obj) addAll(Collection coll) 2、获取有效元素的个数 int size() 3、清空集合 void clear() 4、是否是空集合 boolean isEmpty() 5、是否包含某个元素 boolean contains(Object obj):是通过元素的equals方法来判断是否 是同一个对象 ; boolean containsAll(Collection c):也是调用元素的equals方法来比 较的。拿两个集合的元素挨个比较。 6、删除 boolean remove(Object obj) :通过元素的equals方法判断是否是 要删除的那个元素。只会删除找到的第一个元素 boolean removeAll(Collection coll):取当前集合的差集 7、取两个集合的交集 boolean retainAll(Collection c):把交集的结果存在当前集合中,不 影响c 8、集合是否相等 boolean equals(Object obj) 9、转成对象数组 Object[] toArray() 10、获取集合对象的哈希值 hashCode() 11、遍历 iterator():返回迭代器对象,用于集合遍历
拓展:数组 --->集合:调用Arrays类的静态方法asList(T ... t) List<String> list = Arrays.asList(new String[]{"AA", "BB", "CC"});
使用Collection集合存储对象,要求对象所属的类满足:
向Collection接口的实现类的对象中添加数据obj时,要求obj所在类要重写equals().
Object中的equals()方法默认是按地址比较,而不按内容进行比较,
public boolean equals(Object obj) { return (this == obj); }
在String中覆写了Object中的equals方法,以用于判断字符串是否相同,
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
Object中equals方法可以被子类重写,然后多态调用,当我们要自定义对象比较时一般要覆写equals方法,比如有Person对象,同姓名同年龄,视为同一个对象,
public boolean equals(Object obj) { if(!(obj instanceof Person)) return false; Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; }
使用 Iterator 接口遍历集合元素
Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所 有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了 Iterator接口的对象。
Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合。
集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合 的第一个元素之前。
Iterator iterator = coll.iterator();
//hasNext():判断是否还有下一个元素 while(iterator.hasNext()){ //next():①指针下移②将下移以后集合位置上的元素返回
System.out.println(iterator.next()); }
foreach 循环迭代访问 Collection和数组
遍历操作不需获取Collection或数组的长度,无需使用索引访问元素。
遍历集合的底层调用Iterator完成操作,foreach还可以用来遍历数组。