- 浏览: 91218 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
rihui1hao:
总的来说还是不错的
3、Session的get()/load( ...
hibernate总结 -
Jassicr:
相见恨晚呐
java常用算法分析和实现(一) -
xuhang1128:
这是我看过的最好的讲解jvm内存管理,谢谢lz
JVM内存管理:深入垃圾收集器与内存分配策略 -
zcr789654123:
...
StringUtils api 中文 英文 对照
1、Java容器类库的简化图,上面是集合类库更加完备的图。包括抽象类和遗留构件(不包括Queue的实现):
2、ArrayList初始化时不可指定容量,如果以new ArrayList()方式创建时,初始容量为10个;如果以new ArrayList(Collection c)初始化时,容量为c.size()*1.1,即增加10%的容量;当向ArrayList中添加一个元素时,先进行容器的容量调整,如果容量不够时,则增加至原来的1.5倍加1,再然后把元素加入到容器中,即以原始容量的0.5倍比率增加。
3、Vector:初始化时容量可以设定,如果以new Vector()方式创建时,则初始容量为10,超过容量时以2倍容量增加。如果以new Vector(Collection c)方式创建时,初始容量为c.size()*1.1,超过时以2倍容量增加。如果以new Vector(int initialCapacity, int capacityIncrement),则以capacityIncrement容量增加。
4、集合特点:
5、Hashtable和HashMap的区别: HashTable直接使用对象的hashCode:
int hash = key.hashCode();//直接使用键的hashCode方法求哈希值 //哈希地址转hash数组索引,先使用最大正int数与,这样将负转正数,再与数组长度求模得到存入的hash数组索引位置 int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用位运算&代替求模:
int hash = hash(k); int i = indexFor(hash, table.length); static int hash(Object x) { //以键本身的hash码为基础求哈希地址,但看不懂是什么意思 int h = x.hashCode(); h += ~(h << 9); h ^= (h >>> 14); h += (h << 4); h ^= (h >>> 10); return h; } static int indexFor(int h, int length) { return h & (length-1);//将哈希地址转换成哈希数组中存入的索引号 }
HashMap实现图:
6、集合中键值是否允许null小结
- List:可以有多个null,可以有重复值。
- HashSet:能插入一个null(因为内部是以 HashMap实现 ),忽略不插入重复元素。
- TreeSet:不能插入null (因为内部是以 TreeMap 实现 ) ,元素不能重复,如果待插入的元素存在,则忽略不插入,对元素进行排序。
- HashMap:允许一个null键与多个null值,若重复键,则覆盖以前值。
- TreeMap:不允许null键(实际上可以插入一个null键,如果这个Map里只有一个元素是不会报错的,因为一个元素时没有进行排序操作,也就不会报空指针异常,但如果插入第二个时就会立即报错),但允许多个null值,覆盖已有键值。
- HashTable:不允许null键与null值(否则运行进报空指针异常)。也会覆盖以重复值。基于线程同步。
7、对List的选择:
- 对于随机查询与迭代遍历操作,数组比所有的容器都要快。
- 从中间的位置插入和删除元素,LinkedList要比ArrayList快,特别是删除操作。
- Vector通常不如ArrayList快,则且应该避免使用,它目前仍然存在于类库中的原因是为了支持过去的代码。
- 最佳实践:将ArrayList作为默认首选,只有当程序的性能因为经常从list中间进行插入和删除而变差的时候,才去选择LinkedList。当然了,如果只是使用固定数量的元素,就应该选择数组了。
8、对Set的选择:
- HashSet的性能总比TreeSet好(特别是最常用的添加和查找元素操作)。
- TreeSet存在的唯一原因是,它可以维持元素的排序状态,所以只有当你需要一个排好序的Set时,才应该使用TreeSet。
- 对于插入操作,LinkedHashSet比HashSet略微慢一点:这是由于维护链表所带来额外开销造成的。不过,因为有了链表,遍历LinkedHashSet会比HashSet更快。
9、对Map的选择:
- Hashtable和HashMap的效率大致相同(通常HashMap更快一点,所以HashMap有意取代Hashtable)。
- TreeMap通常比HashMap慢,因为要维护排序。
- HashMap正是为快速查询而设计的。
- LinkedHashMap比HashMap慢一点,因为它维护散列数据结构的同时还要维护链表。
10、Stack基于线程安全,Stack类是用Vector来实现的(public class Stack extends Vector),但最好不要用集合API里的这个实现栈,因为它继承于Vector,本就是一个错误的设计,应该是一个组合的设计关系。
11、Iterator对ArrayList(LinkedList)的操作限制:
- 刚实例化的迭代器如果还没有进行后移(next)操作是不能马上进行删除与修改操作的。
- 可以用ListIterator对集合连续添加与修改,但不能连续删除。
- 进行添加操作后是不能立即进行删除与修改操作的。
- 进行删除操作后可以进行添加,但不能进行修改操作。
- 进行修改后是可以立即进行删除与添加操作的。
12、当以自己的对象做为HashMap、HashTable、LinkedHashMap、HashSet 、LinkedHashSet 的键时,一定要重写hashCode ()与equals ()方法,因为Object的hashCode()是返回内存地址,且equals()方法也是比较内存地址,所以当要在这些hash集合中查找时,如果是另外new出的新对象是查不到的,除非重写这两个方法。因为AbstractMap类的containsKey(Object key)方法实现如下:
if (e.hash == hash && eq(k, e.key))//先比对hashcode,再使用equals return true; static boolean eq(Object x, Object y) { return x == y || x.equals(y); }
String对象是可以准确做为键的,因为已重写了这两个方法。
因此,Java中的集合框架中的哈希是以一个对象查找另外一个对象,所以重写hasCode与equals方法很重要。
13、重写hashCode()与equals()这两个方法是针对哈希类,至于其它集合,如果要用public boolean contains(Object o)或containsValue(Object value)查找时,只需要实现equals()方法即可,他们都只使用对象的 equals方法进行比对,没有使用 hashCode方法。
14、TreeMap/TreeSet:放入其中的元素一定要具有自然比较能力(即要实现java.lang.Comparable接口)或者在构造TreeMap/TreeSet时传入一个比较器(实现java.util.Comparator接口),如果在创建时没有传入比较器,而放入的元素也没有自然比较能力时,会出现类型转换错误(因为在没有较器时,会试着转成Comparable型)。
两种比较接口:
//自然比较器 public interface java.lang.Comparable { public int compareTo(Object o); } public interface java.util.Comparator { int compare(Object o1, Object o2); boolean equals(Object obj); }
15、Collection或Map的同步控制:可以使用Collections类的相应静态方法来包装相应的集合类,使他们具线程安全,如public static Collection synchronizedCollection (Collection c)方法实质返回的是包装后的SynchronizedCollection子类,当然你也可以使用Collections的synchronizedList、synchronizedMap、synchronizedSet方法来获取不同的经过包装了的同步集合,其代码片断:
public class Collections { //... static Collection synchronizedCollection(Collection c, Object mutex) { return new SynchronizedCollection(c, mutex); } public static List synchronizedList(List list) { //... } static Set synchronizedSet(Set s, Object mutex) { //... } public static Map synchronizedMap(Map m) { return new SynchronizedMap(m); } //... static class SynchronizedCollection implements Collection, Serializable { Collection c; // 对哪个集合进行同步(包装) Object mutex; // 对象锁,可以自己设置 //... SynchronizedCollection(Collection c, Object mutex) { this.c = c; this.mutex = mutex; } public int size() { synchronized (mutex) { return c.size(); } } public boolean isEmpty() { synchronized (mutex) { return c.isEmpty(); } } //... } static class SynchronizedList extends SynchronizedCollection implements List { List list; SynchronizedList(List list, Object mutex) { super(list, mutex); this.list = list; } public Object get(int index) { synchronized (mutex) { return list.get(index); } } //... } static class SynchronizedSet extends SynchronizedCollection implements Set { SynchronizedSet(Set s) { super(s); } //... } //... }
包装的代码可以看出只是把原集合的相应方法放在同步块里调用罢了。
16、通过迭代器修改集合结构
在使用迭代器遍历集合时,我们不能通过集合本身来修改集合的结构(添加、删除),只能通过迭代器来操作,下面是拿对HashMap删除操作的测试,其它集合也是这样:
public static void main(String[] args) { Map map = new HashMap(); map.put(1, 1); map.put(2, 3); Set entrySet = map.entrySet(); Iterator it = entrySet.iterator(); while (it.hasNext()) { Entry entry = (Entry) it.next(); /* * 可以通过迭代器来修改集合结构,但前提是要在已执行过 next 或 * 前移操作,否则会抛异常:IllegalStateException */ // it.remove(); /* * 抛异常:ConcurrentModificationException 因为通过 迭代 器操 * 作时,不能使用集合本身来修 * 改集合的结构 */ // map.remove(entry.getKey()); } System.out.println(map); }
发表评论
-
SAX,DOM,JAXP,JDOM,DOM4J比较
2010-11-17 18:26 1695第一:首先介绍一下SAX,DOM,JAXP,JDOM,DOM4 ... -
java序列化和反序列化总结(转)
2010-11-13 21:18 880把Java对象转换为字节序列的过程称为对象的序列化。 ... -
一次Java垃圾收集调优实战(转)
2010-11-13 18:52 6671 资料 JDK5.0垃圾收集优化之--Don't Pa ... -
编写对GC友好,又不泄漏的代码
2010-11-13 18:33 605作者:江南白衣,最新 ... -
JVM内存管理:深入垃圾收集器与内存分配策略(转)
2010-11-13 18:24 583概述: 说起垃圾收集(Garbage Collection ... -
JVM内存管理:深入Java内存区域与OOM(转)
2010-11-13 18:13 641Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的 ... -
java线程安全总结(转)
2010-11-13 17:46 717浅谈java内存模型 ... -
注解(Annotation)使用详解(转)
2010-11-13 15:33 638注解(Annotation) 为我们在代码中天界信息提供了一 ... -
java泛型总结2
2010-11-13 14:55 6321 Java 泛型设计中的一些 ... -
java泛型总结1
2010-11-13 14:54 766//泛型代码 public class Pair< ... -
java反射机制总结
2010-11-12 20:18 1207经过多方面的资料 ... -
java异常总结
2010-11-12 18:20 866本文重在Java中异常机制的一些概念。写本文的目的在于方便我很 ... -
java IO总结
2010-11-12 17:14 582Java 流在处理上分为字 ... -
java对String字符串对象的创建以及管理总结
2010-11-12 16:33 835经常看到很多人讨论java ... -
java内部类总结
2010-11-12 15:18 828内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一 ... -
JVM内存管理:深入垃圾收集器与内存分配策略
2010-11-12 14:12 895Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的 ... -
jdk1.5垃圾回收机制
2010-11-12 13:59 1162Java开发Server最大的障碍,就是JDK1.4版之前的的 ... -
垃圾回收算法总结
2010-11-12 13:09 468最近找工作,被问了2次 ... -
Java的垃圾回收总结
2010-11-12 12:55 701内存是稀缺的资源,哪怕内存一块钱一条!如果在编程中使用不当,再 ...
相关推荐
Java集合框架总结Java集合框架总结Java集合框架总结Java集合框架总结Java集合框架总结Java集合框架总结
本文档为本人学习 java 集合框架期间的学习总结笔记,希望对新学习的朋友有所帮助和参考价值。本人java 开发时间不是太长,可能存在不完善或不对之处,欢迎指正!
Java集合框架使用总结 前言: 本文是对Java集合框架做了一个概括性的解说,目的是对Java集合框架体系有个总体认识,如果你想学习具体的接口和类的使用方法,请参看Java API文档。 一、概述 数据结构对程序设计...
JAVA集合框架,java框架总结,java集合框架,java集合框架学习,java集合框架类
(六)集合框架学习总结.pdfcorejava集合框架学习总结.pdfcorejava集合框架学习总结.pdfcorejava集合框架学习总结.pdfcorejava集合框架学习总结.pdfcorejava集合框架学习总结.pdfcorejava集合框架学习总结.pdf
java集合框架总结 Collection体系结构 ArrayList源码解读 HashMap HashSet 深入讲解java集合框架
本文档先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析。 Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架...
Java 集合框架总结 特别详细,深入剖析
Java集合框架做深入浅出的分析,有系统总结,以及常见错误等等
TreeSet会调用集合元素的compareTo(Objectobj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序。(比较的前提:两个对象的类型相同)。java提供了一个Comparable接口,该接口里定义了...
集合框架底层数据结构总结 先来看⼀下 Collection 接⼝下⾯的集合。 List Arraylist : Object[] 数组 Vector : Object[] 数组 LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环) Set HashSet ...
java集合框架的知识总结,内含代码讲解,知识点概括,带你更好理解java集合框架。。。。像Map集合的概念,遍历方式等
Servlet总结.doc hibernate总结.doc 集合总结.doc Spring.doc Ajax总结.doc 有关于Java三大框架的知识点总结
农民专业合作社土地入股合同.pdf
超详细的集合框架总结,用法,比较,一网打尽java集合内容!超详细得集合框架知识图谱,如果你下载你会感觉超值