- 数组的长度是固定的,当需要处理长度未知或不固定的数据时,就需要用到集合
遵循Collection接口
遵循List子接口
- list集合中的数据都是单一的
- 按照插入顺序保存数据,数据是可以重复的
- 具体的实现类有ArrayList和LinkedList
ArrayList类
- 底层用顺序表实现
- 创建ArrayList对象时不需要传构造参数,直接new就行,此时底层数组为空数组
- 可以给构造参数传递一个int值,用于设定底层数组的长度
- ArrayList有自动扩容功能,如果存储数据超出当前数组的长度,会自动创建一个更长的新数组,把之前的数据拷过来,和越界的数据连接成新数组,不会出现索引越界,并抛弃掉旧数组
- 增
- ArrayList提供了add方法用于增加数据,有一个参数的add方法(参数为插入的数据,默认插在尾部),也有两个参数的add方法(参数为索引和插入的数据,可以在指定位置插入数据)
- addAll方法用于将另一个ArrayList对象整体插入到尾部
- 删
- remove方法用于删除指定位置的数据,传一个参数(索引),并返回删除的值
- clear方法用于清空集合中的所有数据
- removeAll方法用于清空指定集合的数据
- 改
- set方法用于修改指定位置的数据,传两个参数(索引,修改后的值),并返回修改前的值
- 查
- size方法用于获取存储数据的个数
- get方法用于获取指定位置的数据,传一个参数(索引从0开始)
- isEmpty方法用于判断集合是否为空
- contains方法用于判断集合中是否存在某个数据
- indexOf方法用于获取某个数据在集合中的索引,如果数据不存在返回-1,如果存在两个一样的数据返回第一个位置
- lastIndexOf方法用于获取某个数据在集合中最后一次出现的索引
- 其它
- toArray方法将集合转换成数组类型
- clone方法克隆一个新的集合对象
- sort方法实现了排序
ArrayList l = new ArrayList();
l.add("you");
l.add(1, "I");
ArrayList l1 = new ArrayList();
l.addAll(l1);
removeValue = l.remove(0);
l.removeAll(l1);
l.clear();
oldValue = l.set(0, "me");
l.size();
l.get(0);
for(Object obj : l){
System.out.println(obj);
}
l.isEmpty();
l.contains("me");
l.indexOf("me");
l.lastIndexOf("me");
Object[] obj = l.toArray();
Object[] obj1 = l.clone();
ArrayList l2 = (ArrayList )obj1;
LinkedList类
- 底层用循环双链表实现
- add方法可以增加数据,也可以在指定索引处增加一个数据,此处的索引并不是数组中真正的索引,而是链表元素中增加的表示元素顺序的名义上的索引
LinkedList l = new LinkedList();
l.add("1");
l.push("aaa");
l.addFirst("2");
l.addLast("3");
l.add(1, "4");
LinkedList l1 = new LinkedList();
l.addAll(l1);
l.pop();
l.remove(o: "2");
l.remove(index: 0);
l.removeFirst();
l.removeLast();
l.set(0, "5");
l.getFirst();
l.getLast();
for (Object o : l){
打印o;
}
l.size();
l.isEmpty();
l.contains("1");
l.element();
l.indexOf("1");
l.LastIndexOf("1");
l.clear();
ArrayList类与LinkedList类的比较
- 增加第一条数据,LinkedList更快
- 增加第二条数据,ArrayList更快
- 超过底层数组容量再增加数据,LinkedList更快
- 插入数据,LinkedList更快
遵循Set子接口
- 集,无序保存数据,数据是不可以重复的
- 具体的实现类有HashSet
HashSet类
- HashSet底层为顺序表+单链表,解决冲突的方式为链地址法
- HashSet会自动抛弃一模一样的数据,即自动去重
- HashSet数据是无序的
- HashSet没有修改的方法,只能先删除后增加
- HashSet没有直接查询的方法,只能遍历查询
- HashSet提供addAll方法,可以把ArrayList对象完整增加,且自动去重
HashSet set = new HashSet();
set.add("you");
set.add("you");
set.remove("you");
ArrayList l = new ArrayList();
set.addAll(l);
Object[] o = set.toArray();
set.isEmpty();
set.size();
Object obj = set.clone();
set.contains("you");
set.clear();
遵循Queue子接口
- 队列,先进先出
- 具体的实现类有ArrayBlockingQueue
ArrayBlockingQueue类
- 底层是有限制的循环队列,满了之后不允许入队
- 创建ArrayBlockingQueue对象时必须说明队列长度n,长度超出n时发生阻塞
ArrayBlockingQueue queue = new ArrayBlockingQueue(2);
queue.add("a");
queue.add("b");
queue.add("c");
queue.put("a");
queue.put("b");
queue.put("c");
boolean a = queue.offer("a");
boolean b = queue.offer("b");
boolean c = queue.offer("c");
queue.poll();
queue.take();
queue.size();
queue.isEmpty();
queue.contains("a");
queue.clear();
遵循Map接口
- map集合中的数据是成对的
- 具体的实现类有HashMap和HashTable
HashMap类
- 底层也是数组+单链表
- 底层数组长度默认为16
- 保存的不是单个数据,而是key value键值对
- 也是无序存储,不能放重复数据
- 根据key来判断是否为重复数据,只要key一样,就判断为重复数据,用新数据把旧数据覆盖掉
- put方法既可以用来添加数据,也可以用来修改数据,当该地址已经存在与新数据的key一样的旧数据时,put方法会用新数据把旧数据覆盖掉,并把旧数据的value返回
- putIfAbsent方法也可以用来添加数据,当该地址已经存在与新数据的key一样的旧数据时,putIfAbsent方法不会添加新数据
- replace方法真正用于修改数据,当key不存在时,put方法会添加数据,而replace方法只会修改key存在的数据的value值,并把旧数据的value返回
- HashMap用Iterator迭代器代替for循环,避免了因数据未实时更新而报的错
- 进阶:单链表太长会影响查询速度,红黑二叉树可以解决这个问题
HashMap map = new HashMap();
map.put("a", "0");
map.put("a", "1");
map.put("b", "2");
map.putIfAbsent("b", "3");
map.replace("b", "4");
map.get("a");
map.remove("a");
map.remove("a", "0");
Set keys = map.keySet();
map.containsKey("a");
Collection values = map.values();
map.containsValue("0");
Set sntries = map.entrySet();
Set keys = map.keySet();
Iterator it = keys.iterator();
while(iterator.hasNext()){
String key = it.next();
if("a".equals(key)){
it.remove();
}
}
Hashtable类
- 底层也是数组,长度与HashMap不一样,为11
- HashMap的key和value都可以是null,Hashtable不可以
- 底层用的计算地址的算法不同,HashMap更复杂一些
- 多线程访问时,HashMap性能较高,但安全性较差,操作二者基本一样
Arrays工具类
- 有很多实用的静态方法,不需要创建对象就可以直接使用
- toString方法可以将展示出来不好理解的int数组转换成好理解的字符串形式
- sort方法可以实现排序
- binarySearch方法可以用二分查找法在有序数组中找某个元素
- equals方法可以比较两个数组的任意一段数据的内容,当该段数据位置与值完全相同且对应时,返回true
int[] i1 = {3,2,1,4,5}
int[] i2 = {2,2,3,4,4}
Arrays.toString(i1)
Arrays.sort(i1);
Arrays.binarySearch(i1, 2);
Arrays.equals(i1, i2);
Arrays.equals(i1, 1, 4, i2, 1, 4);