Java集合中List接口的实现类主要有ArrayList、Vector、LinkedList
ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高
Vector:底层数据结构是数组,查询快,增删慢 线程安全 效率低
LinkedList:底层数据结构是链表,查询慢,增删快 线程不安全 效率高
1.ArrayList的特有功能
JDK1.8新增的一个方法也能遍历集合
void forEach(Consumer<? super E> action) 执行特定动作的每一个元素的 Iterable直到所有元素都被处理或操作抛出异常
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(20);
list.add(120);
list.add(200);
/* void forEach (Consumer < ? super E > action)
执行特定动作的每一个元素的 Iterable直到所有元素都被处理或操作抛出异常。*/
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("==========================");
list.forEach(new Consumer() {
@Override
public void accept(Object o) {
System.out.println(o);
}
});
}
2.Vector的特有功能
Vector 类可以实现可增长的对象数组 , Vector 是同步的。
Vector类特有功能:
void addElement (E obj)
添加指定的组件到这个向量的结束,增加其大小由一个。
E elementAt(int index)
返回指定索引处的组件。
Enumeration<E> elements()
返回此向量的组件的枚举。
E firstElement()
返回第一个组件(在指数 0项目)这个载体。
E lastElement()
返回向量的最后一个组件。
boolean removeElement(Object obj)
从该向量中移除第一个(最低索引)发生的参数。
void removeElementAt(int index)
在指定的索引中删除组件。
void setElementAt(E obj, int index)
设置组件在指定的 index这个向量是指定的对象。
3.LinkedList的特有功能
List 接口的链接列表实现 , 此实现不是同步的
void addFirst(E e)
在此列表的开始处插入指定的元素。
void addLast(E e)
将指定的元素列表的结束。
*
E getLast()
返回此列表中的最后一个元素。
E peek()
检索,但不删除,此列表的头(第一个元素)。
E peekFirst()
检索,但不删除该列表的第一个元素,或返回 null如果这个列表是空的。
E peekLast()
检索,但不删除该列表的最后一个元素,或返回 null如果这个列表是空的。
*
E poll()
检索并删除此列表的头(第一个元素)。
E pollFirst()
检索并移除此列表的第一个元素,或返回 null如果这个列表是空的。
E pollLast()
检索并移除此列表的最后一个元素,或返回 null如果这个列表是空的。
*
E pop()
从这个列表所表示的堆栈中弹出一个元素。
void push(E e)
将一个元素推到由该列表所表示的堆栈上。
E removeLast()
移除并返回此列表中的最后一个元素。
*
E removeFirst()
移除并返回此列表中的第一个元素。
例1:用LinkedList模拟栈数据结构的集合并测试
public static void main(String[] args) {
//栈的特点:先进的后出,后进的先出。
MyList myList = new MyList();
myList.add(100);
myList.add(200);
myList.add(300);
Object obj= myList.get();
System.out.println(obj);
obj = myList.get();
System.out.println(obj);
obj = myList.get();
System.out.println(obj);
obj = myList.get();
System.out.println(obj);
obj = myList.get();
System.out.println(obj);
obj = myList.get();
System.out.println(obj);
}
public class MyList {
private LinkedList linkedList;
public MyList() {
//创建Lin
linkedList = new LinkedList();
}
public void add(Object obj) {
linkedList.addFirst(obj);
}
public Object get() {
Object first = linkedList.pop();
linkedList.addLast(first);
return first;
}
}
例2:去除ArrayList中重复字符串元素方式
思路1:选择排序
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(20);
list.add(20);
list.add(120);
list.add(320);
list.add(320);
list.add(20);
list.add(230);
list.add(204);
list.add(203);
list.add(20);
list.add(120);
list.add(320);
list.add(120);
list.add(20);
list.add(204);
list.add(203);
//选择排序:拿一个元素跟后面的每一个元素去比较,遇到相同的删掉。
for (int i = 0; i < list.size()-1; i++) {
for(int j=i+1;j<list.size();j++){
if(list.get(i).equals(list.get(j))){
list.remove(j);
j--;
}
}
}
System.out.println(list);
}
}
思路2:递归
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(20);
list.add(20);
list.add(120);
list.add(320);
list.add(320);
list.add(20);
list.add(230);
list.add(204);
list.add(203);
list.add(20);
list.add(120);
list.add(320);
list.add(120);
list.add(20);
list.add(204);
list.add(203);
deleteObj(list);
System.out.println(list);
}
private static void deleteObj(ArrayList list) {
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
if(list.indexOf(o)!=list.lastIndexOf(o)){
list.remove(o);
deleteObj(list); //递归
}else{
return;
}
}
}
思路3:创建新集合
public static void main(String[] args) {
/*思路:创建新集合方式*/
ArrayList list = new ArrayList();
list.add("aaa");
list.add("aaa");
list.add("bbb");
list.add("bbb");
list.add("ccc");
list.add("ccc");
ArrayList newList = new ArrayList();
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
if(!newList.contains(o)){
newList.add(o);
}
}
System.out.println(newList);
}
例3:去除ArrayList中重复自定义对象元素
注意事项:重写equals()方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new Student("张三",23));
list.add(new Student("张三", 23));
list.add(new Student("张学友", 24));
list.add(new Student("张学友", 24));
list.add(new Student("刘德华", 25));
list.add(new Student("张国荣", 24));
ArrayList newList = new ArrayList();
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
if (!newList.contains(o)) {
newList.add(o);
}
}
System.out.println(newList);
//[Student{name='张三', age=23}, Student{name='张学友', age=24}, Student{name='刘德华', age=25}, Student{name='张国荣', age=24}]
}