List,Set,Map三者的区别
List
:(对付顺序的好帮手)存储的元素是有序的,可重复的。Set
:(注重独一无二的性质)存储的元素是无序的,不可重复
的Map
:(用key搜索的专家)使用键值对(key-value)存储,key是无序的、不可重复的、value是无序的、可重复的,每个键最多映射到一个值。
如何选用集合?
主要根据集合的特点来选,比如需要根据键值获取元素的值,就选用 Map
接口下的集合,需要排序就选 TreeMap
,不需要排序就选 HashMap
,要保证线程安全就选用 ConcurrentHashMap
如果只是需要存放元素,那么可以选择实现 collection
接口的集合,需要保证元素唯一性时选择 Set 接口的集合比如 TreeSet或HashSet。不需要就选择实现 List 接口的比如 ArrayList 或 LinkedList,然后再根据实现这些接口的集合的特点进行选择。
为什么要选用集合?
当我们需要保存一组类型相同的数据的时候,我们应该用一个容器来保存,这个容器就是数组,但是,使用数组来存放对象有一定的弊端,因为在实际开发中,存储的数据的类型是多样的,于是,就出现了集合。集合也是用来存放多个数据的。
数组的缺点是一旦声明了以后,长度就不可变了;同时,声明数组时确定的数据类型也决定了它存放的数据的数据类型;而且,数组存储的数据时有序的,可重复的,特点单一。但是集合提高了数据存储的灵活性,Java结合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据。
Arraylist与Vector的区别?
Arraylist
是List
的主要实现类,底层使用的是Object[ ]
存储,适用于频繁的查找工作,线程不安全
。Vector
是List
的古老实现类,底层使用的是Object[ ]
存储,线程是安全的
。
Arraylist 与 LinkedList 区别?
- 是否保证线程安全:
ArrayList
和LinkedList
都是不同步的,也就是不保证线程安全; - 关于底层数据结构:
Arraylist
底层使用的是Object
数组,Linkedlist
底层使用的是双向链表(jdk1.6之前是循环,jdk1.7后取消了) 插入和删除是否受元素位置影响
Arraylist
采用数组存储,所以插入和删除元素的时间复杂度都会收到元素位置的影响。比如,增加的时候ArrayList
是默认加到列表尾部的,那这时候复杂度就是O(1)
。但如果是要在指定位置i进行插入或删除的话,那么时间复杂度就是O(n-i)
。因为上述两个操作集合中的第i
个和第i
个元素之后的(n-i)
个元素都要执行向后/向前移动一位的操作。LinkedList
采用链表存储,所以,如果是在头部插入或者删除元素不受元素位置的影响,近似O(1),如果是在指定位置i
插入和删除元素的话,时间复杂度近似O(n)
,因为需要先移动到指定位置再插入。
- 是否支持快速随机访问:
LinkedList
不支持高效的随机元素访问,而ArrayList
支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)
方法) - 内存空间占用:
ArrayList
的空间浪费主要体现在list列表在结尾会预留一定的容量空间,而Linkedlist
的空间花费主要体现在每个元素都要消耗比Arraylist
更多的空间(因为要存放直接后继,直接前驱及数据)
comparable 和 Comparator 的区别
comparable
接口实际上是出自java.lang
包 它有一个compareTo(Object obj)
方法用来排序comparator
接口实际上是出自java.util
包它有一个compare(Object obj1, Object obj2)
方法用来排序
无序性和不可重复性的含义是什么
1、什么是无序性?无序性不等于随机性 ,无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加 ,而是根据数据的哈希值决定的。
2、什么是不可重复性?不可重复性是指添加的元素按照 equals()判断时 ,返回 false,需要同时重写 equals()方法和 HashCode()方法。
将数组转换为ArrayList
Java8的Stream方法(推荐)
Integer[] myarray = {1,2,3};
List myList = Arrays.stream(myarray).collect(Collectors.toList());
// 基本类型也可以实现转换(依赖boxed的装箱操作)
int[] myarray2 = {1,2,3}
List myList = Arrays.stream(myarray2).boxed().collect(Collectors.toList());
评论 (0)