集合框架(一)List子接口
一、集合框架的由来
数据多了用对象进行存储,对象多了用集合来进行存储。
而存储数据的方式(数据结构)各有不同,所以存储的容器也就有多种,从而形成了集合框架这一体系。
咱们从上图了解到,
collection接口是list集合和set集合的父接口,但不是map父接口。
今天给大家讲的是Collection接口下的List分析。
二、List接口的特点:
有序,元素可以重复
且有三种遍历方式:
for(取下标)
for each
迭代器(Iterator)
ArrayList集合
数组结构 增删慢,查询快 有连续下标 线程不同步 增长因子为1.5
Vector集合
数组结构 增删改查都慢 有连续下标 线程同步 增长因子2
LinkedList集合
链表结构 增删快,查询慢 没有连续下标
Vector和ArrayList的区别:
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的
ArrayList和LinkedList的区别:
ArrayList底层是数组结果,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
共同点:都是线程不安全的
集合的remove方法与迭代器(Iterator)的remove方法区别
集合:删除指定元素
迭代器:删除所有元素
三、理解堆栈和队列的概念
我画个示意图供大家理解
四、使用LinkedList完成堆栈和队列
(1)堆栈:先进后出
package com.huangzhiyao.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
public class Text {
public static void main(String[] args) {
DuiZhan dz=new DuiZhan();
dz.push("a");
dz.push("b");
dz.push("c");
dz.push("d");
dz.push("e");
dz.bianLi();
}
}
//堆栈
class DuiZhan{
private LinkedList ll = new LinkedList<>();
//弹栈(存放)
public void push(Object obj) {
ll.addFirst(obj);
}
//压栈(取出)
public Object pop() {
return ll.removeFirst();
}
//遍历
public void bianLi() {
Iterator it = ll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
运行结果:
(2)队列:先进先出
package com.huangzhiyao.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
public class Text {
public static void main(String[] args) {
DuiZhan dz= new DuiZhan();
dz.push("a");
dz.push("b");
dz.push("c");
dz.push("d");
dz.push("e");
dz.bianli();
}
}
class DuiZhan{
private LinkedList ll= new LinkedList<>();
public void push(Object obj) {
ll.addLast(obj);
}
public Object pop() {
return ll.removeFirst();
}
public void bianli() {
Iterator it = ll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
运行结果:
注意:堆栈与队列的代码区别在于增加第一个和最后一个
五、ArrayList去重复
(1)去重复(String对象)
package com.huangzhiyao.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
public class Text {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
al.add("laomo");
al.add("laomo");
al.add("dabai");
al.add("xiaoxi");
al.add("yingying");
ArrayList newAl = repeatList(al);
System.out.println(al.size());
System.out.println(newAl.size());
}
private static ArrayList repeatList(ArrayList al) {
ArrayList newAl = new ArrayList<>();
for (Object obj : al) {
if(!newAl.contains(obj)) {
newAl.add(obj);
}
}
return newAl;
}
}
运行结果:
(2)去重复(自定义对象)
package com.huangzhiyao.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
public class Text {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
al.add(new Person("laomo", "21"));
al.add(new Person("laomo", "21"));
al.add(new Person("dabai", "24"));
al.add(new Person("xiaoxi", "13"));
al.add(new Person("yingying", "18"));
ArrayList newAl = repeatList(al);
System.out.println(al.size());
System.out.println(newAl.size());
}
private static ArrayList repeatList(ArrayList al) {
ArrayList newAl = new ArrayList<>();
for (Object obj : al) {
if(!newAl.contains(obj)) {
newAl.add(obj);
}
}
return newAl;
}
}
class Person{
private String name;
private String age;
public Person() {
}
public Person(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person p= (Person)obj;
System.out.println(this.getName() + "----equals----" + p.getName());
return this.getName().equals(p.getName())
&& this.getAge() == p.getAge();
}
return false;
}
}
运行结果: