Java API —— ArrayList类 & Vector类 & LinkList类

时间:2022-04-28 16:27:40
1、ArrayList类
    1)ArrayList类概述
        · 底层数据结构是数组,查询快,增删慢
        · 线程不安全,效率高
    2)ArrayList案例
        · 存储字符串并遍历
        · 存储自定义对象并遍历
2、Vecor类
    1)Vector类概述
       · 底层数据结构是数组,查询快,增删慢
       · 线程安全,效率低
    2)Vector类特有功能
        · public void addElement(E obj):添加功能
        · public Object elementAt(int index):返回指定索引处的组件
        · public Enumeration elements():返回此向量的所有组件
    3)Vector案例
        · 存储字符串并遍历
        · 存储自定义对象并遍历
3、LinkedList类
    1)LinkedList类概述        
  · 底层数据结构是链表,查询慢,增删快        
  · 线程不安全,效率高    
  2)LinkedList类特有功能        
  · public void addFirst(Object e)及addLast(Object e):在开头处或结尾处添加        
  · public Object getFirst()及getLast():获取第一个或最后一个元素        
  · public Object removeFirst()及public Object removeLast():移除第一个或最后一个元素并返回被删除的元素    
  3)LinkedList案例
      · 存储字符串并遍历
      · 存储自定义对象并遍历
例子1:
package arraylistdemos;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Created by gao on 15-12-15.
*/
/*
* List的子类特点:
* ArrayList:
* 底层数据结构是数组,查询快,增删慢
* 线程不安全,效率高
* Vector:
* 底层数据结构是数组,查询快,增删慢
* 线程安全,效率低
* LinkedList:
* 底层数据结构是链表,查询慢,增删快
* 线程不安全,效率高
*
* 案例:
* 使用List的任何子类存储字符串或者存储自定义对象并遍历。
*
* ArrayList的使用。
* 存储字符串并遍历
*/
public class ArrayListDemo01 {
public static void main(String[] args) {
//创建集合对象
ArrayList arrayList = new ArrayList();
//创建元素对象,并添加元素
arrayList.add("believe ");
arrayList.add("in ");
arrayList.add("yourself ");
//遍历
Iterator it = arrayList.iterator();
while(it.hasNext()){
String s = (String)it.next();
System.out.println(s);
}
System.out.println("----------------------");
for(int x = 0; x < arrayList.size(); x++){
String s = (String)arrayList.get(x);
System.out.println(s);
}
}
}

例子2:

package arraylistdemos;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Created by gao on 15-12-15.
*/
public class ArrayListDemo02 {
public static void main(String[] args) {
//创建集合对象
ArrayList arrayList = new ArrayList();
//创建学生对象
Student s1 = new Student("武松", 30);
Student s2 = new Student("鲁智深", 40);
Student s3 = new Student("林冲", 36);
Student s4 = new Student("杨志", 38);
//添加元素
arrayList.add(s1);
arrayList.add(s2);
arrayList.add(s3);
arrayList.add(s4);
//遍历
Iterator it = arrayList.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.getName() + "---" + s.getAge());
}
System.out.println("------------");
for (int x = 0; x < arrayList.size(); x++) {
Student s = (Student) arrayList.get(x);
System.out.println(s.getName() + "---" + s.getAge());
}
}
}

   以上两个例子的添加和遍历方法对Vector和LinkedList都是可行的,下面讲解Vector特有的功能。

4、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()
   3)JDK升级的原因:
     A:安全
     B:效率
     C:简化书写
例子3:
package vectordemos;
import java.util.Enumeration;
import java.util.Vector;
/**
* Created by gao on 15-12-15.
*/
public class VectorDemo01 {
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 e = v.elements();
while(e.hasMoreElements()){
String s = (String) e.nextElement();
System.out.println(s);
}
}
}
5、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()
例子4:
package linklistdemos;
import java.util.LinkedList;
/**
* Created by gao on 15-12-15.
*/
public class LinkListDemo01 {
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());
System.out.println("link:"+link);
// public Object removeFirst()
System.out.println("removeFirst:"+link.removeFirst());
// public Object removeLast()
System.out.println("removeLast:"+link.removeLast());
// 输出对象名
System.out.println("link:"+link);
}
}

输出结果:

getFirst:javaee
getLast:android
link:[javaee, hello, world, java, android]
removeFirst:javaee
removeLast:android
link:[hello, world, java]
6、实例应用:ArrayList去除集合中字符串的重复值(字符串的内容相同)
方式一:创建新的集合
package exercisedemos;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Created by gao on 15-12-15.
*/
/*
* ArrayList去除集合中字符串的重复值(字符串的内容相同)
*
* 分析:
* A:创建集合对象
* B:添加多个字符串元素(包含内容相同的)
* C:创建新集合
* D:遍历旧集合,获取得到每一个元素
* E:拿这个元素到新集合去找,看有没有
* 有:不搭理它
* 没有:就添加到新集合
* F:遍历新集合
*/
public class Exercise01 {
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);
}
}
Iterator it2 = newArray.iterator();
while (it2.hasNext()){
String s = (String) it2.next();
System.out.println(s);
}
}
}

方式二:不能创建新的集合

package exercisedemos;
import java.util.ArrayList;
/**
* Created by gao on 15-12-15.
*/
/*
* 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
* 要求:不能创建新的集合,就在以前的集合上做。
*/
public class Exercise02 {
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--; //注意删除后会有一个替位
}
}
}
for (int x = 0; x < array.size(); x++) {
String s = (String) array.get(x);
System.out.println(s);
}
}
}
7、实例应用:去除集合中自定义对象的重复值(对象的成员变量值都相同)
Student类:(重写equals方法)
package exercisedemos;
/**
* Created by gao on 15-12-9.
*/
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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 o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
if (age != student.age) return false;
if (!name.equals(student.name)) return false;
return true;
}
}

测试类:

package exercisedemos;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Created by gao on 15-12-15.
*/
/*
* 需求:去除集合中自定义对象的重复值(对象的成员变量值都相同)
*
* 我们按照和字符串一样的操作,发现出问题了。
* 为什么呢?
* 我们必须思考哪里会出问题?
* 通过简单的分析,我们知道问题出现在了判断上。
* 而这个判断功能是集合自己提供的,所以我们如果想很清楚的知道它是如何判断的,就应该去看源码。
* contains()方法的底层依赖的是equals()方法。
* 而我们的学生类中没有equals()方法,这个时候,默认使用的是它父亲Object的equals()方法
* Object()的equals()默认比较的是地址值,所以,它们进去了。因为new的东西,地址值都不同。
* 按照我们自己的需求,比较成员变量的值,重写equals()即可。
* 自动生成即可。
*/
public class Exercise03 {
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());
}
}
}
输出结果:
林青霞---27
林志玲---40
凤姐---35
芙蓉姐姐---18
翠花---16
林青霞---18
8、实例应用:请用LinkedList模拟栈数据结构的集合,并测试
自定义Stack类:
package exercisedemos;
/**
* Created by gao on 15-12-15.
*/
import java.util.LinkedList;
/**
* 自定义的栈集合
*/
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 exercisedemos;
/**
* Created by gao on 15-12-15.
*/
/*
* MyStack的测试
*/
public class Exercise04 {
public static void main(String[] args) {
MyStack ms = new MyStack();
ms.add("hello");
ms.add("world");
ms.add("java");
while (!ms.isEmpty()){
System.out.println(ms.get());
}
}
}
输出结果:
java
world
hello