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回收。

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

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

最新文章

  1. iOS10 远程推送代码 以及服务器端代码(.net)
  2. Unity3D热更新全书-下载 唯一的一篇
  3. Toolbar标题栏
  4. PhysX
  5. mv命令
  6. Dapper链接查询扩展
  7. 认识Web和HTTP
  8. 强大的数据库查询工具Database.NET 9.4.5018.42
  9. java中的String类常量池详解
  10. 使用Swagger辅助开发Fabric Application的Web API
  11. .NET Core脚本工具dotnet-script
  12. gulp配置(编译压缩转码自动刷新注释全)
  13. .net敏捷开发框架 力软敏捷开发(learun) 让开发变的更简单
  14. SharePoint 2013 使用 RBS 功能将二进制大型对象 BLOB 存储在内容数据库外部。
  15. SOCKS5 协议解析
  16. 安装12C小问题及pdb表空间配置
  17. 架构:The Onion Architecture : part 2(洋葱架构:第二篇)(转载)
  18. 【ST】【CF855B】 Marvolo Gaunt's Ring
  19. 转载 Python 操作 MySQL 的正确姿势 - 琉璃块
  20. [android] socket在手机上的应用

热门文章

  1. iis发布网站问题-由于权限不足而无法读取配置文件,无法访问请求的页面
  2. 启动mysql遇到1067问题
  3. vue 使用Jade模板写html,stylus写css
  4. Sping Boot入门到实战之入门篇(一):Spring Boot简介
  5. Yii小部件
  6. 蚂蚁爬杆问题 UVA 10881
  7. UVA1601 状态搜索
  8. HDU - 1907 John 反Nimm博弈
  9. Phpstrom操作git
  10. Java日期操作工具类