10月5号-对象容器List

1.     Collection

Collection结构可持有各自独立的对象。在JAVA SE中,Collection包括了ListSet,List是实现java.util.List接口的相关类,可依对象被放置至容器中的顺序来排列对象。Set是实现java.util.Set接口的相关类,不接受重复的对象并可拥有自己的一套排序规则。

 

1.1简介List接口

java.util.ArrayList类实现了java.util.List接口,所以要先认识下List接口。List接口是java.util.Collection接口的子接口,而Collection接口则是java.lang.Iterable的子接口。Iterable接口要求实现求实现一个iterator()方法。

Collection接口继承了Iterator接口,定义了加入元素,删除元素,元素长度等方法。

Collection在删除元素及取得元素上的定义比较通用,List接口则又增加了根据索引取得对象的方法,这说明了List数据结构的特性,每个加入List中的元素是循序加入的,并可指定索引来存取元素。

 

List可以使用数组(Array)或是链接串行(Linked List)来实现这个特性。前者的实现就是java.util.ArrayList,后者是java.util.LinkedList.对于循序加入与存取,使用ArrayList的效率比较高,对于经常变动排列顺序的需求,使用LinkedList比较好。

 

1.2    ArrayList

ArrayList使用数组来实现List的数据结构。对于快速随机取得对象来说,使用ArrayList可以取得比较好的效率。但由于使用数组实现,若要从中间做删除或是插入对象就比较困难。

 

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

 

public class ArrayListDemo {

 

    public static void main(String[] args) {

       Scanner scanner = new Scanner(System.in);

       List<String> list = new ArrayList<String>();

       System.out.println("输入名称(使用quit结束)");

 

       while (true) {

           System.out.print("#");

           String input = scanner.next();

           if (input.equals("quit"))

              break;

           list.add(input);

       }

 

       System.out.println("显示输入:");

       for (int i = 0; i < list.size(); i++) {

           System.out.println(list.get(i) + "");

 

       }

    }

 

}

 

J2SE 5.0以后新增加了泛型功能,使用对象容器时可以声称将存储的对象类型。这样,对象在存入容器会被限定为所声称的类型。编译器可以在编译时会协助进行类型的检查,而取出对象时也不至于失去原来的类型信息,这可以避免类型转换的问题。

ArrayList中的方法:size()方法可以返回当前的ArrayList的长度,使用get()方法可以返回指定索引处的对象,使用toArray()方法可以将ArrayList中的对象转换为对象数组。

 

可以使用get()方法指定索引值来取出对象,然后如果您的目的是想循序取出容易中所有的对象,则可以使用Iterator。如:

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.Scanner;

 

public class IteratorDemo {

 

    public static void main(String[] args) {

       Scanner scanner = new Scanner(System.in);

 

       List<String> list = new ArrayList<String>();

 

       System.out.println("输入名称(输入quit时结束)");

 

       while (true) {

           System.out.println("#");

           String input = scanner.next();

           if (input.equals("quit"))

              break;

           list.add(input);

       }

 

       Iterator iterator = list.iterator();

       while (iterator.hasNext()) {

           System.out.println(iterator.next() + " ");

       }

 

    }

 

}

 

Iterator()方法会返回一个Iterator对象,这个对象提供了遍访容器元素的方法。hasNext()方法测试Iterator中是否还有对象,如果有,可以使用next()方法取出,不用理会Iterator如何实现,事实上在JAVA SEAPI上是找不到实现Iterator的类。

 

1.3  LinkedList

如果经常在容器中做删除或是插入操作,则使用java.util.LinkedList会获得好的效果。像addFirst(),addLast(),getFirst(),getLast(),removeFirst(),removeLast().适合用来实现堆栈(stack)与队列(queue)

下面使用LinkedList实现一个先进后出的堆栈类,这个堆栈类存String对象。

import java.util.LinkedList;

 

public class StringStack {

    private LinkedList<String> linkedList;

 

    public StringStack() {

       linkedList = new LinkedList<String>();

    }

 

    public void push(String name) {

       linkedList.addFirst(name);

    }

 

    public String top() {

       return linkedList.getFirst();

    }

 

    public String pop() {

       return linkedList.removeFirst();

    }

 

    public boolean isEmpty() {

       return linkedList.isEmpty();

    }

}

 

下面是调用主程序:

import java.util.Scanner;

 

public class StringStackDemo {

 

    public static void main(String[] args) {

       Scanner scanner = new Scanner(System.in);

       StringStack stack = new StringStack();

 

       System.out.println("输入名称(使用quit结束)");

 

       while (true) {

           System.out.println("#");

           String input = scanner.next();

           if (input.equals("quit"))

              break;

           stack.push(input);

       }

 

       System.out.println("显示输入:");

       while (!stack.isEmpty()) {

           System.out.println(stack.pop() + " ");

       }

       System.out.println();

 

    }

 

}

 

 

对于先进先出的队列,也可以使用LinkedList来实现。

如下:

package queue;

 

import java.util.LinkedList;

 

public class StringQueue {

    LinkedList<String> linkedList = new LinkedList<String>();

 

    public void put(String name) {

       linkedList.addFirst(name);

    }

 

    public String get() {

       return linkedList.removeLast();

    }

 

    public boolean isEmpt() {

       return linkedList.isEmpty();

    }

}

主程序:

package queue;

 

import java.util.Scanner;

 

public class QueueDemo {

 

    public static void main(String[] args) {

       Scanner scanner = new Scanner(System.in);

       StringQueue queue = new StringQueue();

 

       System.out.println("输入名称(使用quit结束)");

 

       while (true) {

           System.out.println("");

           String input = scanner.next();

 

           if (input.equals("quit")) {

              break;

           }

           queue.put(input);

       }

 

       System.out.println("显示输入");

       while (!queue.isEmpt()) {

           System.out.println(queue.get() + " ");

       }

       System.out.println();

    }

 

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值