----------android培训 java培训 ---------期待与您交流
1.当向ArrayList添加一个对象时,实际上就是将该对象放置到了ArrayList底层所维护
的数组当中;当向 LinkedList 中添加一个对象时,实际上 LinkedList 内部会生成一个
Entry 对象,该 Entry 对象的结构为:
Entry
{
Entry previous;
Object element;
Entry next;
}
其中的 Object 类型的元素 element 就是我们向 LinkedList 中所添加的元素,然后 Entry
又构造好了向前与向后的引用 previous、 next,最后将生成的这个 Entry 对象加入到了链
表当中。 换句话说, LinkedList 中所维护的是一个个的Entry对象。
2. 关于 Object 类的 equals 方法的特点
a) 自反性: x.equals(x)应该返回true
b) 对称性:x.equals(y)为true,那么y.equals(x)也为true。
c) 传递性: x.equals(y)为true并且y.equals(z)为true,那么x.equals(z)也应该为true。
d) 一致性: x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n
次调用也应该为 true,前提条件是在比较之间没有修改 x 也没有修改 y。
e) 对于非空引用 x,x.equals(null)返回false。
3. 关于 Object 类的 hashCode()方法的特点:
a) 在 Java 应用的一次执行过程当中,对于同一个对象的 hashCode 方法的多次调用,
他们应该返回同样的值(前提是该对象的信息没有发生变化)。
b) 对于两个对象来说,如果使用 equals 方法比较返回 true,那么这两个对象的hashCode
值一定是相同的。
c) 对于两个对象来说,如果使用 equals 方法比较返回 false,那么这两个对象的hashCode
值不要求一定不同(可以相同,可以不同), 但是如果不同则可以提高应用的性能。
d) 对于 Object类来说,不同的Object对象的hashCode值是不同的(Object类的hashCode
值表示的是对象的地址)。
4. 当使用 HashSet 时, hashCode()方法就会得到调用,判断已经存储在集合中的对象的
hash code 值是否与增加的对象的 hash code 值一致;如果不一致,直接加进去;如
果一致,再进行 equals 方法的比较, equals 方法如果返回 true,表示对象已经加进
去了,就不会再增加新的对象,否则加进去。
5. 如果我们重写 equals 方法,那么也要重写 hashCode 方法,反之亦然。
6. Map(映射):Map的keySet()方法会返回key的集合,因为Map的键是不能重复的,
因此 keySet()方法的返回类型是 Set;而 Map 的值是可以重复的,因此 values()方法
Entry 对象,该 Entry 对象的结构为:
Entry
{
Entry previous;
Object element;
Entry next;
}
其中的 Object 类型的元素 element 就是我们向 LinkedList 中所添加的元素,然后 Entry
又构造好了向前与向后的引用 previous、 next,最后将生成的这个 Entry 对象加入到了链
表当中。 换句话说, LinkedList 中所维护的是一个个的Entry对象。
2. 关于 Object 类的 equals 方法的特点
a) 自反性: x.equals(x)应该返回true
b) 对称性:x.equals(y)为true,那么y.equals(x)也为true。
c) 传递性: x.equals(y)为true并且y.equals(z)为true,那么x.equals(z)也应该为true。
d) 一致性: x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n
次调用也应该为 true,前提条件是在比较之间没有修改 x 也没有修改 y。
e) 对于非空引用 x,x.equals(null)返回false。
3. 关于 Object 类的 hashCode()方法的特点:
a) 在 Java 应用的一次执行过程当中,对于同一个对象的 hashCode 方法的多次调用,
他们应该返回同样的值(前提是该对象的信息没有发生变化)。
b) 对于两个对象来说,如果使用 equals 方法比较返回 true,那么这两个对象的hashCode
值一定是相同的。
c) 对于两个对象来说,如果使用 equals 方法比较返回 false,那么这两个对象的hashCode
值不要求一定不同(可以相同,可以不同), 但是如果不同则可以提高应用的性能。
d) 对于 Object类来说,不同的Object对象的hashCode值是不同的(Object类的hashCode
值表示的是对象的地址)。
4. 当使用 HashSet 时, hashCode()方法就会得到调用,判断已经存储在集合中的对象的
hash code 值是否与增加的对象的 hash code 值一致;如果不一致,直接加进去;如
果一致,再进行 equals 方法的比较, equals 方法如果返回 true,表示对象已经加进
去了,就不会再增加新的对象,否则加进去。
5. 如果我们重写 equals 方法,那么也要重写 hashCode 方法,反之亦然。
6. Map(映射):Map的keySet()方法会返回key的集合,因为Map的键是不能重复的,
因此 keySet()方法的返回类型是 Set;而 Map 的值是可以重复的,因此 values()方法
的返回类型是Collection,可以容纳重复的元素。
7. HashSet 底层是使用 HashMap 实现的。 当使用 add 方法将对象添加到 Set 当中时,
实际上是将该对象作为底层所维护的 Map 对象的 key,而 value 则都是同一个 Object
对象(该对象我们用不上);
8. HashMap 底层维护一个数组,我们向 HashMap 中所放置的对象实际上是存储在该数
组当中;
9. 当向 HashMap 中 put 一对键值时,它会根据 key 的 hashCode 值计算出一个位置,
该位置就是此对象准备往数组中存放的位置。
10. 如果该位置没有对象存在,就将此对象直接放进数组当中;如果该位置已经有对象
存在了,则顺着此存在的对象的链开始寻找( Entry 类有一个 Entry 类型的 next 成员
变量,指向了该对象的下一个对象), 如果此链上有对象的话,再去使用 equals 方
法进行比较,如果对此链上的某个对象的 equals 方法比较为 false,则将该对象放到
数组当中,然后将数组中该位置以前存在的那个对象链接到此对象的后面。
11,当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式
来实现循环或遍历,而不要使用增强的 for 循环,因为它丢失了下标信息。
集合中存放的依然是对象的引用而不是对象本身。
12. ArrayList 底层采用数组实现,当使用不带参数的构造方法生成 ArrayList对象时,实际上会在底层生成一个长度为10的Object 类型数组
13. 如果增加的元素个数超过了 10 个,那么 ArrayList 底层会新生成一个数组,长度为原数组的 1.5 倍+1, 然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。
14. 对于 ArrayList 元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高。
15. 集合当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中。
16. 集合当中放置的都是 Object 类型,因此取出来的也是 Object 类型,那么必须要使用强制类型转换将其转换为真正的类型(放置进去的类型)。
17. 关于 ArrayList 与 LinkedList 的比较分析
a) ArrayList 底层采用数组实现, LinkedList 底层采用双向链表实现。
b) 当执行插入或者删除操作时, 采用 LinkedList 比较好。
c) 当执行搜索操作时, 采用 ArrayList 比较好。
本帖最后由 feng_0207 于 2014-11-3 19:49 编辑 java中集合框架共有三大接口分别为 Collection接口,Iterator接口,Map接口1,Collection继承结构 Collection |----List 接口,不能被实例化 允许有重复内容,有序 |----ArrayList 非线程安全 |----LinkedList 非线程安全 |----Vector 线程安全 |----Set 接口,不能被实例化 不允许有重复内容,无序,靠hashCoke()和equals()进行重复验证 |----HashSet 无序存放 |----TreeSet 有序存放 按Comparable排序 Collection主要方法 boolean add(Object o):将对象添加给集合boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o int size() :返回当前集合中元素的数量boolean isEmpty() :判断集合中是否有任何元素boolean contains(Object o) :查找集合中是否含有对象oIterator iterator() :返回一个迭代器,用来访问集合中的各个元素 boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素boolean addAll(Collection c) : 将集合c 中所有元素添加给该集合void clear(): 删除集合中所有元素void removeAll(Collection c) : 从集合中删除集合c 中的所有元素void retainAll(Collection c) : 从集合中删除集合c 中不包含的元素 Object[] toArray() :返回一个内含集合所有元素的arrayObject[] toArray(Object[] a) :返回一个内含集合所有元素的array。运行期返回的array和参数a的型别相同,需要转换为正确型别。 2,Map继承结构 Map 接口,不能被实例化 |----HashMap 非线程安全,允许有null |----HashTable 线程安全,不允许有null |----TreeMap 有序,按key排序 Map主要方法: Object put(Object key, Object value): 将互相关联的一个关键字与一个值放入该映像。如果该关键字已经存在,那么与此关 字相关的新值将取代旧值。方法返回关键字的旧值,如果关键字原先并不存在,则返回null Object remove(Object key):从映像中删除与key相关的映射void putAll(Map t):将来自特定映像的所有元素添加给该映像void clear():从映像中删除所有映射Object get(Object key):得与关键字key相关的值,并且返回与关键字key相关的对象,如果没有在该映像中找到该关键字,则返回nullboolean containsKey(Object key):判断映像中是否存在关键字keyboolean containsValue(Object value):判断映像中是否存在值valueint size():返回当前映像中映射的数量boolean isEmpty():判断映像中是否有任何映射 3,Iterater Iterater 迭代输出 Collections, java集合工具类 |