java集合及特点

java中常见的数据结构,主要分为Collection和Map两种主要接口,程序中的数据结构是继承这些接口的数据结构类。

Collection接口

  1. List 接口继承:ArrayList、 Vector、 LinkedList等实现;

  2. Set 接口继承:HashSet、LinkedHashSet、TreeSet等实现。

Map接口: HashMap、SortedMap继承,LinkedHashMap、TreeMap等实现。

几个常用的类及其特点:

ArrayList

  • 数据结构:ArrayList底层使用的是Object数组;
  • 存储结构:物理存储单元上连续的存储结构;
  • 线程是否安全:线程不安全的;ArrayList是非同步的,方法没有加锁;
  • 特点:方便查找,但是新增和删除操作的时候,是要有移动位置的操作,所以ArrayList适用于存储,查询操作比较频繁的数据存储。

LinkedList

  • 数据结构:LinkedList底层使用的是双向循环链表数据结构;
  • 存储方式:物理存储单元上非连续、非顺序的存储结构;
  • 线程是否安全:线程不安全的;
  • 特点:存储每一个元素消耗的空间要比ArrayList大,并且由于它的存储结构,导致他的查询不是很方便,需要去遍历每一个节点,然后查找该节点后继节点,不适合存储需要大量查询操作的数据存储,但插入比ArrayList方便,不需要进行换位操作,只需要改变指针前驱和后继,增删操作很快,不耗费多余资源 。

List总结

  • 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ]
  • 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]
  • 所有的List中可以有null元素,例如[ tom,null,1 ]
  • 基于Array的List(Vector,ArrayList)适合查询,而LinkedList 适合添加,删除操作

Vector

  • 数据结构:Vector底层使用的是Object数组;
  • 存储结构:物理存储单元上连续的存储结构;
  • 线程是否安全:Vector是线程安全的,Vector类的方法都是有锁的;
  • 特点:Vector是线程安全的,可以由多个线程访问一个Vector对象。但当一个线程访问的话,保证线程安全会消耗一定的资源,因此一个线程访问就无需考虑是否线程安全的问题,建议使用ArrayList。

TreeSet

  • 数据结构:底层数据结构是二叉树;
  • 线程是否安全:不保证线程安全的;
  • 特点:有序的,并且没有重复元素。可以指定一个顺序,排序后按升序排列元素 。

HashSet

  • 数据结构:链表和红黑树(jdk1.8以后);
  • 线程是否安全:不保证线程安全的;
  • 特点:元素没有顺序(因为底层用的是HashMap,HashMap本身中的元素度没有顺序)、元素不能重复,不可随机访问包含的元素 ,只能用Iterator实现单向遍历,多次迭代访问,元素的顺序可能不同 。

Set总结

  • Set实现的基础是Map(HashMap);
  • Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象。

HashMap

  • 数据结构:链表和红黑树(jdk1.8以后);
  • 线程是否安全:非线程安全;
  • 特点:Null可以做主键,但只能有一个,可以有多个Value为Null;适用于在Map中插入、删除和定位元素。

TreeMap

  • 数据结构:树;
  • 线程是否安全:非线程安全;
  • 特点:有序的,适用于按自然顺序或自定义顺序遍历键(key)。

LinkedHashMap

  • 数据结构:HashMap+LinkedList;
  • 线程是否安全:非线程安全;
  • 特点:有序、Key和Value都允许空、Key重复会覆盖、Value允许重复。

java 中, 什么查询最快?

根据数组下标, 查找数组的元素, 是java中天下第一快的操作!

数组和ArrayList 的区别:

  • 数组可以存储数据类型一致的一组数据, 没有提供操作算法, 使用数组需要自行编写算法, 使用数组编码的专用算法,
    性能最佳!而ArrayList也可以存储一组数据, 其内部也是数组, 还提供操作算法, 使用方便. 通用算法好处是使用方便,
    算法是经过检验的, 非常可靠。但是如果期望高性能, 使用数组, 如期望高开发效率, 使用Arraylist。

Vector、ArrayList和LinkedList使用

大多数情况下,从性能上来说ArrayList最好,但是当集合内的元素需要频繁插入、删除时LinkedList会有比较好的表现,但是它们三个性能都比不上数组。所以:

  • 如果能用数组的时候(元素类型固定,数组长度固定),请尽量使用数组来代替List;
  • 如果没有频繁的删除插入操作,又不用考虑多线程问题,优先选择ArrayList;
  • 如果在多线程条件下使用,可以考虑Vector;
  • 如果需要频繁地删除插入,LinkedList就有了用武之地;
  • 如果你什么都不知道,用ArrayList没错。