List接口与实现类
List子接口
-
特点:有序、有下标、元素可以重复。
-
方法:
- void add(int index,Object o) // 在index位置插入对象o。
- boolean addAll(int index,Collection c) // 将一个集合中的元素添加到此集合中的index位置。
- Object get(int index) // 返回集合中指定位置的元素。
- List subList(int fromIndex, int toIndex) // 返回fromIndex和toIndex之间的集合元素。
-
实例:
public class Listdemo01 { public static void main(String[] args) { // 先创建集合对象 List li = new ArrayList(); // 添加元素 System.out.println("---------添加---------"); li.add("苹果"); li.add("小米"); // 可以给添加的值指定下标位置 li.add(0,"华为"); System.out.println("元素个数:"+li.size()); System.out.println(li.toString()); // 删除元素 可以根据值删除 也可以根据下标删除 // li.remove("小米"); // li.remove(0); // System.out.println("元素个数:"+li.size()); // System.out.println(li.toString()); // 遍历 // 使用for遍历 System.out.println("---------使用for遍历---------"); for (int i = 0; i < li.size(); i++) { System.out.println(li.get(i)); } // 使用增强for System.out.println("---------使用增强for遍历---------"); for (Object o : li){ System.out.println(o); } // 使用迭代器 Iterator it = li.iterator(); System.out.println("---------使用迭代器遍历---------"); while (it.hasNext()){ System.out.println(it.next()); } // 使用列表迭代器,和Iterator的区别,ListIterator可以向前或向后遍历、添加、删除、修改元素。 ListIterator lit = li.listIterator(); System.out.println("---------使用迭代器从前往后遍历---------"); while (lit.hasNext()){ System.out.print(lit.nextIndex());// 遍历下标 System.out.println(lit.next());// 遍历值 } System.out.println("---------使用迭代器从后往前遍历---------"); while(lit.hasPrevious()){ System.out.println(lit.previousIndex()+":"+lit.previous()); } // 判断 System.out.println("---------判断---------"); System.out.println(li.contains("小米")); System.out.println(li.isEmpty()); // 获取位置 System.out.println("---------获取值位置(下标)---------"); System.out.println(li.indexOf("华为")); } }
-
实例2:
// 创建集合 List list = new Arraylist(); // 添加数字数据(自动装箱) list.add(20); list.add(30); list.add(40); list.add(50); list.add(60); System.out.println("元素个数:"+list.size()); System.out.println(list.toString()); // 删除操作 // list.remove(0); // 根据下标 list.remove((Object)20); System.out.println("删除元素:"+list.size()); System.out.println(list.toString()); // subList 返回子集合 含头不含尾 list.subList(1,3); System.out.println(list.size()); System.out.println(list.toString());
-
ArrayList【重点】:
- 数组结构实现,查询快、增删慢;
- JDK1.2版本,运行效率快、线程不安全。
-
Vector:
- 数组结构实现,查询快、增删慢;
- JDK1.0 版本,运行效率慢、线程安全。
-
LinkedList:
- 链表结构实现,增删快,查询慢。
ArrayList的使用
-
存储结构:数组,查找遍历速度快,增删速度慢
-
实例:
// 创建集合 ArrayList arrayList = new ArrayList(); // 添加元素 Student s1 = new Student("周杰伦",41); Student s2 = new Student("薛之谦",37); Student s3 = new Student("林俊杰",39); arrayList.add(s1); arrayList.add(s2); arrayList.add(s3); System.out.println("元素个数:"+arrayList.size()); System.out.println(arrayList.toString()); // 删除元素 arrayList.remove(s3); System.out.println("删除之后"+arrayList.size()); // 遍历元素【重点】 // 3.1使用迭代器 System.out.println("-----3.1使用迭代器-----"); Iterator it = arrayList.iterator(); while(it.hasNext()){ Student s = (Student)it.next(); System.out.println(s.toString()); } // 3.2使用列表迭代器 ListIterator lit = arrayList.listIterator(); System.out.println("-----3.2使用列表迭代器-----"); while(lit.hasNext()){ Student s = (Student)it.next(); System.out.println(s.toString()); } System.out.println("-----3.2使用列表迭代器逆序-----"); while(lit.hasPrevious()){ Student s = (Student)it.previous(); System.out.println(s.toString()); } // 判断 System.out.println(arrayList.contains(new Student("薛之谦",37))); System.out.println(arrayList.isEmpty()); // 查找 System.out.println(arrayList.indexOf(new Student("薛之谦",37))); // 删除元素 arrayList.remove(new Student("林俊杰",39)); System.out.println("删除之后"+arrayList.size());
// 我们重写equals判断,使arrayList.remove(new Student("林俊杰",39));比较的是里面的值而不是地址。 @Override public boolean equals(Object obj){ // 判断是不是同一个对象 if(this == obj){ return true; } // 判断是否为空 if(obj == null){ return false; } // 判断是否是Student类型 if(obj instanceof Student){ Student s = (Student)obj; // 比较属性 if(this.name.equals(s.getName()) && this.age==s.getAge()){ return true; } } // 不满足条件返回false return false; }
List实现类
-
ArrayList【重点】:
- 数组结构实现,查询快、增删慢;
- JDK1.2版本,运行效率快、线程不安全。
-
Vector:
- 数组结构实现,查询快、增删慢;
- JDK1.0版本,运行效率慢、线程安全。
-
实例:
public class Vectortest { public static void main(String[] args) { // 创建集合 Vector vector = new Vector(); // 添加元素 System.out.println("------添加------"); vector.add("草莓"); vector.add("芒果"); vector.add("西瓜"); System.out.println("元素个数:"+vector.size()); // 删除 // vector.remove(0); // 可以根据下标删除 // vector.remove("西瓜"); // 也可以根据值删除 // .clear() 删除全部 System.out.println(vector.toString()); // 遍历 System.out.println("------使用枚举器------"); Enumeration en = vector.elements(); while(en.hasMoreElements()){ String o = (String)en.nextElement(); System.out.println(o); } // 判断 System.out.println("------判断------"); System.out.println("判断西瓜在不在集合里:"+vector.contains("西瓜")); System.out.println("判断集合是否为空:"+vector.isEmpty()); } }
-
LinkedList:
-
链表结构实现,增删快,查询慢。可重复
- 实例:
public class LinkedListTest { public static void main(String[] args) { // 创建集合 LinkedList linkedList = new LinkedList(); Student s1 = new Student("刘德华",20); Student s2 = new Student("郭富城",22); Student s3 = new Student("梁朝伟",18); linkedList.add(s1); linkedList.add(s2); linkedList.add(s3); System.out.println("元素个数:"+linkedList.size()); System.out.println(linkedList.toString()); // 删除元素 .clear()全部删除 // linkedList.remove(new Student("刘德华",20)); // System.out.println("删除之后:"+linkedList.size()); // System.out.println(linkedList.toString()); // 遍历 System.out.println("------for------"); for (int i = 0; i < linkedList.size(); i++) { System.out.println(linkedList.get(i)); } System.out.println("------增强for------"); for(Object object : linkedList){ Student s = (Student)object; System.out.println(s.toString()); } System.out.println("------迭代器------"); Iterator it = linkedList.iterator(); while(it.hasNext()){ Student s = (Student)it.next(); System.out.println(s.toString()); } ListIterator lit = linkedList.listIterator(); while(lit.hasNext()){ Student s = (Student)lit.next(); System.out.println(s.toString()); } // 判断 System.out.println("------判断------"); System.out.println(linkedList.contains(s1)); System.out.println(linkedList.isEmpty()); // 获取下标 System.out.println("------获取下标------"); System.out.println(linkedList.indexOf(s1)); } }