Java集合框架的组成

  注意:四个接口的区别

          ① Collection:存储无序的、不唯一的数据;

          ② List:存储有序的、不唯一的数据;

          ③ Set:存储无序的、唯一的数据;

          ④ Map:以键值对的形式存储数据,以键取值,键不可以重复、值可以重复

  下面分别看一下各个接口和对应的实现类:

            

一、List接口

   有序、不唯一

 1、常用方法:

    ① add(): 在列表的最后添加元素;

    ② add(index,obj): 在列表的指定位置插入元素;

    ③ size(): 返回当前列表的元素个数;

    ④ get(int index): 返回下标为index的元素;

     如果没有泛型约束,返回object类型,需要强转;如果有泛型约束,直接返回泛型类型,无需强转

    ⑤ clear(): 清除列表中所有元素。

     isEmpty(): 如果此列表不包含元素,则返回 true。 检测列表是否为空。

    ⑥ contains(): 传入一个对象,检测列表中是否包含该对象;

     如果传入的是String 和 基本数据类型,可以直接比对;

     如果传入的是实体对象,则默认只对比两个对象的地址。因此,需要在实体类重写equal()方法。

    ⑦ indexof(): 传入一个对象,返回该对象在列表中首次出现的地址。

      LastIndexof(): 最后一次。

       ⑧ remove(): 传入一个下标,或者一个对象,删除指定元素。

     如果传入下标,返回被删除的元素对象。如果下标大于size(),会报下标越界异常。

     如果传入对象,则要求重写equal()方法,返回true或false表示删除是否成功。

     ⑨ set(index,object): 用新传入的对象,将指定位置的元素替换掉。

     返回被替换掉的元素对象。

    ⑩ List.subList(1,3): 截取一个子列表,返回List类型。

     toArray(): 将列表转为数组,返回一个object[]类型的数组。

 2、实现类:

  1)ArrayList

    实现了一个长度可变的数组,在内存空间中开辟一串连续的空间,与数组的区别在于长度可以随意修改。

  这种存储结构,在循环遍历和随机访问元素时的速度比较快。

  2)LinkedList

    使用链表结构存储数据,在插入和删除元素时速度非常快。

    线程不安全,速度较快,常用!

  LinkedList 的特有方法:

    ① add.first(): 开头插入元素。(在该列表开头插入指定的元素。)

     add.last(): 结尾插入元素。(将指定的元素追加到此列表的末尾。)

    ② removeFirst(): 删除第一个元素,并返回被删除的元素。

     removeLast(): 删除最后一个元素,并返回被删除的元素。

    ③ getFirst(): 返回列表的第一个元素,并不会被删除。

     getLast(): 返回列表的最后一个元素,并不会被删除。

 3、List循环遍历方法:

  1)使用for循环遍历列表:

    

  2)使用foreach遍历列表:

    

  3)使用iterator迭代器遍历列表

    ① 使用列表调用 .iterator()返回一个迭代器对象。

    ② 使用迭代器对象调用.hasNext()判断是否有下一条数据。

    ③ 使用迭代器对象调用.next()取出下一条数据

    

二、Set接口

  无序、唯一

 1、常用方法: 

  与List接口基本相同。(参考上述List接口常用方法 ↑↑↑)

  但是,由于Set接口中的元素是无序的,因此没有与下标相关的方法

  例如:get(index)  remove(index)  add(index,obj) ... ...

 2、实现类  

  1)HashSet

    HashSet 底层是调用HashMap的相关方法,传入数据后,根据数据的hashCode进行散列运算。

    得到一个散列值后再进行运算,确定元素在序列中存储的位置。

    HashSet如何确定两个对象是否相等?(存储无序、唯一的数据)

      ① 先判断对象的hashCode(),如果hashCode不同,那肯定不是一个对象;

       如果hashCode相同,那继续判断equal方法。

      ② 重写equal()方法。

      >>>所以,使用HashSet存储实体对象时,必须重写hashCode()和equal()两个方法!

  2)LinkedHashSet

      LinkedHashSet:在HashSet的基础上,新建了一个链表。

      用链表来记录HashSet中元素放入的顺序,因此使用迭代器遍历时,可以按照放入的顺序依次读出元素

    

  3)TreeSet

    TreeSet:将存入的元素,进行排序,然后再输出。(二叉树原理)  

    如果存入的是实体对象:

    (1)那么实体类必须实现Comparable接口,并重写compareTo()方法

      Set<Person> set3 = new TreeSet<Person>();

      排序后,遍历输出:

         

      实现Comparable接口:

      

       重写compareTo()方法:

      

  

    (2)或者,也可以在实例化TreeSet的同时,通过构造函数传入一个比较器;     

       比较器:一个实现了Comparator接口,并重写了compare()方法的实现类的对象。

       ① 使用匿名内部类,拿到一个比较器对象。

          Set<Person> set = new TreeSet<Person>(new Comparator(){

           public int compare(Person p1,Person p2){

             return p1.getId() - p2.getId();

            }

          });

        

       ② 自定义一个比较类,实现Comparator 接口。

        Set<Person> set = new TreeSet<Person>(new Compare());

        class Compare implements Comparator(){

          // 重写compare方法。

        }

        

    [ Comparable接口 和 Comparator接口 的区别 ]

    ① Comparable 由实体类实现,重写compareTo()方法;

      实体类实现Comparable接口以后,TreeSet使用空参构造即可。

    ② Comparator 需要单独一个比较类进行实现,重写compare()方法。

      实例化TreeSet的时候,需要传入这个比较类的对象。

