16(01)总结List的子类,ArrayList,Vector,LinkedList

时间:2022-05-04
本文章向大家介绍16(01)总结List的子类,ArrayList,Vector,LinkedList,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1:List的子类(掌握)

(1)List的子类特点

ArrayList:

底层数据结构是数组,查询快,增删慢

线程不安全,效率高

Vector:

底层数据结构是数组,查询快,增删慢

线程安全,效率低

LinkedList:

底层数据结构是链表,查询慢,增删快

线程不安全,效率高

(2)ArrayList

A:没有特有功能需要学习

B:案例

a:ArrayList存储字符串并遍历

package cn.itcast_01;
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;
 }
}
package cn.itcast_01;
import java.util.ArrayList;
import java.util.Iterator;
/*
 * 案例:
 *  使用List的任何子类存储字符串
 * 
 * ArrayList的使用。 
 *  存储字符串并遍历
 */
public class ArrayListDemo {
 public static void main(String[] args) {
 // 创建集合对象
 ArrayList array = new ArrayList();
 // 创建元素对象,并添加元素
 array.add("hello");
 array.add("world");
 array.add("java");
 // 遍历
 Iterator it = array.iterator();
 while (it.hasNext()) {
 String s = (String) it.next();
 System.out.println(s);
 }
 System.out.println("-----------");
 for (int x = 0; x < array.size(); x++) {
 String s = (String) array.get(x);
 System.out.println(s);
 }
 }
}
 b:ArrayList存储自定义对象并遍历
package cn.itcast_01;
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;
 }
}
package cn.itcast_01;
import java.util.ArrayList;
import java.util.Iterator;
/*
 * ArrayList存储自定义对象并遍历
 */
public class ArrayListDemo2 {
 public static void main(String[] args) {
 // 创建集合对象
 ArrayList array = new ArrayList();
 // 创建学生对象
 Student s1 = new Student("武松", 30);
 Student s2 = new Student("鲁智深", 40);
 Student s3 = new Student("林冲", 36);
 Student s4 = new Student("杨志", 38);
 // 添加元素
 array.add(s1);
 array.add(s2);
 array.add(s3);
 array.add(s4);
 // 遍历
 Iterator it = array.iterator();
 while (it.hasNext()) {
 Student s = (Student) it.next();
 System.out.println(s.getName() + "---" + s.getAge());
 }
 System.out.println("----------------");
 for (int x = 0; x < array.size(); x++) {
 // ClassCastException 注意,千万要搞清楚类型
 // String s = (String) array.get(x);
 // System.out.println(s);
 Student s = (Student) array.get(x);
 System.out.println(s.getName() + "---" + s.getAge());
 }
 }
}

(3)Vector

A:有特有功能

a:添加

public void addElement(E obj) -- add()添加元素

b:获取

public E elementAt(int index) -- get()获取index 索引处对应的元素

public Enumeration<E> elements() -- iterator()遍历Vector集合的方式,类似于迭代器

B:案例

a:Vector存储字符串并遍历

b:Vector存储自定义对象并遍历

package cn.itcast_02;
import java.util.Enumeration;
import java.util.Vector;
/*
 * Vector的特有功能:
 * 1:添加功能
 *  public void addElement(Object obj) -- add()
 * 2:获取功能
 *  public Object elementAt(int index) --  get()
 *  public Enumeration elements() -- Iterator iterator()
 *  boolean hasMoreElements() hasNext()
 *  Object nextElement() next()
 * 
 * JDK升级的原因:
 *  A:安全
 *  B:效率
 *  C:简化书写
 */
public class VectorDemo {
 public static void main(String[] args) {
 // 创建集合对象
 Vector v = new Vector();
 // 添加功能
 v.addElement("hello");
 v.addElement("world");
 v.addElement("java");
 // 遍历
 for (int x = 0; x < v.size(); x++) {
 String s = (String) v.elementAt(x);
 System.out.println(s);
 }
 System.out.println("------------------");
 Enumeration en = v.elements(); // 返回的是实现类的对象
 while (en.hasMoreElements()) {
 String s = (String) en.nextElement();
 System.out.println(s);
 }
 }
}

(4)LinkedList A:有特有功能 a:添加 addFirst() addLast() b:删除 removeFirst() removeLast()

c:获取

getFirst()

getLast()

