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. WPF项目学习.二

    WPF用MVVM的解决记录 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案.  焦点的控制,键盘事件触发,输入框的数字限制,异步处理,隐藏状 ...

  2. PHP输出打印方法

    PHP这门语言灵活而充满众多的API和用法,然而在这个技术领域里却缺乏一些系统的总结归纳.或许这与PHP语言的诞生方式有关,衍生,快速变化,原始限制等等,诸多因素决定这门语言变得smarty,却没有人 ...

  3. 隱藏在素數規律中的Pi -- BZOJ1041解題報告

    退役狗在刷程書的過程中看到了一個有趣的視頻, 講解了一個有趣的問題. 在網上隨便搜索了一下居然還真的找到了一道以它爲背景的OI題目, BZOJ1041. 下面的內容會首先回顧一下視頻所討論的知識, 有 ...

  4. 函数重载overload

    与void show(int a, char b, double c){}构成重载的有: a) void show(int x, char y, double z){} //no b) int sho ...

  5. Windows API Finishing

    input { font-size: 14px; height: 26px } td { border-style: none; border-color: inherit; border-width ...

  6. DxPackNet 3.音频捕捉(录音)

    用DxpackNet捕捉音频其实很简单 1.初始化控件 IDxMicrophCapture microphone; private void Form1_Load(object sender, Eve ...

  7. #pragma预处理命令

    #pragma comment(lib,"XXX.lib") 表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样. #pragma comment(linke ...

  8. UVA - 1631 Locker 记忆化搜索

    题意:给定两个密码串,每次可以让1~3个相邻的密码向上或者向下滚动,每个密码是 ,问最少需要多少次滚动可以让原串成为目标串? 思路:假设当前要让第i位密码还原,我们可以同时转动,不同的转动方式会影响后 ...

  9. 在SpringBoot中使用FluentValidator验证插件

    前言 在我们编写项目的时候,在controller中往往离不开对一些数据的校验.这里并不是说对于这些数据业务上面的校验,而是对这些数据进行空校验或者是长度校验等. 有些时候校验可以省略,根据业务的需要 ...

  10. hbase 命令

    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服 ...