三、Map接口   

   以键值对的形式存储数据,以键取值;键不能重复,值可以重复。

 1、常用方法: 

     ① put(key,value): 向map的最后追加一个键值对;

     ② get(key): 通过键,取到一个值;

     ③ clear(): 清除map中的所有数据;

     ④ containsValue(obj): 检测是否包含指定的值;

       containsKey(obj): 检测是否包含指定的键。

     ⑤ replace(key,oid v,new v): 替换值

 2、实现类:

   1)HashMapHashTable

     区别:

         ① HashTable 是线程安全(线程同步)的,HashMap是线程不安全的(线程不同步);

      ② HashTable 的键不能为nullHashMap的键可以为null

   2)LinkedHashMap

     可以使用链表,记录数据放入的次序,读出的顺序和放入的顺序一致,与LinkedHashSet一样。

   3)TreeMap

      根据键的顺序,进行排序后,输出。(与TreeSet类似,参见上述TreeSet)

     如果传入的是实体对象,必须重写比较函数。(见TreeSet)

 3、遍历Map的方式:

  

  

Java集合框架知多少——干货!!!的更多相关文章

  1. Java集合框架面试题

    www.cnblogs.com/zhxxcq/archive/2012/03/11/2389611.html 这里的两个图很形象,由于放进图片链接,图片显示不了,所以只能给出该链接. Java集合框架 ...

  2. Java集合框架梳理(含经典面试题)

    Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构. 1. 整体框架 Java容器类库一共有两种主要类型:Collection ...

  3. 浅入深出之Java集合框架(中)

    Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

  4. Java集合框架总结

    java集合框架主要分为实现了Collection接口的List和Set.映射接口Map. |-- List 有序,元素都有索引,可重复. |-- Set 无序,不可以存储重复的元素. |-- Map ...

  5. Java集合-----java集合框架常见问题

    1什么是Java集合API Java集合框架API是用来表示和操作集合的统一框架,它包含接口.实现类.以及帮助程序员完成一些编程的算法. 简言之,API在上层完成以下几件事: ● 编程更加省力,提高城 ...

  6. Java集合框架详解(全)

    一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...

  7. Java集合框架体系JCF

    Java 集合框架体系作为Java 中十分重要的一环, 在我们的日常开发中扮演者十分重要的角色, 那么什么是Java集合框架体系呢? 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一 ...

  8. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类

    本文关键词: java集合框架  框架设计理念  容器 继承层级结构 继承图 集合框架中的抽象类  主要的实现类 实现类特性   集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...

  9. java集合框架综述

    一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...

随机推荐

  1. 【Pycharm】 写python代码的优秀IDE Pycharm

    Pycharm 在用pycharm之前,我一直用的是本身也是由python写的ulipad做我的IDE,在linux上的话就直接用vim编辑器.但是碰到pycharm之后觉得这玩意儿太NB了,虽然说不 ...

  2. 【Python】 list & dict & str

    list & dict & str 这三种类型是python中最常用的几种数据类型.他们都是序列的一种 ■ 序列通用操作 1. 分片   s[a:b] 返回序列s中从s[a]到s[b- ...

  3. 【Python】 xml转json

    虽然python有解析xml的模块,也有生成json的模块,但是没有把这两者连接起来的模块. 下面是以来自MIT的大神Martin Blech写的一个方便的模块,供大家参考.也别忘了在用之前先拜谢作者 ...

  4. 在用jQuery时遇到的小问题

    1. class类名问题? 在我在class ='看看(2)' ,凡是这样的居然给自身加其他style样式,居然添加不上,后来改成其他类名不带括号里的,居然好了. 2. line-height 引入的 ...

  5. jQuery中ajax方法无法执行回调函数问题

    最近遇到一个问题,发现使用jquery的ajax方法时,回调方法无法执行,而使用$.load()方法时却能正确返回数据.经过长时间调试最终发现是自己粗心大意,原来后台返回的是json数据,而返回的数据 ...

  6. 新手立体四子棋AI教程(2)——价值评估函数

    上一篇我们完成了整个程序的基础框架,那么在讲到真正的搜索算法前,我们先来看看五子棋如何评估当前局势,以及如何计算某个位置的价值. 一.五子棋 在五子棋中,包括成五,活三,活二等定势,下图为山东师范大学 ...

  7. Java实现单向链表基本功能

    一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...

  8. [react 基础篇]——React.createClass()方法同时创建多个组件类

    react 组件 React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 一个组 ...

  9. PTA 第二周作业 张乐

    题目1:整数的四则运算 1.实验代码 #include <stdio.h> int main() { int A,B; scanf("%d %d",&A,&am ...

  10. 第一次作业:来自一个奋斗的IT学子

    第一部分 结缘计算机 1.1你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 说起为何结缘了计算机,就得谈谈专业报考了,我觉得我的报考真是一个反面教科书了.由于高中以前每天只要想着 ...