Java集合框架

集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。

任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
适合存储复杂的数据结构。

  • 接口:表示集合的抽象数据类型。接口提供了让我们对集合中所表示的内容进行单独操作的可能。
  • 实现:集合框架中接口的具体实现。实际它们就是那些可复用的数据结构。
  • 算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,例如查找、排序等。这些算法通常是多态的,因为相同的方法可以在同一个接口被多个类实现时有不同的表现
集合框架.png
  • Iterator接口

  • Collection接口(存储不唯一,无序对象)

    • List接口(存储不唯一,有序对象)<-----实现类:ArrayList,LinkedList
    • Set接口(存储唯一,无序对象)<-----实现类:HashSet,TreeSet
  • Map接口(存储一组键值对象) 实现类:HashMap,TreeMap

  • 算法类:Collections,Arrays

Iterator接口

专门对集合进行迭代的迭代器,主要有两个方法

hasNext();//判断是否存在下一个可访问的元素,如果有就继续迭代,返回true,否则返回false
next();//返回要访问的下一个元素

ArrayList

基于数组的存储方式,在内存中分配连续的空间存放数据,遍历元素的随机访问的效率比较高。对数组进行了封装,实现了长度可变的数组。也可理解为存放对象的动态数组。

常用方法:

boolean add(E e)  //将指定的元素添加到此列表的尾部。
void add(int index, E element) //将指定的元素插入此列表中的指定位置。
void clear()//移除此列表中的所有元素。
boolean contains(Object o)//如果此列表中包含指定的元素,则返回 true。
E get(int index)//返回此列表中指定位置上的元素。
int indexOf(Object o)//返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。
boolean isEmpty()//如果此列表中没有元素,则返回 true
E set(int index, E element)//用指定的元素替代此列表中指定位置上的元素。
E remove(int index)//移除此列表中指定位置上的元素。
boolean remove(Object o)//移除此列表中首次出现的指定元素(如果存在)。
int size()//返回此列表中的元素数。

示例代码:

public class Demo {
    public static void main(String[] args) {
      ArrayList<String> list = new ArrayList<String>();
      list.add("张三丰");
      list.add("郭靖");
      list.add(1,"杨过");
      System.out.println(list.contains("李莫愁"));
      list.remove(0);
      list.set(1, "黄蓉");
      for(int i = 0; i < list.size(); i++){
          String name = list.get(i);
          System.out.println(name);
      }
      System.out.println(list.indexOf("小龙女"));
      list.clear();
      System.out.println(list.isEmpty());
    }
}

LinkedList

基于链表的存储方式,插入、删除元素时效率比较高,查找效率低。
LinkedList除了包含ArrayList的方法外,还有一些独有的方法。

void addFirst(E e)//在集合首部插入元素
void addLast(E e)//在集合尾部插入元素
E getFirst()//获得当前集合的第一个元素
E getLast()//获得当前集合的最后一个元素
E removeFirst()//移除并返回当前集合的第一个元素
E removeLast()//移除并返回当前集合的最后一个元素
public class Demo {
    public static void main(String[] args) {
        NewsTitle car = new NewsTitle(1,"汽车","管理员");
        NewsTitle medical = new NewsTitle(2,"医学","管理员");
        NewsTitle fun = new NewsTitle(3,"娱乐","管理员");
        NewsTitle gym = new NewsTitle(4,"体育","管理员");
        
        LinkedList<NewsTitle> newsTitleList = new LinkedList<NewsTitle>();
        newsTitleList.add(car);
        newsTitleList.add(medical);
        newsTitleList.addFirst(fun);
        newsTitleList.addLast(gym);
        NewsTitle first = (NewsTitle)newsTitleList.getFirst();
        NewsTitle last = (NewsTitle)newsTitleList.getLast();
        System.out.println("头条是"+first.getTitle());
        System.out.println("最后一条是"+last.getTitle());
        
        newsTitleList.removeFirst();
        newsTitleList.removeLast();
        System.out.println("头条和末尾已删除");

        for(NewsTitle news : newsTitleList){
            System.out.println("新闻标题是: "+news.getTitle());
        }
    }
}

HashSet

基于散列的数据存储方式,存放唯一、无序的对象,存放的其实是对象的引用,采用equals()方法比较两个对象的指针,保证对象在集合中是唯一的。在无序的集合中查找元素的效率比较高。

常用方法:

boolean add(E e)//如果此 set 中尚未包含指定元素,则添加指定元素。
void clear()//从此 set 中移除所有元素。
boolean contains(Object obj)//如果此 set 包含指定元素,则返回 true。
boolean isEmpty()//如果此 set 不包含任何元素,则返回 true。
Iterator<E> iterator()//返回对此 set 中元素进行迭代的迭代器。
boolean remove(Object o)//如果指定元素存在于此 set 中,则将其移除。
int size()//返回此 set 中的元素的数量(set 的容量)。

