java集合-Collections

学习阶段,以下不考虑泛型

附继承关系图:

简化版
完整版

1.集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
2.抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
3.实现类:8个实现类(实线表示),对接口的具体实现。

一、java集合框架的学习目的

  • 学习集合每个容器的特点,包括对象的存储和取出

二、顶层接口Collection的方法

集合中顶层接口中所有的抽象方法,下面的子类或者接口都是具备的,接口中的方法都是抽象的,找实现类ArrayList,也就是接口指向实现类,运行的方法都是子类重写后的方法。

1.以ArrayList为例

add(Object o); //将元素添加到集合,存储到集合
addAll(collection c); //参数是一个集合,把一个集合存储到另一个集合
void clear(); //清楚集合中的所有对象,但是集合容器还在
int size(); //但会集合中存储元素的个数
boolean isEmpty(); //判断集合中元素个数是不是0,是返回True
boolean contains(Object o); //判断集合众是不是包含这个对象,如果包含返回True
boolean containsAll(Collection c); //一个集合是否完全包含另一个集合,是集合中存储的对象,如果完全包含,返回True
boolean remove(Object o);// 移除集合中的元素,移除成功返回True
//***********
//注意:如果集合中包含多个此元素,remove只移除第一个,也就是一次调用只能移除一个元素

boolean removeAll(Collection c);// 移除两个集合中的相同元素
boolean retainAll(Collection c);//保留两集合中相同的元素也就是取交集,只要原始集合没变,就返回False
toArry(); //集合专数组

2.方法运行Demo

import java.util.*;
public class CollectionDemo {

    /*
     * 练习collection中的方法
    */
    public static void main(String[] args) {
        method();
    }
    
    public static void method(){
        Collection col = new ArrayList();
        Collection col1 = new ArrayList();
        
        col.add("a");
        col.add("b");
        col.add("c");
        col.add("a");
        col.add("a");
        
        col1.add("a");
        col1.add("b");
        col1.add("e");
        
        col.retainAll(col1);
        System.out.println(col.containsAll(col1));
        System.out.println(col.size());
        System.out.println(col);
        
    }
}

三、迭代器-Iterator

  • 迭代器就是从集合中取出元素的方式
  • 但是每种集合子类存储对象的方式不同,造成获取对象的方式也不同,因此规定了一个接口(iterator),所有子类的迭代器必须满足接口规则
  • 每一个集合的子类中,都有一个方法iterator(),返回的就是自己的内部类的对象,但是这个内部类实现了iterator接口
iterator iterator() //方法是获取迭代器对象的方法,返回值是一个接口,返回的就是这个接口的实现类

1.Iterator接口中的方法

boolean hasNext();//判断集合中有没有下一个被取出的元素,有返回true
Object next();//获取集合中的从下一个元素
void remove();//移除元素,就是迭代过程中移除

2.迭代器的实现源码演示

使用ArrayList为例演示

public class ArrayList extends XXX implements List{
  
  //用方法iterator来返回内部类对象
  public Iterator iterator(){
    return new Itr();
  }
  
  //用内部类来实现迭代器的方法,并设置为私有,不向外暴露
  private class Itr implements Iterator{
    public boolean hasNext();
    public Object next();
    public void remove();
  }
}

//外部调用的方式
Iterator it = new ArrayList对象.iterator();

3.迭代器取集合中元素的步骤

  • 调用集合方法iterator()获取迭代器接口的实现类对象
  • 调用接口Iterator方法hasNext()判断集合中有没有下一个元素
  • 调用接口Iterator方法next()获取集合中的元素
public static void main(String[] args) {
        //创建集合对象ArrayList
        Collection con =new ArrayList();
        
        con.add(1);
        con.add(2);
        con.add(3);
        con.add(4);
        
        //使用迭代器获取集合中的元素
        Iterator it = con.iterator();
        
        while(it.hasNext()){
            System.out.println(it.next());
            it.remove();
        }

        while(it.hasNext()){
            System.out.println(it.next());
        }
    }

/*输出结果
1
2
3
4
*/

4.迭代器注意事项

  • 如果hasNext()判断为false,还用next()获取,出现没有元素被取出异常
  • 在迭代的过程中,不允许使用集合的方法改变集合长度,出现并发修改异常
  • 迭代器创建好以后,只能迭代一次
  • 一次迭代中,不允许出现多次next方法

四、list接口派系

Lsit接口继承Collection接口,自己成立一个派系。特点(有序,重复,下标):

  • 存储是有序的。顺序:存储和取出的顺序相同
  • 允许存储重复
  • 元素都有下标

1.List接口特有方法

void add(int index,Object o)//在列表的指定位置上插入元素
boolean addAll(int index,Collection c)//在列表的指定位置上插入另一个集合
Object get(int index)//返回指定索引上的元素!
Object remove(int index)//移除指定下标上的元素,返回移除前的对象
Object set(int index,Object o)//修改指定下标上的元素,返回修改前的元素
List subList(int start,int end)//获取集合中的一部分,包含头,不包含尾,返回新集合

demo:

import java.util.ArrayList;
import java.util.List;

