List(接口)
实现类:
ArrayList , linkedList 和 Vector
ArrayList 一些方法代码举例:
List list =new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 使用list中添加方法 add(int index, Object obj)
// 添加的角标 就是后面元素所在的位置 不能越界
list.add(4, "x");
System.out.println(list);
// 通过角标获取对应的元素
Object object = list.get(4);
System.out.println(object);
// 通过get方法进行遍历
// for (int i = 0; i < list.size(); i++) {
// Object object1 = list.get(i);
// System.out.println(object1);
// }
// set方法 不要越界
list.set(1, "z");
System.out.println(list);
// 根据角标删除 remove
//返回的是被删除的元素
Object remove = list.remove(3);
System.out.println(remove);
System.out.println(list);
List li =new ArrayList();
li.add(111);// 自动装箱
li.add(222);
li.add(333);
// 删除 111 元素
//list.remove(0);
li.remove((Integer)111); //系统不会自动装箱 就按数字传入方法 所有按角标删除的方法调用的 所以越界 Integer.valueOf(i) 如果要使用按元素删除需要手动装箱
System.out.println(li);
在昨天的博客中提到了使用迭代器(Iterator)遍历数组 上面ArrayList中也提供了get方法 也可利用For循环进行遍历. 那么问题来了,如果我想在集合中添加一串字符应该如何实现呢?使用迭代器遍历添加?
List list =new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 添加完4个元素 集合长度是4
// 如果使用迭代器遍历 那么长度必须是固定的 长度不能变
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String string = list.toString();
if (iterator.next().equals("b")) {
// 这时发生的异常 ConcurrentModificationException
// 并发修改异常
// add 相当于修改集合长度
// 注意:在迭代器遍历的时候 不要直接使用集合做操作
list.add("oh");
}
}System.out.println(list);
分析好问题 我们该如何解决呢?
List list =new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 取出迭代器
ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()) {
if (listIterator.next().equals("b")) {
listIterator.add("Oh~yes");
}
}System.out.println(list);
// 注意! 在迭代器中 进行对集合的添加或删除 要使用 迭代器的方法 不能直接使用集合来操作
vector类(现被arrayList 取代)
Vector vector = new Vector();
// 添加元素
vector.addElement("a");
vector.addElement("b");
vector.addElement("c");
vector.addElement("d");
System.out.println(vector);
// 迭代器遍历 获取 Vector中的迭代器
Enumeration elements = vector.elements();
while (elements.hasMoreElements()) {
System.out.println(elements.nextElement());
}
例题 1
/*
* 创建一个集合 添加a,a,a,b,b,b,c,c,c
* 去除重复
*/
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");
ArrayList arrayList2 = new ArrayList();
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
if (!arrayList2.contains(next)) {
arrayList2.add(next);
}
}System.out.println(arrayList2);
例题 2
/*
* 创建一个集合 添加学生信息
* 去除重复
* 根据上一题思路 应用到这题中 打印确失败了 这是为什么呢?
*/
ArrayList list = new ArrayList();
list.add(new Student("james", 18));
list.add(new Student("james", 18));
list.add(new Student("TOM", 19));
list.add(new Student("TOM", 19));
list.add(new Student("Jellry", 18));
list.add(new Student("Jellry", 18));
ArrayList list1 = new ArrayList();
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Student student = (Student)next;
if (!list1.contains(student)) {
list1.add(student);
}
}
for (Object object : list1) {
Student student = (Student)object;
System.out.println(student);
}
打开arrayList中的 contains方法我们发现 它们比较的是地址而非字符(调用equals方法) 因此我们在创建的时候其实创建了六种不一样的地址 系统认为我们比较的元素都不一样所以将所有的元素统统添加到list1集合中 因此 我们要在student类中重写equals方法
@Override
public boolean equals(Object obj) {
Student student = (Student)obj;
return this.name.equals(student.getName()) && this.age == student.getAge();
}
输出:Student [name=james, age=18]
Student [name=TOM, age=19]
Student [name=Jellry, age=18]
栈和队列
栈结构特点: 先入后出
队列: 先进先出
模拟栈结构 使用linkedList
LinkedList list = new LinkedList();
list.addLast("a");
list.addLast("b");
list.addLast("c");
list.addLast("d");
// 模拟出栈
while (!list.isEmpty()) {
list.removeLast();
}
System.out.println(list);
}
那么arrayList 和 linkedList 有什么区别呢?
ArraryList 数组实现
数组实现特点: 查询快 增删慢
查询:直接使用角标查询
增删:要把添加的元素的位置 后面的元素全部移动一位
linkedList: 链表实现
链表特点:查看慢 增删快
查询:先判断离头近还是尾近 然后从头或尾 一个一个查找 找到为止
增删:将要插入的元素地址保存 后面的元素 不用进行任何的改动