java集合学习之Collection(3)

这篇博客主要介绍List集合和Queue集合

一.List集合

List集合是一个有序的可重复的集合,集合中的每个元素都对应一个索引,我们可以通过索引来访问List集合中的数据(其实可以看成一个长度可变的数组)。

List作为Collection的子接口,支持Collection的所有操作,但因为List是有序的所以新增加了一些新的操作,主要是根据索引来插入,删除,替换元素的方法。List通过equals()方法判断对象是否相等。如下面的代码所示:

package lkl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;

public class ListTest {

    public static void main(String[] args){

        Collection c = new HashSet();
        c.add("java");
        c.add("c");
        c.add("c++");
        List ls = new ArrayList();
        ls.add(1);
        ls.add(1);
        ls.add(-1);
        ls.add(3);
        ls.add(3);
        System.out.println(ls);

        ///void add(int index,Object e)
        ///将元素e插入到List中下标为index处,index值不能大于List原先的长度
        ls.add(2, 4);
        System.out.println(ls);

        ///void addAll(int index,Collection c)
        ///将集合c中所有元素都插入到List的index处
        ls.addAll(2,c);
        System.out.println(ls);

        ///Object get(int index)
        ///返回List index处的元素,这个方法可结合for循环遍历List
        for(int i=0;i<ls.size();i++)
            System.out.print(ls.get(i)+" ");
        System.out.println();

        ///int indexOf(Object o):返回元素o在集合中第一次出现的位置
        ///int lastIndexOf(Object o):返回元素o在集合中最后一次出现的位置
        System.out.println(ls.indexOf(3));
        System.out.println(ls.lastIndexOf(3));

        ///Object remove(int index):删除并返回index处的元素
        System.out.println(ls.remove(2));
        System.out.println(ls);

        ///Object set(int index,Object e)
        ///用e替换index处的对象,并返回原对象
        System.out.println(ls.set(1,3));
        System.out.println(ls);

        ///List subList(int index1,int index2)
        ///返回处于index1和index2之间元素组成的子集
        System.out.println(ls.subList(2, 5));
    }
}

对于List,由于它是有序的,所以List提供了一个额外的遍历方法lsitIterator();该方法提供了反向迭代的功能,并且还可以在遍历过程中向集合中增加元素。其相比Iterator接口增加的方法如下:

boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素。

Object previous() :返回该迭代器的上一个元素

void add() :向指定位置插入一个元素

下面的代码示范了这些操作的效果:

package lkl;

import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
import java.util.ListIterator;

public class ListIteratorTest {

    public static void main(String[] args){
        List ls = new ArrayList();
        ls.add(1);
        ls.add(2);
        ls.add(3);
        ///声明一个ListIterator类型的迭代器
        ListIterator lt = ls.listIterator();
        ///正向迭代过程
        while(lt.hasNext()){
            int k=(int) lt.next();
            System.out.print(k+" ");
            ///还可以在迭代过程中插入一个元素,但插入的元素不会影响此次的遍历
            if(k==2)
                 lt.add(4);
        }
        System.out.println();
        System.out.println("下面是反向迭代过程");
        ///下面开始反向迭代过程
        while(lt.hasPrevious()){
            System.out.print(lt.previous()+" ");
        }
        System.out.println();
    }
}

二.List集合的实现类:ArrayList和Vector

ArrayList和Vector是List的两个典型实现,完全支持前面所介绍的所有的操作。ArrayList和Vector都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的允许再分配的Object[]数组。Arraylist和Vector对象使用initialCapacity参数来设置数组的长度,然后当数组满了之后,其initialCapcity会自动增加;但是如果我们要向ArrayList中添加大量元素,那么我们可以使用ecsureCapacity()方法一次性增加initialCapacity,这样可以减少分配次数,提高性能。Object[]数组默认的长度为10.

Vector与ArrayList用法几乎完全相同,只是Vector是一个古老的集合。

并且Vector还封装了一个Stack子类,用来模拟栈,其用法如下:

package lkl;

import java.util.Stack;

public class VectorStackTest {

    public static void main(String[] args){
        ///声明一个栈
        Stack st = new Stack();
        ///将元素入栈
        st.push("c语言");
        st.push("cpp");
        st.push("java");
        System.out.println(st);
        //返回栈顶元素,但不将其出栈
        System.out.println(st.peek());
        System.out.println(st);
        //将栈顶元素出栈,并返回
        System.out.println(st.pop());
        System.out.println(st);
    }
}

三.Queue集合

Queue集合用于模拟队列,即满足先进先出的性质。Queue的基本操作如下面的代码所示:

package lkl;

import java.util.ArrayDeque;
import java.util.Queue;

public class QueueTest {

    public static void main(String[] args){
        Queue qu = new ArrayDeque();

        ///void add(Object e) boolean offer(Object e)
        ///这两个方法都可以将元素加入到队列的尾部
        qu.add("c++");
        qu.add("c语言");
        qu.add("java");
        System.out.println(qu);

        ///Object peek():获取队头元素但是不删除该元素
        ///Object poll():获取队头元素并删除该元素
        System.out.println(qu.peek());
        System.out.println(qu);
        System.out.println(qu.poll());
        System.out.println(qu);
    }
}

Queue还有一个PriorityQueue的实现类,即平时我们用的优先队列。

