1.Java中的数组
1.数组在内存中是连续存储的,索引速度非常快,赋值和修改元素比较简单;
2.声明数组的时候,必须制定数组的长度,数组的长度过长,会内存浪费,过短会数据溢出的错误;
3.数组只允许存放一种数据类型
2.List
List是接口,与set一样继承子集合类Colllection接口,提供了按索引访问的方式。有两个实现分别是ArrayList和LinkedList
1>ArrayList
可以看做容量自动增长的数组,底层是使用数组来实现的,使用不带参数的构造方法构造一个List时,默认会在底层生成一个长度是10的数组;
List<String> list = new ArrayList<>();
如果后续元素继续增长,超过大小之后,ArrayList会在底层生成一个新的数组,大小是=原来大小*1.5+1,然后将原数组的内容复制进去;当新的数组长度不够时,重复该过程;
2>对于ArrayList的删除操作,需要被删除的元素向前移动,代价比较大
3>集合当中只能放对象的引用,无法放置原生数据类型,所以必须使用原生数据的包装类才可以加到集合当中;下面的代码就是错误的,无法放置原生基本类型到集合中
List<int> list1 = new ArrayList<>();
4>LinkedList:是一个双向链表,添加和删除元素时比ArrayList性能更好,但是在索引数据的时候,若于ArrayList,因为需要从链表头开始往后一个一个查找;Array获取数据的时间复杂度是o(1),LinkedList索引数据的时间复杂度为o(N);另外linkedList需要更多的内存,因为ArrayList每个节点存储的是实际数据和前后节点的位置;
3.两者互相转换
1>数组转换为List
String[] array = new String[]{"aa", "bb", "cc"}; List<String> strings = Arrays.asList(array);
使用Arrays.asList来转换;
2>List转换为数组
List<String> strings = Arrays.asList(array); String[] objects = (String[]) strings.toArray();
使用数组.toArray()来转换