首页 / JAVA / JavaSE-集合知识点总结
JavaSE-集合知识点总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaSE-集合知识点总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5312字,纯文字阅读大概需要8分钟。
内容图文
![JavaSE-集合知识点总结](/upload/InfoBanner/zyjiaocheng/850/8d1aeb969029405c9cdca69902c48701.jpg)
集合知识点总结
----集合_01_集合框架概述与ArrayList基本使用
集合分为三大接口:Collection,Map,Iterator
Collection分为List和Set两大集合
List集合:
1.有序的集合序列,可以重复
2.允许多个null元素
3.具体的实现类常用的有:ArrayList数组列表,Vector,LinkedList
ArrayList:动态扩充数组
- 1.实现原理,采用动态对象数组实现,默认构造方法创建了一个空数组
- 2.第一次添加元素,扩展容量为10,之后的扩充算法:原来数组大小+原来数组的一半
- 3.不适合进行删除或者插入操作
- 4.为了防止数组动态扩充次数过多,建议创建ArrayList时,给定初始容量
- 5.多线程不安全,适合在单线程访问时使用,效率较高
Vector
- 1.实现原理,采用动态对象数组实现,默认构造方法创建一个大小为10的数组
- 2.扩充的算法:当增量为0时,扩充为原来大小的2倍,当增量大于0时,扩充为原来大小加上增量
- 3.不适合删除或插入操作
- 4.为了防止数组动态扩充次数过多,建议创建Vector时,给定初始容量
- 5.线程安全,适合在多线程访问时使用,在单线程中使用效率较低
LinkedList:链表的list实现类
- 1.实现原理,采用双向链表结构实现
- 2.链表的特点:适合插入,删除操作,性能高
*在实际开发中,我们如何选择List的具体实现呢?
*1.考虑安全问题(优先使用Vector类)
*2.是否频繁插入,和删除操作(建议使用LinkedList类)
*3.是否是存储后遍历(建议优先使用ArrayLisk)
集合_04_HashSet的特点及使用
Set
*Set集合
*1.无序的(不保证顺序)
*2.不允许重复元素
*3.常用实现类:HashSet,TreeSet,LinkedSet,LinkedHashSet
*4.如果要排序,选择treeSet
*如果不用排序,也不用保证顺序,选择hashSet
*如果不要排序,要保证顺序,选择LinkedhashSet
HashSet接口
*1.实现原理,基于哈希表(HashMap)实现
*2.不允许重复,可以有一个null元素
*3.不保证顺序恒久不变
*4.添加元素时把元素作为HashMap的key存储,HaspMap的value使用一个固定的object对象
*5.排除重复元素是通过equals来检查对象是否相同
集合_05_HashSet判断重复值的原理
HashSet
*1.实现原理,基于哈希表(HashMap)实现
*2.不允许重复,可以有一个null元素
*3.不保证顺序恒久不变
*4.添加元素时把元素作为HashMap的key存储,HaspMap的value使用一个固定的object对象
*5.排除重复元素是通过equals来检查对象是否相同
HashSet判断重复值的原理
*6 判断两个对象是否相同,先判断两个对象的hashCode是否相同(如果两个对象hashCode值相同,不一定是同一个对象,如果不同,那一定不是同一个对象),如果不同,则判断两个对象不是同一个对象,如果相同,还要进行equsls判断,equals值相同则是同一个对象,不同则不是同一个对象
- 7.自定义对象要认为属性值都相同时为同一个对象,有这种需求时,那么我们要重写对象所在类的hashCode和equals方法
- 小结
*(1)哈希表的存储结构:数组+链表形式,数组里的每一个元素以链表的形式存储
*(2)如何把对象存储到哈希表中:先计算对象的hashCode值,在对数组的长度求余数,来决定对象要存储到数组的哪一个位置
*(3)解决hashSet中重复值的方式是,参考上面第6点
集合_06_TreeSet与LinkedHashSet
TreeSet接口
- 1.实现原理,基于TreeMap(二叉树数据结构)实现
*2.有序的,对象需要比较大小,通过对象比较器来实现,对象比较器还可以用来去除重复元素 Compartor();
*3.可通过实现Compartor<>接口来给数据进行排序
如果自定义的数据类没有实现比较器接口,那么数据类无法添加到TreeSet中
LinkedHashSet接口
- 1.实现原理,哈希表和链接列表实现
- 2.维护这一个运行与所有条目的双重链接列表,此链接列表定义了迭代顺序,即按照将元素插入到Set中的顺序进行迭代
*3.保证顺序不变
集合_07_集合迭代器
//foreach(JDK1.5之后使用)
//Iterator(JDK1.5之前统一使用)
一个一个往下取值
集合_08_jdk8的foreach与Consumer接口
List.forEach(System.out::println);
集合_09_jdk8的四大核心函数式接口
()->{}number表达式固定形式
Function接收一个参数并产生结果的函数
Supplier:代表结果供应商
predicate:断言接口
集合_10_jdk8之Stream接口
*Stream接口:不是存储数据结构,数据源可以是一个集合,为了函数式编程创造
*惰式执行,数据只能被消费一次
*两种类型的操作方法
*1.中间操作(生成一个Stream)
*2.结束操作(执行计算操作)
::方法的引用
//引用静态方法 Integer::valueOf
//引用对象的方法 list::add
//引用构造方法 ArrayList::new
集合_12_Map接口与HashMap基本使用
*Map接口
*Map<K,V>
*K:Key由此地图维护的键的类型
*V:Value映射值的类型
*1.键值对来存储一组对象
*2.Key必须保证不重复(唯一),Value可以重复
*3.常用的实现类:HashMap,TreeMap,Hashtable,LinkedHashMap
- 4.HashMap和Hashtable的区别?
- HashMap线程不安全,适合在单线程使用,扩充算法为当前数组乘以2,相当与扩大一倍
- Hashtable线程安全,适合在多线程使用,扩充算法为当前数组容量乘以2再+1
- 5.数据结构:数组,链表,二叉树(红黑树),哈希表(数组+链表),栈,队列
1.8版本以后
集合_13-14_HashMap源码分析与哈希表实现原理
- HashMap的实现原理
- 1.基于哈希表(数组+链表+二叉树(红黑树))1.8JDK
- 2.默认加载因子为0.75,,默认数组大小是16,不能保证顺序恒久不变
- 3.把对象存储到哈希表中,如何存储??
***把Key对象通过hash()方法计算hash值,然后用这个hash值对数组长度取余数(默认是16)
来决定该Key对象在数组中存储的位置,当这个位置有多个对象时,以链表结构存储,在JDK1.8后,当链表长度大于8时,链表将转换为红黑树结构存储 - 这样的目的,是为了取值更快,存储的数据量越大,性能的表现越明显
- 4.扩充原理:数组的容量超过75%,那么表示该数组需要进行扩充,如何扩充??
***扩充算法是:当前数组容量<<1(相当于乘以2),扩大一倍,然后相当对32取余数在决定存储位置,扩充次数过多会影响性能,每次扩充表示hash表重新散列(重新计算每个对象的存储位置),我们在开发中尽量要减少扩充次数带来的性能问题。 - 5.线程不安全,适合在单线程中访问,在多线程中容易出现数据错乱
集合_15_Hashtable与LinkedHashMap
- Hashtable的实现原理
- JDK1.0开始
- 基于哈希表实现(数组加链表)
- 默认数组大小为11,加载因子为0.75
- 扩充方式:原数组大小<<1(*)+1
- 线程安全的,用于多线程访问时使用
- LinkedHashMap实现原理
- LinkedHashMap是HashMap的子类,由于HashMap不能保证顺序恒久不变,此类使用一个双重链表来维护元素添加的顺序
集合_16_TreeMap
- treeMap
- 基于二叉树的红黑树实现
*也是实现了comparable<>接口
内容总结
以上是互联网集市为您收集整理的JavaSE-集合知识点总结全部内容,希望文章能够帮你解决JavaSE-集合知识点总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。