此外Queue还有一个Qeque接口,即”双端队列”,可以从两端来添加和删除元素,因此Deque的实现类既可以当队列使用也可以当栈使用。关于Dequeu的基本操作就不一一罗列了。Deque接口提供了一个典型的实现类:ArrayDeque,一个基于数组的双端队列实现。下面示范如何将双端队列来当初栈使用,可以看出和前面Vector实现的栈用法是一样的:

package lkl;

import java.util.ArrayDeque;

public class DequeStackTest {

    public static void main(String[] args){
        ArrayDeque st = new ArrayDeque();
        st.push(1);
        st.push(2);
        st.push(3);
        System.out.println(st);
        System.out.println(st.peek());
        System.out.println(st);
        System.out.println(st.pop());
        System.out.println(st);
    }
}

四.LinkedList实现类

LinkedList实现类是List接口的实现类,其内部用链表来保存集合中的元素,因此有非常好的插入,删除性能。而其他的List实现类随机访问性能比较好。LinkedList除了具有List的基本操作外,还实现了Dequeu接口,因此它可以被当成双端队列来使用,也可以当成栈来使用。下面的代码简单示范了LinkedList集合的用法:

package lkl;

import java.util.LinkedList;

public class LinkedListTest {

    public static void main(String[] args){

        LinkedList books = new LinkedList();
        ///将字符串加入到队列的尾部
        books.offer("c++");

        ///将字符串元素加入到栈的顶部
        books.push("java");

        ///将字符串加入到队列的头部(相当于栈的顶部)
        books.offerFirst("c语言");
        for(int i=0;i<books.size();i++)
            System.out.print(books.get(i)+" ");
        System.out.println();

        ///访问但不删除栈顶的元素
        System.out.println(books.peekFirst());
        ///访问但不删除队列最后一个元素
        System.out.println(books.peekLast());
        ///将栈顶的元素弹出
        System.out.println(books.pop());
        System.out.println(books);
        ///访问并删除队列的最后一个元素
        System.out.println(books.pollLast());
        System.out.println(books);
    }
}
时间: 2024-10-08 10:04:04

java集合学习之Collection(3)的相关文章

java集合学习之Collection(1)

java集合类主要由两个接口派生出来:Collection和Map,者两个类是java集合框架的根本接口,其余的集合都是这两个集合的子类,这篇博客主要讲Collection接口及其体系中包含的set,list,queue 等集合.下面依次就这些内容进行讲解. 一.Collection 1.Collection是set,list,queue接口的父接口,Collection中定义的方法对set,list,queue也是适用的.下面的代码示范了Collection的基本操作,从下面的代码中可以看到,

java集合学习一-Collection学习

集合类练习 1 package com.example.demo.collection; 2 3 import org.junit.Test; 4 5 import java.util.*; 6 7 public class CollectionTest { 8 @Test 9 public void test1() { 10 Collection coll = new ArrayList(); 11 coll.add("AA"); 12 coll.add("BB"

Java集合学习之Collection(2)

上篇博客讲了Collection接口的一些基本操作,这篇博客主要介绍Collection接口的子接口Set. Set是一种无序的集合,其基本操作和Collection接口是差不多的,主要的不同点在于Set中不能重复元素而Collection集合是可以的.对于Set集合我们主要关心它的HashSet,TreeSet两个实现类. 一.HashSet HashSet是Set接口的典型实现,大多数时候使用Set集合时就是使用这个类:HashSet通过hash算法确定元素的存储位置.值得注意的是HashS

java集合学习一

1.Set存放的元素是无序的不可重复. 2.List存放的元素为有序可重复. 3.重写equals方法,一般最好重写hasCode方法,当对象作为key的时候及索引,会使用hasCode方法进行查找. 4.容器对象在调用remove,contains等方法时需要比较对象是否相等,这会涉及到对象类型的equals方法和 hashCode方法.对于自定义的类型,需要重写equals和hashCode方法以实现自定义的对象相等规则.相等的对象 应该具有相等的hashCode. 5.ArrayList底

深入Java集合学习系列:HashMap的实现原理

参考文献 引用文献:深入Java集合学习系列:HashMap的实现原理,大部分参考这篇博客,只对其中进行稍微修改 自己曾经写过的:Hashmap实现原理 1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的).此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 2. HashMap的数据结构: 在ja

转:深入Java集合学习系列:HashSet的实现原理

0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个private static final Object PRESENT

java数据结构学习之—Collection接口

Collection接口代表一组对象,这组对象称为它的元素,有些实现(如链表)是无序的,有些实现(集合和映射)是有序的,有些实现是允许重复的,而有些实现不允许重复,从java5开始,Collection接口和整个集合类API都使用泛型,所有容器都支持一下操作: 1.boolean isEmpty() 如果容器不包含任何元素,则返回true,否则返回false. 2.int size() 返回容器中元素的个数 3.boolean add(AnyType x) 将项X添加到容器中,如果操作成功,则返

Java 集合系列 02 Collection架构

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 首先,我们对Collection进行说明.下面先看看Collection的一些框架类的关系图: Collection是一个接口,它主要的两个分支是:List 和 Set. List和Set都是接口,它们继承于Collection.L

深入Java集合学习系列:LinkedHashMap的实现原理

1. LinkedHashMap概述: LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变.   LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序.   注意,此实现不是同步的.如果多个线程同时访问链接的哈希映射,而其中至少一个线