系列文章目录
这里主要讲了集合的使用,有Collection和Map的集合接口,Colletion下的List和Set集合
目录
一、集合的概述
1.集合的长度是可变的
2.集合中的存储的数据可以是不同类型的 ,如果加上泛型的话就是会有限制
3.集合中只能存储引用数据类型
4.集合框架是在java.util包下的。
二、集合框架体系
集合框架主要由三个元素组成:接口,实现类,数据结构
继承体系图:
集合的分类:
单列集合和多列集合
单列集合:根接口是Collection接口,每个集合元素包含一个单独的对象。
多列集合:根接口是Map接口,每个集合元素由多个字段组成,用于存储多个相关的值。
三、Collection接口
Collection接口是单列集合的根接口
1.Collection接口还继承iterable接口,可以调用迭代器
Collection接口的主要方法:
注意点:
集合中的remove、contain等方法在底层调用的是equals方法,如果要存放自定义对象,要重写equals方法。
四、集合的遍历
单列集合的遍历有三种方法:
1.toArray()
调用toArray()方法,返回一个数组,遍历数组去进行遍历集合。
2.迭代器
调用iterator()方法,返回一个迭代器对象,然后进行遍历
需要使用迭代器的两个方法:hanNext()(判断下一个有没有元素)和next()(获取下一个集合元素并移动迭代器)方法
例如:
Iterator<泛型> iterator = 集合.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
3.增强for循环
for(集合元素类型 变量名:集合名 ){
System.out.println(变量名);
}
4.forEach
调用forEach方法,内部用匿名内部类,重写accept方法遍历。
arr.forEach(new Consumer<Integer>() { @Override public void accept(Integer integer) { System.out.println(integer); } });
五、List接口
1.List集合的特点
1.有序的集合
2.List是有索引下标的集合
3.List集合中可以存放重复的值。
4.List中的方法好多是可以通过索引的。
2.常用方法
3.ArrayList
ArrayList集合的底层是通过数组实现,它的特点是增删慢,查找快(LinkedList集合的特点与之相反)
4.LinkedList
LinkedList的底层是通过双链表实现的,它的特点是增删快,查找慢。
因为双链表查询的时候是从前到后的。
LinkedList操作头尾节点的方法:
时间戳:(用于计录时间)
long a = System.currentTimeMillis();
可以通过两个区计算操作的时间。
5.Vector
Vector底层也是通过动态数组实现的,线程安全。
之后用的不多,主要使用ArrayList,可以使用Collection类把ArrayList集合变为线程安全。
六、Set接口
1.Set集合的特点
1.Set集合是无序的
2.无索引下标
3.不能存放重复的值
2.HashSet
HashSet的特点:
1.无序性,底层是哈希表实现,存储顺序和插入顺序无关
2.唯一性,不允许存放重复的值
3.允许null元素,但只能存放一个null,因为不能存放重复的值
4.高效性
插入过程:
当向HashSet添加元素时,先获取hashCode()的值,再检查HashSet中是否存在相同哈希值的元素,如果元素哈希值唯一,则直接插入元素。
如果存在相同的哈希值的元素,再调用元素的equals()方法进一步判断是否相同。如果相同则不插入,如果不同,则插入。
如果是自定义类型需要重写hashCode()和equals()方法。
3.TreeSet
TreeSet是SortedSet(Set接口的子接口)的实现类,基于红黑树数据结构实现
TreeSet的特点:
1.有序性,基于红黑树的,每次插入元素会自动排序
2.唯一性,不允许有重复的值
3.高效性:对于有序集合的操作,比HashSet更有效。
4.动态性:插入删除的时间复杂度为O(log n),n为集合中元素的数量
自然排序:
自然排序是实现了Comparable接口,并重写了compareTo()方法。
compareTo(T o)方法:用this和o去进行比较
this是要插入的元素,o是已经在集合中的元素
如果想要正序,this - o
想要倒序:o-this
我自己的理解,因为是基于红黑树的,当 this - o 这是正常情况下的,当结果为正数,存到红黑树右边,负数存左边,最后得到就是正序的。
比较器排序:
比较器排序是可以使用匿名内部类实现,在定义TreeSet集合时直接传一个比较器对象
实现类Comparator接口,重写compare()方法
比较的规则是和自然排序一样的
compare(Object a , Object b )
a为要插入的元素,b是已经在集合的元素。
如果同时使用自然排序和比较器排序,比较器排序会覆盖自然排序。
4.LinkedHashSet
是HashSet的一个子类,会保存元素的插入顺序,基于哈希表和链表实现的。不允许重复元素。
七、Map接口
map集合是一种用于存储键值对映射关系的集合类,其中每个键是唯一的,值是可以重复的。
map是双列集合的根接口,没有实现Iterable接口,不能使用迭代器遍历。
map<key value>
1.特点
1.存储元素时,必须以key - value(键值对)的方式进行
2.键唯一性,map集合的键是唯一的,一个键对应一个值
3.可重复值:map集合的值可以重复,不同的键可以关联相同的值
4.高效的查找和访问,通过key去获得value
集合内部使用哈希表或红黑树等数据结构实现
2.常用方法
3.遍历
1.keySet通过
通过调用keySet()方法去遍历,调用keySet()返回了一个Set集合,存放所有的key
然后通过Set集合的遍历方法去遍历,然后通过get()方法获得value值
2.entrySet()
entrySet方法是把每一对的键值对去变为一个Entry对象,然后存到set集合中,然后遍历
例如:
Set<Map.Entry<k,v>> set = map集合.entrySet();
然后通过循环去遍历,通过getKey(),getValue()方法去进行获取键值。
4.HashMap
底层通过哈希表实现
特点:
1.键唯一
2.值可重复
3.无序xing
4.线程不安全
5.键和值允许使用null
注意:
1.如果键为自定义类型,那么自定义类型需要重写hashCode()和equals()方法
2.map中如果添加的是相同的,那么值会进行覆盖(如果想要修改某个值,那么可以直接覆盖它)
5.TreeMap
map接口下的子接口SortedMap接口下的实现类,和TreeSet相似,可以对键进行排序
特点:
1.有序的映射实现类,基于红黑树来存储键值对
2.键的排序,键可以按照自然排序和比较器排序进行排序
3.键唯一,值可以重复
4.线程不安全,如果在多线程下使用,需要使用Collections工具类
5.没有初始容量,是动态的。
6.键不能为null
6.Hashtable
特点:
1.线程安全,性能相对于HashMap较低
2.键和值不能为null
3.哈希表实现
注意:
单线程环境下建议使用HashMap
多线程环境下采用HashMap+Collections
7.LinkedHashMap
HashMap的子类,采用哈希表加链表的结构,可以保证元素的存取顺序一致
键和值都可以为null
八、Collections工具类
是java.util包下的工具类
常用方法:
1.fill()方法:使用指定元素替换指定列表中的所有元素
fill(集合名,20)把集合中的所有元素替换为20
2.max():根据元素的自然排序返回集合的最大值
3.min():返回最小值
4.reverse():反转集合中的元素
5.sort():根据元素的自然顺序,进行升序排序
sort(list ,可以在这里加一个比较器)
6.shuffle()通俗点就是打乱顺序
使用默认随机源对指定列表进行置换
7.addAll():往集合添加一些元素
Collections.addAll(list ,1,2,3,4);第二个参数为可变长参数
8.synchronized相关方法,将非线程安全的集合转为线程安全
以下就是将非线程安全转为线程安全的方法:
synchronizedList:List转换
synchronizedSet:Set转换
synchronizedCollection:Collection转换
synchronizedMap:Map转换