Map 集合的整理 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
hashmap : 无序存放 , 新的操作类, key 不可以重复 , 内部结构是哈希表
hashtable : 无序存放 , 旧的操作类, key 不允许重复 ,内部结构是哈希表
treemap : 可以排序的 map 集合,按集合中的 key 排序, key 不允许重复,内部结构是二叉树
weakhashMap :弱引用的 map 集合,当集合中的某些内容不再使用时,清除掉无用的数据,使用 gc 进行回收, system.gc( );
identityHashMap ; key 可以重复的 map 集合,
1 :怎么样让 hashmap 实现迭代排序
如果 hashmap 中,想要有迭代顺序,也就是怎么样存就怎样取,那么就使用 linkedhashmap, 就可以实现, hashmap 本身是无序的。
2 :判断指定的 key 和 value 是否存在
使用 map 接口中提供的 containskey ( object key ) .containsValues(object value) 两个方法
3 :为什么还要继承使用 enumeration ?
在旧的的系统或者是类库中,还在使用 enumeration 接口,所以掌握很有必要
vector 中的 Enumeration 最早的迭代输出接口,在 1,5 之后被 iterator 给替代。用法和 iterator 相似
4 : map 与 collection 之间的区别?
collection set list 接口属于单值操作,每次只操作一个对象。
map ,每次操作一对对象,即二元偶对象, map 中的每个元素都使用 key-value 的形式存储在集合中, map 接口定义
map 一般很少直接输出,只是作为查询使用的
collection 接口在开发中主要作用就是传递内容及输出的
5 : Map.entrySet Map.keyset
1 : Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。获得映射项引用的唯一 方法是通过此 collection 视图的迭代器来实现。
2 : map.entry 是 map 内部定义的一个接口,专门来保存 key --value 的内容
3 : map.entry 是使用 static 关键字声明的内部接口,此接口可以由外部通过外部类。内部类直接调用
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
4: map 中提供一个 keyset 的方法,可以讲 map 中的全部 key 变为一个 set 集合,一旦实例化,可以直接使用迭代方法输出,注意保证 set 集合中指定的泛型和 map 中的可以的泛型要保持一致
由于 hashmap 没有迭代方法,不可以直接取出,只能通过转为 set 集合,然后使用迭代方法,来间接取出元素
使用 keyset 遍历得到 key 的值
Set<String> s =map.keySet();// 实例化接口
Iterator<String> it = s.iterator();// 使用迭代方法取出元素
简写
Iterator<String> it=map.keySet().iterator();
使用了 entryset 得到集合中相对应的集合值,遍历出来的
Set<Entry<String,String>> s1 = map.entrySet();
Iterator<Entry<String, String>> it2 =s1.iterator();
简写
Iterator<Entry<String, String>> it2 =map.entrySet().iterator();
6: hashmap 与 hashtable 之间的区别
1 : hashmap 是 jdk1.2 之后推出的,属于新的操作类, hashtable 是 jdk1.0 推出的,属于旧的操作类
2 : hashmap 采用异步处理方式,性能更高, hashtable 采用同步处理方式,性能较低
3 : hashmap 属于非线程安全的操作类, hashtable 属于线程安全的操作类
treemap 在 map 中可以发现:数据是经过排序的,按照 key 排序
排序子类, hashmap hashtable 在存放数据时没有对齐排序,在输出的时候 key 都是无序的,但是 treemap 的主要功能是按 key 进行排序
7: 注意使用 Key 可能出现的问题
注意:使用自定义类作为 key 时类需要实现 comparable 接口
treemap 可以按照 key 排序,之前的代码使用的是 String 类作为 key ,因为 String 类本身已经实现了 comparable 接口
所以程序执行时,不会有任何问题,而如果使用一个自定义的类作为 key ,则此类必须实现 compareable 接口,否则将会转换异常
8: weakHashMap 集合,弱引用集合
jdk1.2 开始, java 把对象引用分为 4 种级别,从而使程序能更加灵活地控制对象的生命周期, 4 种级别分别为 : 强引用,软引用,弱引用,虚引用
强引用:当内存不足时,虚拟机宁可出现内存溢出,使程序停止,也不会回收此对象来释放空间
软引用:当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存
弱引用:无论内存是否紧张,被垃圾回收器发现立即回收
虚引用:和没有任何引用一样
9: 不能直接使用迭代输出 map 中的全部内容:
对于 map 接口来说,其本身是不能直接使用迭代进行输出的,因为 map 中每个位置存放的是一对值( key -value ) , 而使用 iterator 中每次只能找到一个值,所以如果非要使用迭代进行输出,则必须按照以下步骤完成,
1 ,将 map 的实例通过 entryset ()方法变为 set 接口对象
2 ,通过 set 接口实例化为 iterator
3 ,通过 iterator 迭代输出,每个内容的 map.entry 的对象
4 ,通过 map.entry 进行 key --value 的分离
10: 关于 map 中重复的键值存在的解决办法
使用 hashmap 的过程中,不允许有重复的键值存在,不允许键值为空,如但是如果在编写过程中,出现了增加两个相同的元素, hashmap ,只会打印出一个值,另一个被覆盖了。
但是如果在使用过程中,内容一样,但是使用此类的地址值不一样的话( key1 ! =key2 )就表示不是重复的 key, 可以添加到集合中,使用 IdentityHashMap 集合 它可以有重复的可以存在,只要两个对象的地址值不同的话,可以解决覆盖问题
11 : foreach 和 iterator 两个方法
使用了 foreach 和 iterator 两个方法分别输出
Set<Map.Entry<String,String>> all =map.entrySet();
// 将 map 接口实例化成一个 set 接口实例
Iterator<Map.Entry<String, String>> it =all.iterator();
// 声明 iterator 的对象,实例化该对象
while (it.hasNext()) {
Map.Entry<String, String> ss = it.next();// 找到 map.entry 实例,实现该对象
System.out.println(ss.getKey()+"\t"+ss.getValue());
}
System.out.println("----------------------------");
for (Map.Entry<String, String> aa : map.entrySet()) {
System.out.println(aa.getKey()+"\t"+aa.getValue());
}
12 : collection 和 collections 两者之间的区别
--collection 集合框架的顶层接口
--collections 工具类,都是用于操作集合的静态方法
collections 里面的方法, list 的排序,最值的获取,比较器的逆转,可以将非同步的集合转换为同步集合,实现安全性
collection 是集合框架的顶层接口,两个常用的接口, list set
13 :关于构造器的摘要
如果一个类,没有构造方法摘要,说明该类不可以创建对象
如果在该类中还有静态方法,说明该类应该提供静态返回该类型的对象的方法,而且只有一个,说明使用了单例