1.首先我们先讲下Collection接口

Collection接口:

  1. Collection是最基本的集合接口,它是由一个独立元素所组成的序列,这些元素服务一条或多条规则。一个Collection代表一组Object,即Collection的元素(Elements)。
  2. 有些Collection允许有相同的元素,另一些则不允许,有些可以进行排序,另一些则也不允许,Java SDK不提供直接继承Collection的接口,而是继承Collection的一些子接口,“如List,Set”接口。

Collection的一些方法:

主要方法:
boolean add(Object o)添加对象到集合
boolean remove(Object o)删除指定的对象
int size()返回当前集合中元素的数量
boolean contains(Object o)查找集合中是否有指定的对象
boolean isEmpty()判断集合是否为空
Iterator iterator()返回一个迭代器
boolean containsAll(Collection c)查找集合中是否有集合c中的元素
boolean addAll(Collection c)将集合c中所有的元素添加给该集合
void clear()删除集合中所有元素
void removeAll(Collection c)从集合中删除c集合中也有的元素
void retainAll(Collection c)从集合中删除集合c中不包含的元素

2.然后再说下List接口,Set接口和Map接口,当然顺便提一下Queue队列

List接口:

  1. List是有序的Collection,按照插入的顺序保存元素,使接口能够精确的控制每个元素插入的位置,用户能够根据索引来访问List中的元素。
  2. 实现List接口的常用类有:LinkedList,ArrayList,Vector和Stack。

Set接口:

  1. 核心点,Set是不包含重复元素的Collection(例:e1和e2都有e1.equals(e2)=false),允许有Null元素,但最多只能有一个Null元素。
  2. Set容器类主要有HashSet和TreeSet等。

      

Map接口:

  1. Map和List,Set接口有所不同,没有继承Collection。它是一组成对的“键值对”对象,允许通过键来查找值。
  2. Map提供key到value的映射,一个Map中不能包含有相同的key,一个key只能映射一个value(一对一的关系)。
  3. 实现Map接口的常用类有:HashTable,HashMap,WeekHashMap。

       

主要方法:
1.boolean equals(Object o)比较对象
2.boolean remove(Object o)删除一个对象
3.put(Object key,Object value)添加key和value
4.Hashtable类

 

Queue接口:

  1. Queue(又称"队列")它是一种特殊的线性表,按照排队规则来确定对象产生的顺序。
  2. 简单来说就是按照"先进先出"规则,表的前端部分用作删除操作,后端部分用作插入操作,前端删除部分称做:“队头”;后端插入部分称做:“队尾”。如果队列为空的话,又被称做:“空队列”。  

值得一提的是LinkedList也实现了Queue接口,所以也可以把LinkedList当做Queue来用。

3.一起探索下实现List接口的常用类:LinkedList,ArrayList,Vector和Stack

LinkedList类:

  1. LinkedList实现了List接口,允许Null元素,并且是线程不安全的(非线程安全),且无法随机访问,原因就是它的底层是通过链表实现的,若要从链表中删除或插入某一个对象,只需要改变前后对象的引用,所以在速度方面的话相对ArrayList要快一些。
  2. 此外LinkedList还提供了一些额外的方法:get(),remove(),insert()用作LinkedList的首部和尾部,这些方法主要可以用作堆栈(stack),队列(queue),双向队列(deque)。

注意:LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(…));

ArrayList类:

  1. ArrayList实现的是可变大小的数组,它允许所有元素,包括Null元素,并且也是线程不安全的(非线程安全),但是允许随机访问,原因就是它是数列结构(数组),此结构本身就适合随机访问。
  2. []数组,Vector,ArrayList的结构在随机访问,遍历和获得大小方面都是O(1)的性能。

注意:和LinkedList一样,ArrayList也是非同步的(unsynchronized)。一般情况下使用这两个就可以了。因为非同步,所以效率比较高,如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。

Vector类:

和ArrayList非常的类似,不同处就是,它是线程安全的,由Vector创建的Iterator(迭代器),本身和ArrayList创建的Iterator(迭代器)是同一个接口,但因为Vector是线程安全的,所以当一个Iterator(迭代器)被创建而且在被使用时,另一个线程会改变Vector的状态(例如:“添加”或“删除”一些元素),这时候调用Iterator(迭代器)的方法时会抛出异常:" ConcurrentModificationException",因此这个异常必须被捕获。

Stack类:

继承了Vector,实现“后进先出”的堆栈,Stack提供了5个方法让Vector当做堆栈被使用,基本的push()和pop()方法,还有peek方法取得栈顶的元素,empty方法判断堆栈是否为空,search方法检测一个元素在堆栈中的位置。

注:Stack刚创建后是“空栈”的

 

4.继续说说Set接口容器类中的HashSet和TreeSet

HashSet类:

HashSet类实现了Set接口,同样元素不可出现重复,不是同步的,不保证元素的顺序(无序),允许有值Null的元素,但最多只能有一个。

public class TestHashSet
{
public static void main(String [] args)
{
HashSet h=new HashSet();
h.add("1st");
h.add("2nd");
h.add(new Integer(3));
h.add(new Double(4.0));
h.add("2nd"); //重复元素,未被添加
h.add(new Integer(3)); //重复元素,未被添加
h.add(new Date());
System.out.println("开始:size="+h.size());
Iterator it=h.iterator();
while(it.hasNext())
{
Object o=it.next();
System.out.println(o);
} h.remove("2nd");
System.out.println("移除元素后:size="+h.size());
System.out.println(h);
}
}

TreeSet类:

TreeSet是Set的一种变体,同样不允许有重复元素,并且不允许有值为Null的元素,因为TreeSet具有排序特性,Null元素是无法进行排序的。它在将对象元素添加到集合中时,会按照某种比较规则将其插入到有序的对象序列中,并保证该对象集合按照“升序”排序。

public class TestTreeSet
{
public static void main(String [] args)
{
TreeSet ts=new TreeSet();
ts.add("orange");
ts.add("apple");
ts.add("banana");
ts.add("grape"); Iterator it=ts.iterator();
while(it.hasNext())
{
String fruit=(String)it.next();
System.out.println(fruit);
}
}
}

5.Map接口接口下常用类:HashTable,HashMap,WeekHashMap的那些事

HashTable类:

  1. HashTable继承了Map接口,实现了一个key-value映射的哈希表。任何非空的对象都可以作为key和value。
  2. 添加数据用put(key,vlaue),取出数据使用get(key,value),这两个基本操作的时间开销为常数。
  3. HashTable通过initial capacity和load factor两个参数调整性能。
  4. 作为key的对象将通过散列函数来查找与之相对应value的位置,因此任何作为key的对象都必须实现HashCode和equals的方法。

顺带谈下HashCode和equals的关系,equals和HashCode都继承子根类Object,如果要自定义类当做key的话,要小心,按照散列函数的定义,如果两个对象相同,obj1.equals(obj2)=true,则它们的HashCode一定相同,但如果两个对象不同的话,那么它们的HashCode不一定不同。如果两个对象的HashCode不同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。

HashMap类:

  1. HashMap与HashTable类似,不同的地方在HashMap是线程不安全的,并且允许Null,即null value,null key,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

HashTable和HashMap区别:

第一、继承不同。
  public class Hashtable extends Dictionary implements Map
  public class HashMap extends AbstractMap implements Map
第二、Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
第三、Hashtable中,key和value都不允许出现null值。在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
第四、两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
第五、哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
第六、Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

WeakHashMap类 
  WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以上就是我所学所看,然后根据前人的知识借鉴并总结归纳出来的结果,这也算是给自己一次巩固,再一次的学习。当然如果有不足之处还希望大家多多评价!来者不拒。谢谢大家浏览本内容!

