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 类型();

​ ②类型 对象 = new 类型<>();

​ ③类型<> 对象 = new 类型();

​ 第③中定义了和没定义泛型区别不大,使用第一种或者第二种定义泛型

​ 泛型作为容器时没有意义,只能存null

​ 泛型作为参数列表才有意义

学习心得:

​ 今天把集合学习完了,说实话,已经完全搞混淆了,今明两天把集合的知识梳理总结一下,以便于理解集合,集合这一块的知识体系有点庞大,并且需要搞清楚那些类之间的关系还有实现了哪些接口,有些是类似的,但是还是有很多是有区别的,希望早点能够搞懂他们里面的那些方法的原理吧,这样才能更好的去理解记忆集合这里面的知识。

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1