学习 java 002 Java中的容器
2012-09-12 01:17
232 查看
1 简述
简述java中支持的容器类型,介绍其特点,及其使用方法。2 Java中容器的使用
2.1 Java中容器与数组的比较
容器是用来保存多个对象的东西.严格来说是保存对象的引用.因为对象实际的数据是放在另外的地方的.放在容器中的只是指向那块内存区域的一个标识.JAVA中内置了数组.数组和其它容器的区别主要有三个:效率,类型,和存放基本类型的能力.JAVA中的数组是一种效率最高的存储和随机访问对象引用序列的方式.它就是一个简单的线性序列,所以访问是非常快.但它也损失了其他的特性.当创建一个数组时,它的长度就被固定了.通常是创建一个固定大小的数组,在空间不足时,再创建一个大的数组,然后把旧数组中的所有引用移到新数组中.这种机制被JAVA中的另一个容器:ArrayList采用.所以,ArrayList的效率要比数组低.JAVA中还有一些其他的容器:List,Set(每个对象只保存一份),Map(允许将一个对象和另一对象关联存储).它们都是针对Object来处理的.而Object是JAVA中所有类的基类,所以说这些容器可以存放所有JAVA类.
注意:基本类型如:boolean char byte short long float double void..不继承Object,所以这些容器不能存放这些.如果要存进去必须用JAVA为这些类提供的 包装类它们对应的包装类是: Boolean Character Byte Short Integer Long Float Double Void
因为基本类型是不继承自Object的,所以强制转换也是不可能的.必须用包装类进行强制转换.比如说将一个String强制转换成int型,必须:Integer.praseInt("3");必须用包装类
经包装类包装后的基本类型就可以随便往容器里放了.
JAVA容器的缺点:
1)将对象保存到容器的时候它的类型信息就丢失了.因为容器是针对Object的.所以可以将不同类型的对象放入同一个容器中.而数组则不同,一个数组里只能存同一类型的对象.
2)在从容器中取出对象使用时必须进行类型转换.
当然,上面的问题可以通过泛型来解决.
2.2 如何选择容器
容器实际上只有三种:Map , List, Set;但每种接口都有不同的实现版本.它们的区别可以归纳为由什么在背后支持它们.也就是说,你使用的接口是由什么样的数据结构实现的.List的选择:
比如:ArrayList和LinkedList都实现了List接口.因此无论选择哪一个,基本操作都一样.但ArrayList是由数组提供底层支持.而LinkedList是由双向链表实现的.所以,如果要经常向List里插入或删除数据,LinkedList会比较好.否则应该用速度更快的ArrayList.
Set的选择
HashSet总是比TreeSet 性能要好.而后者存在的理由就是它可以维持元素的排序状态.所以,如果需要一个排好序的Set时,才应该用TreeSet
Map选择:
同上,尽量选择HashMap,只要需要排好序的确Map时才用Treemap
Java各种容器比较
描述 | 支持基本类型 | 支持对象类型 | 自动改变大小 | 线程安全 | 速度 | 操作 | |
array | 基本类型数组 | Yes | Yes | No | No | Very Fast | 插入、删除O(n);查找O(1) |
ArrayList | 可动态增缩的索引序列 | No | Yes | Yes | No | Fast | 插入、删除O(n);查找O(1) |
LinkedList | 在任何位置插入、删除的有序序列 | No | Yes | Yes | No | Fast | 插入、删除O(1);查找O(n) |
Vector | Java 1.0保留容器 | No | Yes | Yes | Yes | Slow | 插入、删除O(n);查找O(1) |
描述 | 线程安全 | |
HashSet | 没有重复元素的集合。存入HashSet的对象必须定义hashCode() | No |
TreeSet | 保持次序的Set,底层为树结构 | No |
LinkedSet | 具有HashSet的查询速度,且内部使用链表维护元素顺序 | No |
描述 | 线程安全 | |
HashMap | 存储键/值对的数据结构 | No |
HashTable | 存储键/值对的数据结构 | Yes |
TreeMap | 键有序的map集合。TreeMap是唯一带有subMap()方法的Map,它可以返回一个子树 | No |
LinkedHashMap | 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是插入时的顺序 | No |
WeakHashMap | 该map集合中的值如果没有在其他地方被使用,则可以被垃圾回收器回收 | No |
IdentityHashMap | 使用==代替equals()对“键”进行比较的散列映射。 | No |
2.3 容器使用方法
参照c++中相应的使用相关文章推荐
- [置顶] Java容器学习--ArrayList源码分析
- Java 学习笔记(0x11) 容器
- java学习之 容器Collection接口---hashCode
- Java学习总结11——基础类库2(容器1)
- Java容器——JSTL学习笔记
- Java视频学习笔记:基础(四)之对象容器
- Java学习笔记—多线程(同步容器和并发容器)
- java基础学习(12)容器-2
- Java编程思想学习笔记_4(异常机制,容器)
- java学习之旅59--模拟ArrayList容器的底层实现_JDK源码分析ArrayList
- Java并发学习笔记(10)线程同步容器
- Java学习:容器(未完成)
- [ Java学习 ] 查阅资料整理 002
- [Java] Swing系列-顶层容器JFrame使用的学习体会
- 【5】Java容器类学习
- Java学习笔记-----中间件,组件,容器,框架的精彩理解
- 【java学习之容器总结】
- Java学习资料-Java容器
- 《Java高并发程序设计》学习 --3.3 JDK的并发容器
- Java中的容器详细讲解学习