B:案例

a:LinkedList存储字符串并遍历

b:LinkedList存储自定义对象并遍历

package cn.itcast_03;

import java.util.LinkedList;
/*
 * LinkedList的特有功能:
 *  A:添加功能
 *  public void addFirst(Object e)
 *  public void addLast(Object e)
 *  B:获取功能
 *  public Object getFirst()
 *  public Obejct getLast()
 *  C:删除功能
 *  public Object removeFirst()
 *  public Object removeLast()
 */
public class LinkedListDemo {
 public static void main(String[] args) {
 // 创建集合对象
 LinkedList link = new LinkedList();
 // 添加元素
 link.add("hello");
 link.add("world");
 link.add("java");
 // public void addFirst(Object e)
 // link.addFirst("javaee");
 // public void addLast(Object e)
 // link.addLast("android");
 // public Object getFirst()
 // System.out.println("getFirst:" + link.getFirst());
 // public Obejct getLast()
 // System.out.println("getLast:" + link.getLast());
 // public Object removeFirst()
 System.out.println("removeFirst:" + link.removeFirst());
 // public Object removeLast()
 System.out.println("removeLast:" + link.removeLast());
 // 输出对象名
 System.out.println("link:" + link);
 }
}

(5)案例:

A:去除集合中的多个字符串的重复元素

如果字符串的内容相同,即为重复元素

package cn.itcast_04;

import java.util.ArrayList;
import java.util.Iterator;
/*
 * ArrayList去除集合中字符串的重复值(字符串的内容相同)
 * 
 * 分析:
 *  A:创建集合对象
 *  B:添加多个字符串元素(包含内容相同的)
 *  C:创建新集合
 *  D:遍历旧集合,获取得到每一个元素
 *  E:拿这个元素到新集合去找,看有没有
 *  有:不搭理它
 *  没有:就添加到新集合
 *  F:遍历新集合
 */
public class ArrayListDemo {
 public static void main(String[] args) {
 // 创建集合对象
 ArrayList array = new ArrayList();
 // 添加多个字符串元素(包含内容相同的)
 array.add("hello");
 array.add("world");
 array.add("java");
 array.add("world");
 array.add("java");
 array.add("world");
 array.add("world");
 array.add("world");
 array.add("world");
 array.add("java");
 array.add("world");
 // 创建新集合
 ArrayList newArray = new ArrayList();
 // 遍历旧集合,获取得到每一个元素
 Iterator it = array.iterator();
 while (it.hasNext()) {
 String s = (String) it.next();
 // 拿这个元素到新集合去找,看有没有
 if (!newArray.contains(s)) {
 newArray.add(s);
 }
 }
 // 遍历新集合
 for (int x = 0; x < newArray.size(); x++) {
 String s = (String) newArray.get(x);
 System.out.println(s);
 }
 }
}
package cn.itcast_04;
import java.util.ArrayList;
import java.util.Iterator;
/*
 * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
 * 要求:不能创建新的集合,就在以前的集合上做。
 */
public class ArrayListDemo2 {
 public static void main(String[] args) {
 // 创建集合对象
 ArrayList array = new ArrayList();
 // 添加多个字符串元素(包含内容相同的)
 array.add("hello");
 array.add("world");
 array.add("java");
 array.add("world");
 array.add("java");
 array.add("world");
 array.add("world");
 array.add("world");
 array.add("world");
 array.add("java");
 array.add("world");
 // 由选择排序思想引入,我们就可以通过这种思想做这个题目
 // 拿0索引的依次和后面的比较,有就把后的干掉
 // 同理,拿1索引...
 for (int x = 0; x < array.size() - 1; x++) {
 for (int y = x + 1; y < array.size(); y++) {
 if (array.get(x).equals(array.get(y))) {
 array.remove(y);
 y--;
 }
 }
 }
 // 遍历集合
 Iterator it = array.iterator();
 while (it.hasNext()) {
 String s = (String) it.next();
 System.out.println(s);
 }
 }
}

B:去除集合中的多个自定义对象的重复元素

如果自定义对象的成员变量值都相同,即为重复元素

