20201009_陈宇_
日志
学习总结:
ArrayList、Vector和LinkedList的区别:
相同点:
①.都是Java.util.List接口的实现子类
②.都是有序、可排序、可重复的集合,可存null
③.都支持迭代器操作
区别:
1.实现接口不同:
ArrayList和Vector未实现Queue接口、Deque接口,不支持队列操作
LinkedList实现了Queue接口、Deque接口,支持队列操作,同时支持栈操作
2.内部实现不同:
ArrayList和Vector内部都采用数组来存储元素
LinkedList内部采用链表存储元素
3.线程安全:
ArrayList和LinkedList都是非线程安全,适用于单线程环境
Vector是线程安全,适用于多线程环境
4.扩容方式不同:
ArrayList是1.5倍扩容
Vector是固定数值扩容
LinkedList是链表结构,无需扩容
5.增删效率不同:
ArrayList和Vector内部都是数组存储,所以增删效率低
LinkedList是链表结构,增删效率高
6.访问效率不同:
ArrayList和Vector内部是连续空间,访问效率高
LinkedList不一定是连续空间,访问效率低
7.初始容量不同:
ArrayList和Vector初始容量是10
LinkedList没有初始容量,也无需扩容
HashMap和Hashtable的异同:
相同点:
都实现Map接口,用于存放键值对
负载因子都是0.75
都采用哈希表实现,都采用计算哈希键值对
区别:
1.是否支持线程安全:
Hashtable是线程安全的,效率较低
HashMap是非线程安全的,效率较高
2.内部实现不同:
Hashtable内部是数组+链表实现的
HashMap内部是数组+链表+红黑树实现的
3.对元素位置的计算方法不同:
Hashtable是直接用元素的hashCode求模得到元素的index值进行存储
HashMap是用hash方法重新获取元素的hashCode值,再求模得到元素的index值去存储
4.两者继承的类不同:
Hashtable是继承的Dictionray类
HashMap是继承AbstarctMap类
5.是否支持null:
Hashtable不允许存储null的键和值
HashMap允许存储null的键和值
6.初始容量不同:
Hashtable的初始容量是10
HashMap的初始容量是16
7.扩容方式不同:
Hashtable是旧容量的2倍+1
HashMap是2倍的旧容量
LinkedHashMap:
哈希表和双向链表实现的Map接口
具有可预测的迭代次序(有序)
非线程安全
允许null
初始容量和负载因子都是自己输入
accessorder:表示的是存取顺序,true表示访问模式,false表示插入模式,默认是false
插入模式:按照插入的顺序排放,始终不变
访问模式:在访问某个节点后,会将此节点放到链表的后边去
Properties:
Properties类表示一组持久的属性,Properties可以保存到流中或从流中加载,属性列表的每个键及其对应的值都是一个字符串
Set接口:
Set描述的是一种比较简单的集合
Set可以存储的是一组唯一、无序的元素
Set常用的实现类有TreeSet和HashSet
HashSet:
查找效率高
集合内的元素是无序排列的
HashSet类是非线程安全的
允许存储null
HashSet类不存在get()方法,所以Set接口无法使用普通for循环进行遍历,使用for-each和Iterator接口进行遍历
Collections:
Collections类是Java提供方的一个集合操作工具类
Collections和Collection是不同的,前者是集合的操作类,后者是集合接口
如果提供给它们的集合或类对象为null,则此类的方法都会抛出一个NullPointException异常
使用Comparable接口实现对象之间的比较大小
Comparable队实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序,类的compareTo()方法被称为它的自然比较方法
compareTo()方法返回的是一个负整数,零或正整数,为别表示此对象是小于、等于还是大于指定对象的
Comparator接口比较器:
使用Comparator接口需要重写int compare()方法,当使用了实现Java.util.Comparator接口的比较器后,默认的Comparable比较器就不起作用了
语法: int compare(Object obj1, Object obj2);
binarySearch()队List集合进行查找时必须先排序
泛型:
泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数,使代码可以应用于多种类型,提高代码重用率
参数化类型:参数化类型包含一个类或者接口,以及实际的类型参数列表
类型变量:是一种非限定行标识符,用来指定类,接口或者方法的类型
泛型的定义:
①类型
②类型
③类型<> 对象 = new 类型
第③中定义了和没定义泛型区别不大,使用第一种或者第二种定义泛型
泛型作为容器时没有意义,只能存null
泛型作为参数列表才有意义
学习心得:
今天把集合学习完了,说实话,已经完全搞混淆了,今明两天把集合的知识梳理总结一下,以便于理解集合,集合这一块的知识体系有点庞大,并且需要搞清楚那些类之间的关系还有实现了哪些接口,有些是类似的,但是还是有很多是有区别的,希望早点能够搞懂他们里面的那些方法的原理吧,这样才能更好的去理解记忆集合这里面的知识。
评论留言