list
List 接口
List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引
(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。
List 接口实例存储的是有序的,可以重复的元素。
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。
查找元素效率高,插入删除效率低,因为会引起其他元素位置改变
<实现类有ArrayList,LinkedList,Vector> 。
ArrayList 和 LinkedList 的区别
ArrayList:数组实现
数组实现特点:查询快,增删慢(参照 LinkedList)
查询:直接使用角标查询
增删:需要把要添加的元素的位置,后面的元素全部移动一位
LinkedList:链表实现
链表实现特点:查询慢,增删快
查询:判断离头近还是尾近,然后从头或尾,一个个查找,找到为止
增删:将要插入/移除的元素的地址保存/删除,后面的元素不用进行任何操作
数组查询和链表查询的区别
思考:
什么时候使用 ArrayList?
查询多的时候
什么时候使用 LinkedList?
增删多的时候
工作中一般使用什么呢?
ArrayList
list 接口中常用方法
private static void demo() {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 使用 list 中的添加方法 add(int index, Object object)
// 添加的角标就是后面元素所在的位置,不能越界
list.add(4, "x");
System.out.println(list);
// 通过角标获取对应的元素
Object object = list.get(2);
System.out.println(object);
// 通过 get 方法进行遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// set 方法(不要越界)
list.set(0, "z");
System.out.println(list);
// 根据角标删除(Object remove = list.remove(3);中 remove 返回的是被删除的元素, list 剩下没被删除的元素)
list.remove(3);
System.out.println(list);
// 注意:删除方法需要注意的
List list1 = new ArrayList();
list1.add(111);// 进行自动装箱
list1.add(222);
list1.add(333);
// 删除111元素
list1.remove(0);// 第一种方法
// 这里删除的时候,系统不会进行自动装箱,按照角标传入的方法
// 所以调用的是按角标删除的方法,所以越界
// list.remove(111);// 错误方法
// 如果非要使用按元素删除,需要手动装箱
list1.remove(Integer.valueOf(111));// 第二种方法
System.out.println(list1);
}
发生并发修改异常
private static void demo() {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 添加完四个元素,这时集合长度为4
// 使用迭代器遍历时,长度必须是固定的,不可改变
// 获取集合迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
if (iterator.next().equals("b")) {
// 发生异常 ConcurrentModificationException(并发修改异常)
// 注意:在迭代器遍历的时候,不要直接使用集合做操作
list.add("oh-yes");// 相当于修改集合长度
// 如何解决
// 直接把要添加的元素让迭代器添加
}
}
System.out.println(list);
}
解决并发修改异常
思路:让迭代器去完成添加元素
private static void demo() {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 取出 list 特有的迭代器
ListIterator listIterator = list.listIterator();
while(listIterator.hasNext()) {
if (listIterator.next().equals("b")) {
// 让迭代器向集合中添加元素
listIterator.add("Oh~Yes");
}
}
System.out.println(list);
// 注意:在迭代器中,进行对集合的添加或删除,要使用迭代器中的方法,不能直接使用集合去操作
}
public static void demo() {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
ListIterator listIterator = list.listIterator();
// 正向
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
listIterator = list.listIterator(list.size());
// 逆向
// hasPrevious 判断前一个元素有没有
while (listIterator.hasPrevious()) {
// 获取前一个元素
System.out.println(listIterator.previous());
}
}
Vector(使用数组来实现的,已经被 ArrayList 替代)
private static void fun5() {
// 创建一个 vector 集合,迭代器遍历
Vector vector = new Vector();
// 添加元素
vector.addElement("a");
vector.addElement("b");
vector.addElement("c");
vector.addElement("d");
System.out.println(vector);
// 迭代器遍历
Enumeration elements = vector.elements();
while (elements.hasMoreElements()) {
// 输出元素
System.out.println(elements.nextElement());
}
}
LinkedList
private static void fun6() {
LinkedList linkedList = new LinkedList();
// 使用 addFirst 方法添加
// linkedList.addFirst("a");
// linkedList.addFirst("b");
// linkedList.addFirst("c");
// linkedList.addFirst("d");
// 使用 addLast 方法添加
linkedList.addLast("a");
linkedList.addLast("b");
linkedList.addLast("c");
linkedList.addLast("d");
System.out.println(linkedList);
// 获取头尾元素
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
}
队列和栈
队列和栈
队列的特点:先进先出
栈的特点:先进后出
使用 LinkedList 模拟栈结构
private static void fun1() {
LinkedList linkedList = new LinkedList();
// 添加元素A,B,C,D模拟进栈
linkedList.addLast("A");
linkedList.addLast("B");
linkedList.addLast("C");
linkedList.addLast("D");
System.out.println(linkedList);
// 模拟出栈
// 每次删之前查看一下这个集合是否为空的
while (!linkedList.isEmpty()) {
linkedList.removeLast();
System.out.println(linkedList);
}
}
ArrayList 去重
public static void fun2() {
ArrayList arrayList = new ArrayList();
arrayList.add("a");
arrayList.add("a");
arrayList.add("a");
arrayList.add("b");
arrayList.add("b");
arrayList.add("b");
arrayList.add("c");
arrayList.add("c");
arrayList.add("c");
System.out.println(arrayList);
// 创建个新数组
ArrayList arrayList1 = new ArrayList();
// 遍历原数组,取出每一个元素,比对是否存在于新数组中,不存在则放入,存在就放弃
// 原数组迭代器
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()) {
// 判断原数组中元素是否存在于新数组中
// 不存在就添加入新数组中,否则放弃
Object next = iterator.next();// 不能调用两次 next() 方法
if (!arrayList1.contains(next)) {
// 将元素添加到新数组中
arrayList1.add(next);
}
}
System.out.println(arrayList1);
}
去除重复的学生
public static void fun3() {
ArrayList arrayList = new ArrayList();
// 六个学生的地址都不一样,所以不是同一个对象
arrayList.add(new Student("鹏鹏", 18));
arrayList.add(new Student("鹏鹏", 18));
arrayList.add(new Student("水水", 17));
arrayList.add(new Student("水水", 17));
arrayList.add(new Student("茜茜", 16));
arrayList.add(new Student("茜茜", 16));
Iterator iterator = arrayList.iterator();
ArrayList arrayList2 = new ArrayList();
while (iterator.hasNext()) {
Object next = iterator.next();
Student student = (Student)next;
if (!arrayList2.contains(student)) {
arrayList2.add(student);
}
}
for (Object object : arrayList2) {
Student student = (Student)object;
System.out.println(student);
}
}
public class Student {
private String name;// 姓名
private int age;// 年龄
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "[姓名:" + name + ", 年龄:" + age + "]";
}
// 重写 equals 方法
@Override
public boolean equals(Object obj) {
// 比较的是地址
// return super.equals(obj);
// 现在需求比对姓名和年龄
Student student = (Student)obj;
return this.name.equals(student.getName()) && this.age == student.getAge();
}
}
http://blog.csdn.net/huzongnan/article/list