JAVA的Collection集合类总结
collection集合类是一种存储方式,相较于数组更有优势:
可以改变长度,可以存放多个类型的数据。
集合分为 单列集合,双列集合,Collection接口的2个重要子接口,List 和 Set,都是单列(一次存放一个数据)。而Map是双列,一次存放两个数据。
一. 遍历集合的方式
1.1 迭代器
注意,用完后要重置迭代器:
iterator = col.iterator();
1.2 增强for
底层仍是迭代器。
二. List及其子类
特点:
存储数据都是**有序有索引的,允许元素重复**,可以存入null。
只是子类的实现方法不同。
2.1 List
单列的List**允许重复**,通过add方法来加入元素,也可以add固定位置加入元素。
通过set索引位置元素,可以改变元素、remove可以删除。
List list = new ArrayList();
list.add("name1");
list.add("name2");
list.add(1,"name3");//是从1位置将元素插入,原来1位置的元素顺移
list.set(0,"set");
2.2 ArrayList(底层:可变数组)
允许元素重复。
List的子接口,特点:内存大小超过界限会自动增大。
初创ArrayList
对象时,初始容量为0,放进元素后变为10,超出后,容量变为1.5倍数。如果规定了大小,则超出后为规定大小的1.5倍
ArrayList arrayList = new ArrayList();
for (int i = 1; i <= 10; i++) {
arrayList.add(i);
}
arrayList.add("wtf");
此外,Vector与ArrayList用法类似。
2.3 LinkedList(底层:双向链表)
特点:类似于链表,插入、删除速度快,访问慢。
其各类方法:
(43条消息) Java中的LinkedList的方法的应用_K.Sun的博客-CSDN博客_java linkedlist方法
此外,LinkedList可以与Deque实现为栈。
三. Set及其子类
特点:
无序(输入和输出顺序不一定同),没有索引,不可重复元素(没有null)
3.1 无索引
Set并没有get方法,那么如何取出特定索引位置的值呢?
set.toArray()[Index] //输出Index位置的元素
3.2 不可重复
Set以及HashSet不可以放置相同元素:
输出(存入相同元素),会输出**false**。
存入相同元素,则直接**无效**,相当于没存。
注意:
add的底层是map.put实现的,比较的是新加入的元素与所有已加入元素的哈希地址,比如上面的AA在常量池中具有相同的地址,也就有相同的哈希值了。
因此,如果加入两个内容相同的new对象,虽然内容同,但地址显然是不同的,这种情况下,虽然内容重复却仍会被加入,比如:
如果想避免这类情况,可以在相应的HHH类里使用ALT+INSERT来**重写**equals和hashCode,即,当某自定义成员相同时判定为同样的hashcode,那么就“重复”了。
3.3 hashset的使用方法以及api
可以用于重复元素的判别,因为对象.add(元素)如果重复会出false。
其他api:
add(): 添加元素,重复则添加失败。
size():返回Set集合中的元素个数。
remove() : 能够删除set中的任意元素,直接remove(想删除的对象)。删除成功返回true,否则返回false。
isEmpty():如果Set不包含元素,则返回 true ,否则返回false。
clear(): 移除此Set中的所有元素。
contains(指定元素):如果Set包含指定的元素,则返回 true,否则返回false。
3.4 TreeSet
红黑树部分略。
四. Map及子类
无序,不可重复。
作为双列集合,其存放的数据是key-value一对数据,其key不允许重复,如果重复则会覆盖其value的值。
4.1 HashMap
(1)HashMap的方法
ch.getOrDefault(ch, 0) //getOrDefault要么返回ch的value,如果没有ch,则返回默认的0
(2)HashMap存放数据
不同的key值要经过hash(key)运算变为哈希值,通过哈希值来确定这对k-v键值对存放在hashMap的位置。
那么会分为以下几种情况:
1. 不同key:
一般有不同的hashcode,位置不同则直接存入即可。
若key不同但hashcode转换出来恰好相同,则会出现哈希冲突,则将加入的元素形成链表排在后面。
2. 相同key:
显然会计算出相同的hashcode,则直接在此位置赋新value的值(所以value相同时,相当于没变)。
所以是否会形成链表,核心是看key是不是相同。
(3)HashMap的遍历
Map map = new HashMap();
方法1:增强for
方法2:迭代器
方法3:entrySet
首先,Map的entrySet()方法:
返回的是Map.Entry键值对类型的结果,其是整体是Set类集合。也就是说一个Set里存了一堆Entry键值对。
Set set1 = map.entrySet(); //调用entrySet方法
然后采用增强for循环
for (Object entry : set1) {
Map.Entry m = (Map.Entry)entry;
System.out.println(m.getKey() + "+" + m.getValue());
}
注意:这里相当于Object entry指向entrySet()所返回的每一个Map.Entry类的键值对对象,父类(Object)对象无法调用子类(Map.Entry)的独有方法,因此要向下转型后再调用。