/*
----Collection接口:单列集合,用来存储一个一个的对象
----list接口 :存储有序的,可重复的数据 --》”动态”数组
-----ArrayList:作为list接口得主要实现类,线程不安全,效率高;底层使用Object[] elementData存储
------linkedList对于频繁的插入、删除操作,使用此类比ArrayList高;底层使用双向链表存储
--------vector:作为List接口得古老实现类;线程安全的,效率底
2 ArrayList的源码分析:
2.1 jdk7的情况下:
ArrayList list = new ArrayList();//底层创建了长度是10的object[] 数组elementData
List.add(123);//elementData[0] = new Integer(123);
list.add(11)//如果此次的添加导致底层elementData数组容量不够,则扩容
默认情况下,扩大为原来的1.5倍,同时需要将原有数组中的数据复制到新的数组中
结论:建议开发中使用代参的构造器ArrayList list = new Arraylist(int capacity)
2.2jdk8中ArrayList的变化
Arraylist list = new ArrayList();//底层ObjectData初始化为{},并没有创建长度为10的数组
list.add(123);//第一次调用add()时,底层才创建长度为10的数组,并将数据123添加到elementData[0]
后续的添加扩容操作和jdk7无异
2.3 小结:jdk7中的ArrayList的创建类似于单例的饿汉式,二jdk8中的Arraylist对象的
创建类似于单例的懒汉式,延迟了数组的创建,节省内存。
3. LinkedList的源码分析
LinkedList list = new LinkedList();内部声明了node类型的first和last属性,默认值为ull;
list.add(123);//123封装到node中,创建node对象
其中node定义为:
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
4. vector的源码分析
jdk7和jdk8中通过vector()构造器创建对象时,底层都创建了长度为十的数组。在扩容方面,默认扩容为原来数组的两倍
面试题:ArrayList/LinkedList/vector三者得异同
同:三个类都是实现了LIst接口,存储数据的特点相同:存储有序得、可重复的数据
不同:
*/
//5.list接口中的常用方法
//1.void add(int index,Object ele):在index位置上插入ele元素
//2.boolean addAll(int index,Collection eles):从index位置开始将else中的所有元素添加
//3.Object get(int index):获取指定index位置上的元素
//4.int indexof(Object obj):返回obj在集合中首次出现的位置.如果不存在,返回-1
//5.int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
//6.Object remove(int index):移除指定index位置上的元素,并返回此元素
//7.object set(int index,Object ele):设置指定index位置的元素ele
//8.list subList(int fromIndex,int toIndex):返回从fromIndex到toIndex位置的左闭右开区间的子集合
/*
总结常用方法
增:add(Object obj)
删:remove(int index)/remove(Object obj)
改: set(int index,Object obj)
查:get(int index)
插: add(int index,Object ele)
长度:size()
遍历:(1)iterator迭代器方式
(2)增强for循环
(3)普通循环
*/
public class ListTest {
@Test
public void test1() {
ArrayList list = new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
list.add(new Person("jerry", 20));
list.add(456);
System.out.println(list);
//void add(int index,Object ele):在index位置上插入ele元素
list.add(1, "BB");
System.out.println(list);
//boolean addAll(int index,Collection eles):从index位置开始将else中的所有元素添加
List list1 = Arrays.asList(1, 2, 3);
// list.addAll(list1);
list.add(list1);
System.out.println(list.size());
//Object get(int index):获取指定index位置上的元素
System.out.println(list.get(0));
}
@Test
public void test2() {
ArrayList list = new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
list.add(new Person("jerry", 20));
list.add(456);
//int indexof(Object obj):返回obj在集合中首次出现的位置.如果不存在,返回-1
int index = list.indexOf(457);
System.out.println(index);
//int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
System.out.println(list.lastIndexOf(456));
//Object remove(int index):移除指定index位置上的元素,并返回此元素
Object obj = list.remove(0);
System.out.println(list);
System.out.println(obj);
//object set(int index,Object ele):设置指定index位置的元素ele
list.set(1, 789);
System.out.println(list);
//list subList(int fromIndex,int toIndex):返回从fromIndex到toIndex位置的左闭右开区间的子集合
List subLIst = list.subList(1, 3);
System.out.println(subLIst);
System.out.println(list);
}
@Test
public void test3() {
ArrayList list = new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
list.add(new Person("jerry", 20));
list.add(456);
//方式一:迭代器方式
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("***************");
// 方式二:
for(Object obj:list){
System.out.println(obj);
}
System.out.println("***************");
//方式三:
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
刚回家就开始卷了,强哥!?