Java标准库自带的java.util包提供了集合类:Collection,它是除Map外所有其他集合类的根接口。
注意,所有集合只能存引用类型。
继承体系结构:
Collection
List
ArrayList
Vector
LinkedList
Set
HashSet
TreeSet
List和Set区别在于,前者有序按索引排列,后者保证没有重复元素的集合。
Java集合的设计有几个特点:一是实现了接口和实现类相分离,例如,有序表的接口是List,具体的实现类有ArrayList,LinkedList等,二是支持泛型,我们可以限制在一个集合中只能放入同一种数据类型的元素。
List<String> list = new ArrayList<>(); // 只能放入String类型Java访问集合总是通过统一的方式——迭代器(Iterator)来实现,这个后面再说。
有序集合(也称为序列 )。
几个主要的接口方法:
在末尾添加一个元素:boolean add(E e)在指定索引添加一个元素:boolean add(int index, E e)删除指定索引的元素:int remove(int index)删除某个元素:int remove(Object e)获取指定索引的元素:E get(int index)获取链表大小(包含元素的个数):int size()对比ArrayList和LinkedList
ArrayListLinkedList获取指定元素速度很快需要从头开始查找元素添加元素到末尾速度很快速度很快在指定位置添加/删除需要移动元素不需要移动元素内存占用少较大通常情况下,我们总是优先使用ArrayList。
arraylist linkedlist vector区别参考
https://blog.csdn.net/zhangqiluGrubby/article/details/72870493
除了使用ArrayList和LinkedList,我们还可以通过List接口提供的of()方法,根据给定元素快速创建List:
List<Integer> list = List.of(1, 2, 5);但是List.of()方法不接受null值,如果传入null,会抛出NullPointerException异常。
Iterator本身也是一个对象,但它是由List的实例调用iterator()方法的时候创建的。Iterator对象知道如何遍历一个List,并且不同的List类型,返回的Iterator对象实现也是不同的,但总是具有最高的访问效率。
Iterator对象有两个方法:boolean hasNext()判断是否有下一个元素,E next()返回下一个元素。
public class Main { public static void main(String[] args) { List<String> list = List.of("apple", "pear", "banana"); for (Iterator<String> it = list.iterator(); it.hasNext(); ) { String s = it.next(); System.out.println(s); } } }Java的for each循环本身就可以帮我们使用Iterator遍历
public class Main { public static void main(String[] args) { List<String> list = List.of("apple", "pear", "banana"); for (String s : list) { System.out.println(s); } } }把List变为Array有三种方法,第一种是调用toArray()方法直接返回一个Object[]数组:
public class Main { public static void main(String[] args) { List<String> list = List.of("apple", "pear", "banana"); String[] array = list.toArray(); for (String s : array) { System.out.println(s); } } }这种方法会丢失类型信息,所以实际应用很少。
第二种方式是给toArray(T[])传入一个类型相同的Array,List内部自动把元素复制到传入的Array中:
public class Main { public static void main(String[] args) { List<Integer> list = List.of(12, 34, 56); Integer[] array = list.toArray(new Integer[3]); for (Integer n : array) { System.out.println(n); } } }注意到这个toArray(T[])方法的泛型参数<T>并不是List接口定义的泛型参数<E>,所以,我们实际上可以传入其他类型的数组,例如我们传入Number类型的数组,返回的仍然是Number类型:
public class Main { public static void main(String[] args) { List<Integer> list = List.of(12, 34, 56); Number[] array = list.toArray(new Number[3]); for (Number n : array) { System.out.println(n); } } }但是,如果我们传入类型不匹配的数组,例如,String[]类型的数组,由于List的元素是Integer,所以无法放入String数组,这个方法会抛出ArrayStoreException。
如果传入的数组不够大,那么List内部会创建一个新的刚好够大的数组,填充后返回;如果传入的数组比List元素还要多,那么填充完元素后,剩下的数组元素一律填充null。
实际上,最常用的是传入一个“恰好”大小的数组:
Integer[] array = list.toArray(new Integer[list.size()]);除了使用ArrayList和LinkedList,我们还可以通过List接口提供的of()方法,根据给定元素快速创建List:
List<Integer> list = List.of(1, 2, 5);但是List.of()方法不接受null值,如果传入null,会抛出NullPointerException异常。
把Array变为List就简单多了,通过List.of(T...)方法最简单:
Integer[] array = { 1, 2, 3 }; List<Integer> list = List.of(array);对于JDK 11之前的版本,可以使用Arrays.asList(T...)方法把数组转换成List。
他们的区别参考
https://www.cnblogs.com/wangjian1990/p/10039167.html
注意,返回的List不一定就是ArrayList或者LinkedList,因为List只是一个接口,如果我们调用List.of(),它返回的是一个只读List