集合基本知识
集合
Collection(单列集合)
1.List(有序(存储与取出的顺序一致),可重复)
1.1. ArrayList
底层数组实现,查询快,增删慢,线程不安全,效率高。
1.2.Vector
底层数据结构是数组实现,查询快,增删慢,线程安全,效率低。
1.3. LinkedList
底层数据结构是链表实现,查询慢,增删快,线程不安全,效率高。
2.Set(无序(存储与取出的顺序不一致),唯一)
2.1. HashSet
底层数据结构由哈希表(实际上是一个 HashMap 实例)实现,它不保证 set 的迭代顺序。
允许使用 null 元素,依赖 hashCode()和equals()方法来区分存入的元素是否相同,来保证存储元素唯一性。
这两个方法(可自动生成)的执行顺序:
首先判断元素的hashCode()值是否相同
否:直接存储到集合
是:继续执行equals(),看其返回值
true:说明元素相同,就不存储
false:说明元素不同,就存储到集合
2.1.1. LinkedHashSet
底层数据结构由哈希表和链表组成。
哈希表保证元素的唯一性,链表保证元素有序(存储和取出一致)。
2.2. TreeSet
底层数据结构是红黑树。(是一种自平衡的二叉树结构)
元素的唯一性:
依靠元素比较的返回值是否为0来决定
元素的有序性:
1.自然排序(元素具备比较性)
无参构造(new TreeSet<T>())使用的是自然排序,让元素所属的类实现自然排序接口,底层用CompareTo()方法(Comparable接口)来做数据校验
2.比较器排序(集合具备比较性)
构造方法(new TreeSet<T>(Comparator comparator))接收一个比较器接口(其实是该接口的子类对象),
底层使用Compare()方法来做数据校验
Map(双列集合)
A:Map集合的数据结构仅仅针对键有效,和值无关。
B:存储的是键值对元素,键是唯一的,值可重复
1. HashMap
底层数据结构由哈希表实现,它不保证 set 的迭代顺序。允许使用 null 元素,
依赖hashCode()和equals()方法来区分存入的元素是否相同,来保证存储元素唯一性。
这两个方法(可自动生成)的执行顺序:
首先判断元素的hashCode()值是否相同
否:直接存储到集合
是:继续执行equals(),看其返回值
true:说明元素相同,就不存储
false:说明元素不同,就存储到集合
1.1. LInkedHashMap
底层数据结构由哈希表和链表组成。
哈希表保证元素的唯一性,链表保证元素有序(存储和取出一致)。
2. Hashtable
Hashtable与HashMap的区别
Hashtable:线程安全,效率低,不允许null键和null值
HashMap:线程不安全,效率高,允许null键和null值
3. TreeMap
底层数据结构是红黑树。(是一种自平衡的二叉树结构)
元素的唯一性:
依靠元素比较的返回值是否为0来决定
元素的有序性:
1.自然排序(元素具备比较性)
无参构造(new TreeSet<T>())使用的是自然排序,让元素所属的类实现自然排序接口
底层用CompareTo()方法(Comparable接口)来做数据校验
2.比较器排序(集合具备比较性)
构造方法(new TreeSet<T>(Comparator comparator))接收一个比较器接口(其实是该接口的子类对象),
底层使用Compare()方法来做数据校验
Iterator
Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
1.hasNext()是否还有下一个元素。
2.next()返回下一个元素。
3.remove()删除当前元素。
map的遍历
第一种:KeySet()
将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取key 。
取到的结果会乱序,是因为取得数据行主键的时候,使用了HashMap.keySet()方法,而这个方法返回的Set结果,里面的数据是乱序排放的。
典型用法如下:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put("key3","lisi3");
map.put("key4","lisi4");
//先获取map集合的所有键的set集合,keyset()
Iterator it = map.keySet().iterator();
//获取迭代器
while(it.hasNext()){
Object key = it.next();
System.out.println(map.get(key));
}
第二种:entrySet()
Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射关系的 Set 视图。(一个关系就是一个键-值对),就是把(key-value)作为一个整体一对一对地存放到Set集合当中的。Map.Entry表示映射关系。entrySet():迭代后可以e.getKey(),e.getValue()两种方法来取key和value。返回的是Entry接口。
典型用法如下:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put("key3","lisi3");
map.put("key4","lisi4");
//将map集合中的映射关系取出,存入到set集合
Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Entry e =(Entry) it.next();
System.out.println("键"+e.getKey () + "的值为" + e.getValue());
}
推荐使用第二种方式,即entrySet()方法,效率较高。
对于keySet其实是遍历了2次,一次是转为iterator,一次就是从HashMap中取出key所对于的value。而entryset只是遍历了第一次,它把key和value都放到了entry中,所以快了。两种遍历的遍历时间相差还是很明显的。
外部比较器与内部比较器的区别:
1:Comparable
/*内部比较器:需要排序的对象本身去实现comparable接口,重写compareTo(Object o)方法*/
a:基本数据类型封装类都继承了Comparable接口
b:TreeSet 和TreeMap集合默认是按照自然顺序排序的
c:继承类中实现compareTo()方法,在类内部实现的,所以称为内部比较器
2:Comparator
/*外部比较器:外部比较器不需要排序对象本身去实现任何的接口,单独定义一个比较器的类,该类需要实现comparator接口,重写compare()方法*/
配合Collections工具类的sort(List list, Comparator c)方法使用,其中的compare方法是在类外部实现的,所以称为外部比较器
参考资料:https://blog.csdn.net/u010775025/article/details/79315361
Jdk1.5后特性
- 自动装箱与自动拆箱
- 泛型
- 可变参数
- 枚举
- 增强for循环
- 静态导入
- 内省
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!