java集合之ArrayList和LinkedList
1.区别
1. ArrayList:数组实现
数组实现的特点:查询快 增删慢(参照与LinkdList);
查询:直接使用角标查询
增删:需要把要添加的 元素的位置 后面的元素 全部移动一位
2. LinkedList:链表的实现
链表特点
链表实现:特点增删快 查询慢
查询:判断离头近还是离尾近 然后从头或尾 一个一个查找 找到为止
增删:将要插入的元素的地址保存 后面的元素 不用进行任改动
3. 什么时候使用ArrayList,什么时候使用LinkedList
查询多就使用ArrayList
增删多就使用LinkedList
2.List
2.1 添加元素
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 使用List中的添加方法 add(int index ,Object obj)
list.add(0,"x");//添加的角标 就是后面元素 所在位置 不能越界
System.out.println(list);
运行结果:
[x, a, b, c, d]
注释:
1.使用List中的添加方法 add(int index ,Object obj)
2.添加的角标 就是后面元素 所在位置 不能越界
2.2通过角标获取对应的元素
Object object = list.get(2);
System.out.println(object);
运行结果:
b
2.3通过get进行遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
运行结果:
x
a
b
c
d
2.4set方法 对应位置添加元素
list.set(4, "z");
System.out.println(list);
运行结果:
[x, a, b, c, z]
2.5根据角标删除元素 返回的是被被删除的角标
Object object2 = list.remove(3);
System.out.println(object2);
System.out.println(list);
运行结果:
c
[x, a, b, z]
2.6删除集合中的111
List list = new ArrayList();
list.add(111);//自动装箱
list.add(222);
list.add(333);
// 删除 111元素
Object object = list.remove(0);
// list.remove(111);
// 这里删除的时候 系统没有给你自动装箱 就按数字传人的方法
// 所以调用的是按角标删除的方法 所以越界
// 如果你非要使用按元素删除需要手动装箱
list.remove(Integer.valueOf(222));
System.out.println(object);
System.out.println(list);
运行结果:
111
[333]
2.7 并发修改异常
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
添加完4个元素 这时 集合的长度为4
如果使用迭代器遍历 那么长度是固定的 4 不能变
获取集合中的迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
if (iterator.next().equals("b")) {
list.add("oh.Yes");//不能修改集合的长度
}
}
运行结果:
ConcurrentModificationException(并发修改异常)
注释:在迭代器遍历 的时候 不要直接使用集合坐操作
2.8让迭代器向集合中添加元素
public class text {
public static void main(String[] args) {
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);
// 注意:在迭代器中进行对集合的添加或者是删除 要使用迭代器中的方法
// 不能直接进行集合去操作
}
}
运行结果:
[a, b, oh-yes, c, d]
2.9 Vector集合 迭代器遍历
public class text {
public static void main(String[] args) {
// Vector(使用数组来实现的 已被ArrayList 替代)
//创建一个Vector集合 迭代器遍历
Vector vector = new Vector();
vector.addElement("a");
vector.addElement("b");
vector.addElement("c");
vector.addElement("d");
System.out.println(vector);
// 迭代器遍历
// 获取迭代器
Enumeration elEnumeration = vector.elements();
while (elEnumeration.hasMoreElements()) {
System.out.println(elEnumeration.nextElement());
}
}
}
运行结果:
[a, b, c, d]
a
b
c
d
2.9迭代反转遍历
public class text {
public static void main(String[] args) {
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());
}
// 逆向
// hasPrevious 判断前一个元素有没有
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
}
}
运行结果:
a
b
c
d
d
c
b
a
2.10取集合首尾元素
public class text {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
// 使用addfirst方法添加
linkedList.addFirst("a");
linkedList.addFirst("b");
linkedList.addFirst("c");
linkedList.addFirst("n");
linkedList.addFirst("h");
System.out.println(linkedList);
// 获取头尾元素
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
}
}
运行结果:
[h, n, c, b, a]
h
a
3.队列和栈
队列和栈
栈结构的特点:先进后出
队列结构特点:现进先出
3.1使用LinksList 模拟栈结构
1.倒删集合 模拟出栈
public class text {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.addLast("a");
list.addLast("b");
list.addLast("c");
list.addLast("d");
// 模拟出栈
System.out.println(list);
while (!list.isEmpty()) {
Object str = list.removeLast();
System.out.println(str);
}
}
}
运行结果:
[a, b, c, d]
d
c
b
a
3.2去除集合重复元素
public class text {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("a");
list.add("b");
list.add("c");
list.add("d");
ArrayList list1 = new ArrayList();
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
// 判断是否在在新数组中
Object next = iterator.next();//不能调用两次next()方法
if (!list1.contains(next)) {
// 将元素添加到新数组中
list1.add(next);
}
}
System.out.println(list1);
}
}
运行结果:
[a, b, c, d]
3.3对象去重
public class text {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 地址都不一样 所以都不是同一个对象
// 想去重根据的是对象的名字和年龄去重 如果年龄和名字重复就去掉一个
list.add(new Student("盆盆",13));
list.add(new Student("试试",13));
list.add(new Student("盆盆",13));
list.add(new Student("盆盆",13));
list.add(new Student("盆盆3",12));
ArrayList list2 = new ArrayList();
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
// 强转student
Student student = (Student)next;
if (!list2.contains(next)) {
list2.add(next);
}
}
for (Object object : list2) {
Student student = (Student)object;
System.out.println(student);
}
}
}
注释:在这里Student类中equals方法需要重写
重写equals方法
@Override
public boolean equals(Object obj) {
System.out.println("equals方法调用");
// 原来比较的是第地址 已经不能满足2我的需求了
// 我的需求 不看地址 只能看姓名 和 年龄
// 姓名和年龄同时同时认为是同一个对象
// 把传进来的转换成student类型
Student s = (Student)obj;
// 判断姓名和年龄同时同
return this.name.equals(s.getName()) && this.age == s.getAge();
}
运行结果:
equals方法调用
equals方法调用
equals方法调用
equals方法调用
equals方法调用
Student [name=盆盆, age=13]
Student [name=试试, age=13]
Student [name=盆盆3, age=12]