package cn.itcast_04;
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 boolean equals(Object obj) {
 if (this == obj)
 return true;
 if (obj == null)
 return false;
 if (getClass() != obj.getClass())
 return false;
 Student other = (Student) obj;
 if (age != other.age)
 return false;
 if (name == null) {
 if (other.name != null)
 return false;
 } else if (!name.equals(other.name))
 return false;
 return true;
 }
}
package cn.itcast_04;
import java.util.ArrayList;
import java.util.Iterator;
/*
 * 需求:去除集合中自定义对象的重复值(对象的成员变量值都相同)
 * 
 * 我们按照和字符串一样的操作,发现出问题了。
 * 为什么呢?
 *  我们必须思考哪里会出问题?
 *  通过简单的分析,我们知道问题出现在了判断上。
 *  而这个判断功能是集合自己提供的,所以我们如果想很清楚的知道它是如何判断的,就应该去看源码。
 * contains()方法的底层依赖的是equals()方法。
 * 而我们的学生类中没有equals()方法,这个时候,默认使用的是它父亲Object的equals()方法
 * Object()的equals()默认比较的是地址值,所以,它们进去了。因为new的东西,地址值都不同。
 * 按照我们自己的需求,比较成员变量的值,重写equals()即可。
 * 自动生成即可。
 */
public class ArrayListDemo3 {
 public static void main(String[] args) {
 // 创建集合对象
 ArrayList array = new ArrayList();
 // 创建学生对象
 Student s1 = new Student("林青霞", 27);
 Student s2 = new Student("林志玲", 40);
 Student s3 = new Student("凤姐", 35);
 Student s4 = new Student("芙蓉姐姐", 18);
 Student s5 = new Student("翠花", 16);
 Student s6 = new Student("林青霞", 27);
 Student s7 = new Student("林青霞", 18);
 // 添加元素
 array.add(s1);
 array.add(s2);
 array.add(s3);
 array.add(s4);
 array.add(s5);
 array.add(s6);
 array.add(s7);
 // 创建新集合
 ArrayList newArray = new ArrayList();
 // 遍历旧集合,获取得到每一个元素
 Iterator it = array.iterator();
 while (it.hasNext()) {
 Student s = (Student) it.next();
 // 拿这个元素到新集合去找,看有没有
 if (!newArray.contains(s)) {
 newArray.add(s);
 }
 }
 // 遍历新集合
 for (int x = 0; x < newArray.size(); x++) {
 Student s = (Student) newArray.get(x);
 System.out.println(s.getName() + "---" + s.getAge());
 }
 }
}

C:用LinkedList模拟一个栈数据结构的集合类,并测试。(认真思考)

你要定义一个集合类,只不过内部可以使用LinkedList来实现。

package cn.itcast_05;
import java.util.Iterator;
import java.util.LinkedList;
/*
 *请用LinkedList模拟栈数据结构的集合,并测试
 *题目的意思是:
 * 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟。
 */
public class LinkedListDemo {
 public static void main(String[] args) {
 // A: LinkedList的特有添加功能addFirst()
 // B:栈的特点先进后出
 // 创建集合对象
 // LinkedList link = new LinkedList();
 //
 // // 添加元素
 // link.addFirst("hello");
 // link.addFirst("world");
 // link.addFirst("java");
 //
 // // 遍历
 // Iterator it = link.iterator();
 // while (it.hasNext()) {
 // String s = (String) it.next();
 // System.out.println(s);
 // }
 //为什么呢?
 }
}
package cn.itcast_05;
import java.util.LinkedList;
/**
 * 自定义的栈集合
 * 
 * @author 风清扬
 * @version V1.0
 */
public class MyStack {
 private LinkedList link;
 public MyStack() {
 link = new LinkedList();
 }
 public void add(Object obj) {
 link.addFirst(obj);
 }
 public Object get() {
 // return link.getFirst();
 return link.removeFirst();
 }
 public boolean isEmpty() {
 return link.isEmpty();
 }
}
package cn.itcast_05;
/*
 * MyStack的测试
 */
public class MyStackDemo {
 public static void main(String[] args) {
 // 创建集合对象
 MyStack ms = new MyStack();
 // 添加元素
 ms.add("hello");
 ms.add("world");
 ms.add("java");
 // System.out.println(ms.get());
 // System.out.println(ms.get());
 // System.out.println(ms.get());
 // NoSuchElementException
 // System.out.println(ms.get());
 while(!ms.isEmpty()){
 System.out.println(ms.get());
 }
 }
}