数组和集合的特点及转换
int[] a = new int[10]; 长度固定 ArrayList list = new ArrayList();
int b[] = new int[10]; ArrayList list1 = new ArrayList(10); //可以不指定长度
int[] c = {1,2,3}; 数据类型相同 ArrayList<Integer> list2 = new ArrayList<>();//不使用泛型可添加不同的数据类型
- 数组大小固定,集合长度可变;
- 同一数组只能存放类型一样的数据;集合可存储不同的数据类型。
数组和list的转换
数组转list使用 Arrays.asList(数组)
int[] arr = new int[10]; //长度固定
List<int[]> list = Arrays.asList(arr);//当数组转换成list之后,不能做add,remove等操作
//list.add(12); //会报错 要操作添加,删除等操作需要
ArrayList arraylist = new ArrayList(list);
arraylist.add(2);
list转数组,使用 list.toArray()
List<String> list = new ArrayList<String>();
list.add("123");
list.add("zking");
String[] str = list.toArray(new String[list.size()]);
for (int i=0 ;i<str.length ;i++){
System.err.println(str[i]);
}
List集合有序(插入和输出顺序一致)可重复,可以多个插入null元素
1.ArrayList底层数据结构是数组 查询快 增删慢 线程不安全 效率高 默认长度是10 超过长度时进行扩容,原容器的0.5倍
2.Vector 底层数据结构是数组 查询快 增删慢 线程安全 效率低 默认长度是10 超过长度时进行扩容,原容器的1倍
3.LinkedList底层数据结构是链表(双向链表) 查询慢 增删快 线程不安全 效率高
Set 无序不重复,只允许一个null元素
1.HashSet 按照哈希算法来存取集合中的对象 存取快 默认长度是16 超过长度的0.75倍时进行扩容,原容器的1倍
2.TreeSet (集合排序)中存储的类型必须是一致的,自然排序
2.LinkedHashSet:输出顺序和插入的顺序一致
(当程序向HashSet中 add()的一个对象的时候, 先用hashCode方法计算出该对象的哈希码 哈希码不一致 添加 哈希码一致
不添加 相同对象不添加 然后用equals判断对象的属性是否一致 比较结果为false就添加 true就不添加 不同对象添加)
Map 键唯一,值不唯一(键允许一个null,值可多个)
1.HashMap 允许存在一个为null的key,多个为null的value,线程不同步,效率高 默认长度16超过长度的0.75倍时进行扩 容,原容器的1倍
2.HashTable key和value都不允许为null,线程同步,效率低,默认长度16超过长度的0.75倍时进行扩容,原容器的1倍+1
3.TreeMap 不允许null,线程不同步的,可以用于给Map集合中的键进行排序和Set很像其实 Set底层就是用了Map集合
(需要得到一个有序的结果用T reeMap)