/*
 * List接口的特有方法
*/
public class ListDemo {
    public static void main(String[] args) {
        List list = new ArrayList();
        
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");

        /*
         * void add(int index,Object o)
         * 在列表的指定位置前插入元素
        */      
        list.add(2,"z");
        System.out.println(list);

        /*
         *  void addAll(int index,Collection o)
         * 在列表的指定位置插入另一个集合
         * 插入的集合为空时,返回false
        */
        
        List list2 = new ArrayList();
        
        list2.add("e");
        list2.add("f");
        list2.add("g");
        list2.add("h");
        
        list.addAll(5,list2);
        System.out.println(list);
        
        /*
         * Object get(int index);
         * 返回指定下标上的元素
        */
        for(int i = 0;i<list.size();i++){
            System.out.print((String)list.get(i)+',');
        }
        System.out.print('\n');
        /*
         * Object remove(int index)
         * 移除指定下标上的元素
        */
        list.remove(0);
        System.out.println(list);

        /*
         * Object set(int index, Object o);
         * 修改指定位置上的元素,并返回修改前的元素
        */
        System.out.println(list2.set(0, "a"));
        System.out.println(list2);
        
        /*
         * List subList(int start, int end)
         * 获取集合一部分,有头无尾
        */
        System.out.println(list.subList(1, 3));
    }
}

2. List派系特有迭代器

迭代器只能应用于List集合,其他集合不能用。

List特有迭代器接口ListIterator,这个接口是Iterator的子接口。

List的派系的每一个子类,都有一个方法listIterator,返回ListIterator接口的实现类对象,这个实现类,就是集合的内部类。

2.1特点

迭代中,可以使用迭代器方法,进行添加,修改,删除集合中的元素,两个方向遍历

2.2方法

     add(Object)//添加,迭代到哪个对象,添加到这个对象的后面
     set(Object)//修改,迭代到哪个对象,修改的就是哪个对象
     remove()//删除
     hasPrevious() == hasNext() //逆向使用
     previous() == next() //逆向使用

3.ArrayList类

  • 容器的底层实现方式,可变长度数组(扩容,自动复制数组),数组默认大小10个长度。
  • 线程不安全集合,运行速度快。查询速度快,增删慢
  • 每次增长50%。
  • ArrayList使用的频率最高,速度快,查询也快
  • 可以存储NULL

4.Vector类

开始版本JDK1.0 ,升级到JDK1.2的时候,才出现了集合框架的概念。类Vector在JDK1.2版本后,改为实现List接口。Vector类底层实现,也是可变数组,增长率100%,线程安全,运行速度慢。 从JDK1.2版本开始,Vector被ArrayList取代

5.LinkedList类

  • 特点和List接口,一致,重复,有序,下标
  • LinkedList底层实现原理:链表结构,查询慢,增删快,线程不安全,运行速度快
  • 存储和取出,实现代码,和ArrayList完全一致

5.1LinkedList特有方法

addFirst(Object o);//头部添加元素
addLast(Object o);//尾部添加元素
Object getFirst();//获取头部
Object getLast();//获取尾部
Object removeFirst();//移除头部
Object removeLast();//移除尾部
  
//在LinkedList中,1.6版本开始,添加了几个新的方法,来操作集合
boolean offerFirst()  boolean offerLast() //替换的了 addFirst() addLast(),返回永真
Object peekFirst()  Object peekLast() //替换了 getFirst() getLast().如果集合中是空的,获取后返回null不会出现异常
Object pollFirst()  Object pollLast()// 替换了 removeFirst() removeLast().如果集是空的返回null,不会出现异常

5.2LinkedList模拟队列和堆栈

  • 堆栈:内存中的数据,先进去的,后出来
  • 队列:内存中的数据,先进去的,先出来
  • 特点:符合LinkedList类的特点,存储对象的时候,开头结尾,获取对象的时候,可以在开头和结尾获取。
package collectionDemo;

import java.util.*;

/*
 * 通过LinkedList实现队列和栈
*/

public class LinkedListTest {
    public static void main(String[] args) {
        Heap<String> h = new Heap<String>();
        
        h.put("a");
        h.put("b");
        h.put("c");
        h.put("d");
        h.put("e");
        h.put("f");
        
        System.out.println(h);
        
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        
        Queue<Integer> q = new Queue<Integer>();
        
        q.put(1);
        q.put(2);
        q.put(3);
        q.put(4);
        q.put(5);
        System.out.println(q);
        System.out.println(q.pop());
        System.out.println(q.pop());
        System.out.println(q.pop());
        System.out.println(q.pop());
        System.out.println(q.pop());
        System.out.println(q.pop());

    }
    

}

//实现栈
class Heap<E>{ 
    private LinkedList<E> h ;
    
    Heap(){
        this.h =  new LinkedList<E>();
    }
    
    public void put(E o){
        this.h.addFirst(o);
    }
    
    public E pop(){
        
        return this.h.pollFirst();
    }
    
    public String toString(){
        
        return this.h.toString();
    }
}

//实现队
class Queue<E>{
    
    private LinkedList<E> q;
    
    Queue(){
        this.q = new LinkedList<E>();
    }
    
    public void put(E o){
        this.q.addFirst(o);
    }
    
    public E pop(){
        return this.q.pollLast();
    }
    
public String toString(){
        
        return this.q.toString();
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:V...
    独念白阅读 753评论 0 2
  • 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:V...
    Oneisall_81a5阅读 898评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,587评论 18 399
  • 刚看完2016里约奥运会女单乒乓球第二场半决赛,中国选手丁宁对战朝鲜选手金松伊,这是一场艰难的战斗! 开局还算顺利...
    HerryLiu阅读 430评论 0 0
  • 归读,是梅州城区一个集生态、文化、休闲于一体的综合性河滨公园,是梅州城区园林绿化和公用设施的一张出色名片,...
    漫步归读阅读 458评论 0 1