Java集合类型有三种:set(集)、list(列表)和map(映射),而List集合是很常用的一种集合类型,
我们的常用用法:
List
首先要清楚List是个接口,是Collection接口的子接口,拥有Collection所有方法外,还有一些对索引操作的方法。List集合是一个元素有序(每个元素都有对应的顺序索引,第一个元素索引为0)、且可重复的集合。
具体概念就不延申了。
ArrayList是个什么东西?
ArrayList是list的实现类,看下其构造函数:
transient Object[] elementData; // non-private to simplify nested class access
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
可以看到:ArrayList的最底层实现其实就是一个数组,而在Java中数组的长度是固定的,但是我们实际使用ArrayList的时候不难发现,无论你怎么往这个集合中添加元素,他都不会显示越界,这是为什么呢?可以查看下add方法:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
具体可以看下ensureCapacityInternal方法里面,最终可以跟踪到grow()方法,具体逻辑不展开了,总归就是ArrayList这个数组可以扩容,ArrayList相当于动态数组。
ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。
他又是个啥子东西?
与ArrayList一样都是list接口的实现类,继承自AbstractSequentialList,而AbstractSequentialList继承自AbstractList,所以跟ArrayList会有共性。
LinkedList 内部使用的双向链表来存储元素。
个人觉得,不知道用哪个,除非有队列使用需求,其它一律使用ArrayList即可。
最常见的就是new ArrayList了:
List stringList = new ArrayList<>();
stringList.add("apple");
stringList.add("watermelon");
stringList.add("banana");
这种肯定没毛病,但是比较繁琐,接下来列举几种快速构建的方式:
Collections是集合框架的工具类,里面包含一些对集合的排序,搜索以及序列化的操作,内部的方法都是静态的,没有构造方法,不能实例化,要调用内部方法直接用类名调用(Collections.sort),并且Collections类服务于Collection框架。
List abc = Collections.singletonList("abc");
Arrays位于java.util包下(Arrays是一个操作数组的工具类),该类里的方法都是静态方法可以通过Arrays.方法名()直接调用,其实跟Collections差不多,都是工具类。
List stringList = Arrays.asList("abc", "def");
Guava是来自Google的Java库合集,包含了很多新的集合类型(比如multinmap和mulitset),不可变集合,图库和并发、I/O、哈希、缓存、原始类型等类型的工具集。
List immutableList = ImmutableList.of("english", "chinese");
ImmutableList list = ImmutableList.of("english", "chinese");
长度为0:
public static ImmutableList of() {
return (ImmutableList) EMPTY;
}
长度为1:
构造了一个SingletonImmutableList,继承于ImmutableList,单元素,final修饰不可变。
其它情况:
构造了一个RegularImmutableList,继承于ImmutableList,final修饰不可变,不可增删改。