集合类学习
1.什么是集合
一种存放对象的容器
2.分类
在Java中(util包下)集合分为单列集合(Collection)与双列集合(Map)
2.1.Collection集合
Collection是单列集合的顶层父接口,其下分为List集合与Set集合两大类。
2.1.1.List集合
list集合是
- 有序的,
- 可以重复,
- 只能添加引用数据类型(存放基本数据类型会转换成其对应的包装类)
list集合有三种遍历方式
1 ) 下标遍历(for循环,指定下标长度,使用List集合的size()方法,进行for循环遍历)
2 ) foreach遍历(使用foreach遍历List,但不能对某一个元素进行操作)
3 ) 迭代器遍历(适用迭代器Iterator遍历:直接根据List集合的自动遍历)
//迭代器Iterator的使用
//1)获取迭代器(相当于实现接口Iterator的类)
Iterator<String> iterator = list.iterator();
//2)获取迭代器(相当于实现接口Iterator的类)
while(iterator.hasNext()){//判断是否有这个迭代元素
System.out.println(iterator.next());//.next()是获取这个迭代元素
}
2.1.1.1.ArrayList
特点 :
- 使用频率最高。
- 有索引
- 底层是Object数组,所以查询快,增删慢
因为在数组结构中,数组只需要一个索引就能查找到数据,所以查询快。
但是在增删时,会移动数组,所以增删慢
- 有序(这里的有序是指,存储顺序是否按添加顺序来存储对象的)
- 元素可重复
- 线程不安全(添加数据的时候,可能会发生数组越界)
2.1.1.2.LinkedList
特点 :
- 有索引
- 底层是双向链表,查询慢,增删快
因为底层是个链表,进行查询的时候,首先看索引,与集合尺寸size/2比较,判断从头还是尾开始查找,又因为是链表结构,所以不停的迭代查找下一个元素,所以查询慢。
由相互引用的节点组成的双向链表,那么当把数据插入至该链表某个位置时,该数据就会被组装成一个新的节点,随后只需改变链表中对应的两个节点之间的引用关系,使它们指向新节点,即可完成插入;同理,删除数据时,只需删除对应节点的引用即可,所以增删快
- 有序
- 元素可重复
- 线程不安全
2.1.2.Set集合
- 无序(LinkedHashSet除外)
- 无索引
- 元素唯一
使用哈希表结构保存自定义类型时,为了保证元素的唯一性,要重写自定义类型中的hashCode和equals方法
2.1.2.1.HashSet集合
特点 :
- 无序
- 无索引
- 元素唯一
- 底层是哈希表(实际上就是调用HashMap)结构
2.1.2.2.LinkedHashSet集合
特点 :
- 有序
- 无索引
- 元素唯一
- 底层是链表+哈希表结构
2.1.2.3.TreeSet集合
特点 :
- 无序(这里的无序是指,存储顺序是否按添加顺序来存储对象的(但是有自然顺序))
- 无索引
- 元素唯一
- 底层是红黑树
2.2.Map集合
- 无序
- 以键值对的形式添加元素,
- 键不能重复,值可以重复,如果键相同,值会覆盖
- 它没有继承Collection接口
遍历
- 1).通过Map.keySet遍历key和value
map.keySet()返回的是所有key的值
map.get(in)得到每个key对应value的值 - 2).通过Map.entrySet使用iterator遍历key和value
- 3).通过Map.entrySet遍历key和value
map.entrySet() 返回此映射中包含的映射关系的 Set视图。 - 4).通过Map.values()遍历所有的value,但不能遍历key
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "ab");
map.put(4, "ab");
map.put(4, "ab");// 和上面相同 , 会自己筛选
System.out.println(map.size());
System.out.println("第一种:通过Map.keySet遍历key和value:");
for (Integer in : map.keySet()) {
//map.keySet()返回的是所有key的值
String str = map.get(in);//得到每个key多对用value的值
System.out.println(in + " " + str);
}
System.out.println("第二种:通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
// 第三种:推荐,尤其是容量大时
System.out.println("第三种:通过Map.entrySet遍历key和value");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
//Map.entry<Integer,String> 映射项(键-值对) 有几个方法:用上面的名字entry
//entry.getKey() ;entry.getValue(); entry.setValue();
//map.entrySet() 返回此映射中包含的映射关系的 Set视图。
System.out.println("key= " + entry.getKey() + " and value= "
+ entry.getValue());
}
System.out.println("第四种:通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
2.2.1.HashTable集合
HashTable是一个古老的Map实现类,它提供的方法比较繁琐,目前基本不用了
特点 :
- 线程安全的,但是效率相对较低
- Hashtable不允许使用null作为key和value
2.2.2.HashMap集合
HashTable与HashMap之间的关系完全类似于Vector(老版Arraylist,但是线程安全)和Arraylist的关系。
特点 :
- 线程不安全的,但是效率相对较高
- HashMap可以使用null作为key或value
- 底层是数组+链表+红黑树 (哈希表)
2.2.3.LinkedHashMap集合
特点 :
- 有序(按照插入的顺序排序)
- 底层是链表+哈希表结构
通过链表负责维护Map的迭代顺序,与插入顺序一致,所以性能比HashMap低,但在迭代访问Map里的全部元素时有较好的性能。
2.2.4.TreeMap集合
特点 :
- 线程不安全
- 底层是红黑树
- 有序(按照Key的自然顺序或者Comprator的顺序进行排序)
TreeMap 默认排序规则:按照key的字典顺序来排序