Java中用的最多的类(之一) 容器类
2017-02-27 11:21
162 查看
java容器类的两大接口
collection和map,是Java容器类中的最主要的两个接口。其他容器类都是从这两个接口中派生出来的。collection:可以认为是基础的线性表,旗下继续派生出两个子接口:list和set。
map:可以认为是基础的键值对集合
collection接口
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中不包含
Iterator:所有的集合类都继承了这个接口。可以配合for-each循环获得集合的所有元素,而不需要知道具体细节
这些操作也是集合类中最常用的操作,不多说了,我先背这些方法去了。。
collections:这是一个工具类,提供了很多方法来对collections进行操作。与collection分清。
List和Set
这是继承自collection接口的两个接口,分别拓展了不同的作用List:加入了“有序”的概念,可以使用户控制插入元素的位置(collection不行)。也可以使用位置(数组下标?)直接访问元素。
包括:ArrayList,LinkedList,Vector,Stack等
Set:这个集合中的元素是不能重复的。即
e1.equals(e2) = false。
包括:HashSet,TreeSet等
以上两个接口继续往下拓展,下面即是用的最多的各种collection实现类了
List旗下
ArrayList:用的最多,表面上看是更加灵活、容量可变的数组,实际上底层实现也是数组。所以擅长随机访问,不擅长随机增删。长度自动增长是由复制粘贴算法实现,所以如果大数据存放,事先应该设置大小
LinkedList:底层实现是链表,所以更加擅长增删,不擅长随机访问。此外LinkedList提供额外的get(),remove(),insert()方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
以上两个类都是线程不安全的,如果需要线程安全,请使用下面这个类
Vector:可以认为是线程安全的ArrayList。迭代器在别的线程改变元素时,会抛出异常(上面两个类不会)。
Stack:继承自Vector,是一个堆栈。提供push()、pop()等方法进行堆栈操作。
Set旗下
HashSet:使用哈希表来实现Set,不允许重复,访问速度快,允许包含值为null的元素。底层使用了hashmap进行实现。哈希表是一种用空间换时间的数据结构,访问速度快。
TreeSet:是一种排序的Set,插入时即确保顺序,底层使用TreeMap进行实现
底层实现是map,表现出来connection(笑)
Map接口
这个接口定义了一种键值对的集合,一个Map中不能包含相同的key,每个key只能映射一个 value。主要方法:
boolean equals(Object o) //比较对象 boolean remove(Object o) //删除一个对象 put(Object key,Object value) //添加key和value
以下是几个主要的实现类
HashTable:实现了一个key-value的哈希表,get()和put()操作实现添加和取出。Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。哈希表需要在时间和空间方面取舍。
这个类是线程安全的,不允许空元素(null)
按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。
如果需要用自己定义的类作为key,为了避免上面的冲突,需要同时复写equals方法和hashCode方法,而不要只写其中一个。
HashMap:类似hashtable,不同的是,这个类是非同步的,并且允许null存在
WeakHashMap:WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
以上只是简单地说了说java中常用的集合类,其实每个类展开都能讲很多,还需要在日常使用中多加熟练。
相关文章推荐
- Java实现-装最多水的容器
- leetcode-java.T011_ContainerWithMostWater 找两条竖线然后这两条线以及X轴构成的容器能容纳最多的水
- Java容器分析--Map
- java 容器学习记录1
- Java容器类学习心得
- JAVA中用动态代理类实现记忆功能(二)
- Java中用 Servlet Listener 实现定时监听
- Java基础 - 容器和集合
- Java中的容器
- java中数组和容器的转换
- JAVA中用动态代理类实现记忆功能(一)
- JAVA中用动态代理类实现记忆功能(一)
- [收藏] Java中用Servlet容器实现程序监听
- Java容器
- JAVA 实现容器源码
- java不同容器不同操作系统下中文问题解决方法
- JAVA中用动态代理类实现记忆功能(二)
- java 5.0:范型导致的容器不兼容性。
- Java容器类学习心得,欢迎拍砖
- java基础 ---Swing窗口容器和布局