1. 集合
1.1 概述
java集合是使程序能够存储和操纵元素不固定的一组数据。所有java集合类都位于java.until包中
【问】:之前需要把多个元素放到一起的时候,使用的是数组。那么为何还要提供java集合工具类呢?
我们来通过对比数组和java集合工具类来解释java集合工具类的必要性
数组:长度固定 存放任意类型
集合:长度不固定 不能存放基本数据类型,只能存放对象的引用
注意:如果集合中存放基本类型,一定要将其“装箱”成对应的“基本类型包装类”。
1.2 继承体系
由以上两图我们可以看出java集合类有清晰的继承关系,有很多子接口和实现类。但是并不是所有子接口或实现类都是最常用的。
最常用的子接口和实现类:
Collection-->List-->ArrayList类
Collection-->List-->LinkedList类
Collection-->Set-->HashSet类
Collection-->Set-->SortedSet接口-->TreeSet类
Map-->HashMap类
Map-->SortedMap-->TreeMap类
2. Collection
2.1 方法
2.2 使用
//创建集合
Collection c = new ArrayList();
System.out.println(c.isEmpty());
//基本类型先进行自动装箱,然后再向上转型
c.add(1);
System.out.println(c.isEmpty());
System.out.println(c.size());
c.add("xxx"):
System.out.println(c.size());
//转换为数组进行遍历
Object[] objects = c.toArray();
for(Object object:objects){
System.out.peintln(object);
}
//删除
c.remove("xxx");
//清空集合
c.clear();
System.out.println(c.isEmpty());
2.3 注意
boolean contains(Object o):判断是否包含某个元素
boolean remove(Object o):删除指定元素
这两个方法低层都会调用equals方法进行比较
比如:c.contains("abc");会用abc调用equals方法和集合中所有元素进行比较
所以,如果我们要存储的是自定义的类型,想要使用contain和remove就需要覆写equals方法
3. Iterator
3.1 概述
1.COllection接口的iterator()和toArray()方法都用于获得集合中的所有元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组
2.Iterator接口隐藏低层集合中的数据结构,提供遍历各种类型集合的统一接口
3.2 方法
3.3 使用
//生成迭代器
Iterator it = c.iterator();
//迭代器一旦创建,集合中元素不能删除和添加,否则就需要重新生成迭代器
while(it.hasNext()){
Object object = it.next();
System.out.println(object);
//如果在使用迭代器的过程中,需要进行删除,必须使用迭代器的remove方法
//it.remove();
}
//迭代器遍历完成之后,想要再次遍历,只能重新生成
it = c.iterator():
while(it.hasNext()){
Object object = it.next();
System.out.println(object);
}
4. List
4.1 概述
List:有序可重复
存入顺序和取出顺序是一致的
ArrayList :底层是数组,查询和更改效率极高,添加和删除效率低
LinkedList:底层是双向链表,查询效率低,添加删除效率较高
Vector:已经过时,底层也是数组,ArrayList是Vector的升级版
Vector默认容量是10,扩大容量是2倍,线程安全,效率较低
ArrayList默认容量是10,扩大容量是1.5倍,非线程安全,效率较高
4.2 ArrayList
底层是Object[] 数组,所以只能保存引用类型
但是由于基本类型会自动装箱为包装类类型,所以导致Object[] 数组什么也能放
ArrayList list = new ArrayList();
1. list.add(E e):将元素添加到列表的尾部
list.add(11);
2. add(int index,E e):将元素添加到列表指定位置
list.add(0,22);
3. ArrayList覆写了toString方法,所以打印结果不是内存地址,而是里面的数据[22,11]
System.out.println(lista);
4. set(int index,E element):替换指定位置上的元素
list.set(1,33);
5. get(int index):根据索引获取对应的元素
list.get(1);
6. remove(int index):根据索引删除元素
list.remove(1);
7.remove(Object object):删除指定元素,如果想根据元素值删除22,不能直接写22,这样直接 写写的是下标,应当手动把22封装到Interger类型中
list.remove(new Integer(22));
4.3 LinkedList
4.3.1 概述
LinkedList:底层是双向链表
链表的节点有三个部分构成:1.添加的元素 2.下一个节点的引用 3.上一个节点的引用
链表数据结构,在内存中存储也不是连续的,所以没有固定的下标,因此查询效率低
因为内存空间不是连续的,只能找到下一个节点,因此添加和删除就变的容易了
4.3.2 基本使用