示例代码:

public class Demo {
    public static void main(String[] args) {
        NewsTitle car = new NewsTitle(1,"汽车","管理员");
        NewsTitle test = new NewsTitle(2,"高考","管理员");
        
        Set<NewsTitle> newsTitleList = new HashSet<NewsTitle>();
        newsTitleList.add(car);
        newsTitleList.add(test);
        
        System.out.println("新闻标题数目为:"+newsTitleList.size());
        System.out.println("汽车新闻是否存在:"+newsTitleList.contains(car));
        newsTitleList.remove(car);
        System.out.println("集合是否为空:"+newsTitleList.isEmpty());
        
        System.out.println("遍历新闻所有标题:");
        for(NewsTitle news : newsTitleList){
            System.out.println("新闻标题是:"+news.getTitle());
        }
    }
}

HashMap

Map接口存储一组成对的键值对象,(key,value),提供key到value的映射,通过key来检索,key必须唯一,可以无序;value可以无序,可以不唯一。
HashMap的查询指定元素效率较高。

常用方法:

void clear()//清空集合中的所有元素
boolean  containsKey(Object key)//集合中是否存在key
boolean  containsValue(Object value)//集合中是否存在value
boolean  isEmpty()//集合是否为空
V put(K key, V value)//将一对key,value放入集合,如果集合中已经存在,将替换旧值
V get(Object key)//根据key,返回对应的value
V remove(Object key)//从集合中移除与key相关的映射,并返回key关联的value
int size()//集合中元素的数量
Set<K> keySet()//返回所有key的集合
Collection<V>  values()//返回所有value的集合

示例代码:

public class Demo {
    public static void main(String[] args) {
        Student stu1 = new Student("郭靖","男");
        Student stu2 = new Student("黄蓉","女");
        
        Map<String, Student> students = new HashMap<String, Student>();
        students.put("tom", stu1);
        students.put("rose",stu2);
        System.out.println("已添加"+students.size()+"个学生信息");
        System.out.println("键集"+students.keySet());
        
        String key = "tom";
        if(students.containsKey(key)){
            Student stu = students.get(key);
            System.out.println("英文名是"+key+"的学生是"+stu.getName());
        }
        
        String key1 = "rose";
        if(students.containsKey(key1)){
            students.remove(key1);
            System.out.println(key1+"学员的信息已删除");
        }
    }
}

Collections

Collections是Java提供的一个集合操作工具类,包含了大量的静态方法,用于实现对集合元素的排序、查找和替换等。

常用方法:

sort();//对集合中的元素排序,要实现一个类的对象排序,这个类就要实现Comparable接口,重写compareTo()方法,按指定方式比较对象,再调用Collections的sort()方法
binarySearch();//查询元素,返回元素下标
fill();//替换集合中的所有元素为相同元素

示例代码:

public class Student implements Comparable<Object>{//实现Comparable接口
    private int number = 0;
    private String name = null;
    private String gender = null;
    //......省略......
    
    @Override
    public int compareTo(Object obj) {//重写compareTo()方法
        Stu stu = (Stu)obj;
        if(this.number == stu.getNumber()){
            return 0;
        }else if(this.number > stu.getNumber()){
            return 1;
        }else{
            return -1;
        }
    }
}

public class Demo {
    public static void main(String[] args) {
        Student s1 = new Stu();
        //......省略......
        ArrayList<Stu> list = new ArrayList<Stu>();
        list.add(s1);
        list.add(s2);
        list.add(s3);

        Collections.sort(list);//排序
        System.out.println("排序后:————————————————");
        Iterator<Student> it = list.iterator();
        while(it.hasNext()){
            Student stu = (Student)it.next();
            System.out.println(stu.getNumber());
        }

        int index = Collections.binarySearch(list, s1);//查询
        System.out.println("s1的索引是:"+index);

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

推荐阅读更多精彩内容

  • 标签(空格分隔): Java集合框架 问题思考 什么是集合框架? 为什么用集合框架? 怎么用集合框架? 问题解决 ...
    outSiderYN阅读 668评论 0 13
  • title: java集合框架学习总结 tags:集合框架 categories:总结 date: 2017-03...
    行径行阅读 1,665评论 0 2
  • java集合类可以用于存储数量不等的多个对象,并且可以实现常用的数据结构比如栈,队列等。与数组不同,数组长度是不可...
    张松松阅读 272评论 0 0
  • 幼师毕业的我,不曾系统的学过画画,只能勉强算是走马观花似的各种画法都尝试过,老师教的比较多,基本上是一一点到为止,...
    净染阅读 559评论 0 1
  • 查看CocoaPods版本 命令行更新(安装)步骤【更新】 在运行 sudo gem install cocoap...
    Manba_小洛阅读 408评论 0 0