Day15 集合、List
- 集合
1.1 什么是集合?
集合是是程序能够存储和操纵元素不固定的一组数据。所有java集合都位于java.util包中。
数组和集合的区别:
数组长度固定、可以存放任意类型。
集合长度不固定,不能存放基本数据类型,只能存放对象的引用。
1.2 继承体系
ArrayList:底层采用了数组这种数据结构。
优点:查询效率高。
缺点:随机增删元素效率低。
LinkedList::底层采用双向链表数据结构。
优点:随机增删元素效率低。
缺点:查询效率低。
Vector:底层也是数组,和ArrayList相似。Vector支持线程同步机制,一般不采用集合自身所带的线程安全机制,效率较低。
1.3 Collection
Collection接口是List接口和Set接口的父接口,它定义的方法可以用于操作List集合和Set集合。
Collection接口定义的方法:
*boolean add(Object obj) 该方法用于集合中添加元素,添加成功返回true。
*void clear 清除集合内所有元素,集合长度为0.
*boolean contains(Object obj) 返回集合中是否包含某个元素。
*boolean containsAll(Collection c) 返回集合里是否包含集合c中所有元素。
*int hashCode() 返回此collection的哈希值。
*boolean isEmpty() 返回集合是否为空,当集合长度为0时返回true
*Iterator iterator() 返回一个迭代器,用于遍历集合中的元素。
*boolean remove(Object obj)删除集合中指定的元素obj,当存在时删除,返回true
*boolean removeAll(Collection c) 删除集合c中所有元素。
*boolean retainAll(Collection c) 删除集合中不在集合c中的元素。
*int size 返回集合中元素的个数
*Object[] toArray() 该方法把集合转换成一个数组,所有集合元素变成对应的数组元素。
//创建一个ArrayList对象,多态
Collection c = new ArrayList();
//判断集合长度是否为空
System.out.println(c.isEmpty());
//数组中添加元素
c.add(1);
c.add("张三");
//已有元素的个数
System.out.println(c.size);
//判断是否存在会 调用判断元素的equals方法,挨个和集合中的元素比较
System.out.println(new integer(1));
//根据内容删除元素,用要删除的元素对象调用equals方法,挨个和集合中的元素进行比较,如果找到删除就返回true 如果未找到就返回false
c.remove(1);
注意:当我们自己自定义类型的时候,就需要根据需求自己复写equals方法
Object[] arr = {1,2,3};
//利用Arrays的asList可以直接把数组转换为集合。
Collection c1 = Arrays.asList(arr);
//把c集合中的元素全部添加到c中
c1.addAll(c1);
//集合转换为数组,无参,返回新数组
Object[] objArr = c.toArray();
//利用有参,也能转化为数组,返回值为传入数组的引用。
Object[] objArr2 = new Object[c.size];
//由于传引用所以不能接受返回值
c.toArray(objArr2);
//遍历
for(Object object :objArr2){
System.out.println(object);
}
1.4 Iterator:迭代器——迭代器可以遍历集合对象
生成迭代器对象的语法:
Iterator it = 集合对象.iterator();
迭代器为了方便遍历提供了三个方法:
1.boolean hasNext() :判断光标下一位是不是还有元素,有是true 没有是false
2.E next():将迭代器光标向下移动一位,并取出该元素Element
3.remove():删除当前指向的元素
注意:迭代器一旦创建,集合不能进行添加删除操作,如果添加删除了必须重新生成 迭代器。
代码案例:
public static void main(String[] aegs){
//创建集合对象
List list = new ArrayList();
//向集合中添加元素
list.add(1);
list.add("张三");
//生成迭代器对象
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
}
1.5 注意
使用contains和remove的时候 如果是自定义类型,需要根据需求覆写equals方法
因为这两个方法底层都会去自动调用对象的 equals方法来进行对象的比较