JAVA容器的那些事—集合的更多相关文章

  1. java容器(数组和集合)内元素的排序问题

    package com.janson.day20180827; import java.util.*; /** * java中容器内对象的排序可以通过Collections.sort()和Arrays ...

  2. java容器---集合总结

    思考为什么要引入容器这个概念? Java有多种方式保存对象(应该是对象的引用),例如使用数组时保存一组对象中的最有效的方式,如果你想保存一组基本类型的数据,也推荐使用这种方式,但大家知道数组是具有固定 ...

  3. java se系列(十二)集合

    1.集合 1.1.什么是集合 存储对象的容器,面向对象语言对事物的体现,都是以对象的形式来体现的,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式.集合的出现就是为了持有对象.集 ...

  4. 【Java心得总结七】Java容器下——Map

    我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...

  5. 【Java心得总结五】Java容器上——容器初探

    在数学中我们有集合的概念,所谓的一个集合,就是将数个对象归类而分成为一个或数个形态各异的大小整体. 一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集.构成集合的事物或对象称作元素或是成 ...

  6. Java 容器(list, set, map)

    java容器类库的简化图: (虚线框表示接口, 实线框表示普通的类, 空心箭头表示特定的类实现了接口, 实心箭头表示某个类可以生成箭头所指的类对象) 继承Collection的主要有Set 和 Lis ...

  7. 3)Java容器

    3)Java容器   Java的集合框架核心主要有三种:List.Set和Map.这里的 Collection.List.Set和Map都是接口(Interface). List lst = new ...

  8. JAVA容器

    JAVA容器 一.容器体系结构 java.util 二.迭代器Iterator<E> 迭代器是一种设计模式,可以遍历并选择序列中的对象,而开发人员并不需要了解该序列的底层结构.迭代器通常被 ...

  9. Java 容器相关知识全面总结

    Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...

随机推荐

  1. 简易商品信息管理系统——首个Web项目

    正文之前 在学习了一段时间的Java Web的内容之后,当然需要有个项目来练练手,我相信大多数人的首选项目都是信息管理系统吧,所以我选择了商品信息管理系统 目前项目源码已全部上传至GitHub,欢迎大 ...

  2. 多路复用select

    多路复用I/O:一个执行体监视多个文件描述符对象的状态是否改变,一旦改变通知其他执行体来实现. 基本思想: 1. 先构造一张有关描述符的表,然后调用一个函数,当这些文件描述符中的一个或者多个已准备好进 ...

  3. [Python Study Notes] Python的安装

    Windows: 1.下载安装包: 转到Python官网https://www.python.org/downloads/  ,下载最新版本的Python. 2.安装 安装到自定义的安装路径下. 3. ...

  4. 用Markdown写微信公众号文章

    目前微信公众号的编辑器是不支持Markdown语法的,那怎么办呢? 有一款叫Markdown Here的插件可以解决这个问题(支持Chrome.Firefox.Safari). 官方网站:http:/ ...

  5. python爬虫登录

    python3 urllib.request 网络请求操作 http://www.cnblogs.com/cocoajin/p/3679821.html python实现 爬取twitter用户姓名 ...

  6. PHP中的http协议

    PHP中的http协议 http协议基本组成 报文:用于Http协议交互的信息 请求行:包括请求的方法,URL和HTTP协议版本 状态行:包括响应结果的状态码,状态描述和Http版本 首部字段:包括请 ...

  7. Python自动化--语言基础5--面向对象、迭代器、range和切片的区分

    面向对象 一.面向对象代码示例: 1 class Test(): #类的定义 2 car = "buick" #类变量,定义在类里方法外,可被对象直接调用,具有全局效果 3 def ...

  8. statement preparestatement CallableStatement

    大家都知道Statement.PrepareStatement 和CallableStatement 对象,其实它们是interface,为什么JDBC2.0中要提供这三个对象呢?对于Statemen ...

  9. 注册表命令 regedit32

    转自 https://zhidao.baidu.com/question/1958216489744783460.html Regedt32.exe 不支持注册表项文件 (.reg) 的导入和导出. ...

  10. Ubuntu14.04上安装Composer

    1,查看机子上有没有安装php 2,下载Composer的安装包 3,安装Composer 4,设置Composer全局可访问