Java集合框架

William
2021-08-02 / 0 评论 / 3 阅读 / 正在检测是否收录...

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的区别?

  • ArraylistList 的主要实现类,底层使用的是 Object[ ] 存储,适用于频繁的查找工作,线程不安全
  • VectorList 的古老实现类,底层使用的是 Object[ ] 存储,线程是安全的

Arraylist 与 LinkedList 区别?

  • 是否保证线程安全ArrayListLinkedList 都是不同步的,也就是不保证线程安全;
  • 关于底层数据结构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

评论 (0)

取消