黑马程序员_关于java中的集合

时间:2023-02-18 09:43:18

----------android培训  java培训 ---------期待与您交流

1.当向ArrayList添加一个对象时,实际上就是将该对象放置到了ArrayList底层所维护
的数组当中;当向 LinkedList 中添加一个对象时,实际上 LinkedList 内部会生成一个
Entry 对象,该 Entry 对象的结构为:
Entry
{
Entry previous;
Object element;
Entry next;
}
其中的 Object 类型的元素 element 就是我们向 LinkedList 中所添加的元素,然后 Entry
又构造好了向前与向后的引用 previousnext,最后将生成的这个 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) 对于非空引用 xx.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(映射):MapkeySet()方法会返回key的集合,因为Map的键是不能重复的,
因此 keySet()方法的返回类型是 Set;而 Map 的值是可以重复的,因此 values()方法

的数组当中;当向LinkedList中添加一个对象时,实际上 LinkedList 内部会生成一个
Entry 对象,该 Entry 对象的结构为:
Entry
{
Entry previous;
Object element;
Entry next;
}
其中的 Object 类型的元素 element 就是我们向 LinkedList 中所添加的元素,然后 Entry
又构造好了向前与向后的引用 previousnext,最后将生成的这个 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) 对于非空引用 xx.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(映射):MapkeySet()方法会返回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对象时,实际上会在底层生成一个长度为10Object 类型数组
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集合工具类