1.HashMap键值不允许重复,重复会覆盖之前的键值对,显示的是最后的键值对。
2.HashSet存放的是某种类型的数据,如果数据重复,就不会往集合里添加数据,显示的是之前的数据
3.map,set都是无序的,LinkedHashMap跟LinkedHashSet是有序的(相对有序),LinkedHashMap键值也是不允许重复,如果最后一个数据跟之前重复,那LinkedHashMap最后一个数据是排在后面且跟之前无重复键值的数据
public class ExampleUnitTest {
private boolean playflag=false;
String key="status";
private Set<String> hashset=new HashSet();
private LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
private String letters[] = { "a", "b", "c", "d", "e","b" };
@Before
public void init() {
System.out.println(letters.length);
for (int i = 0; i < letters.length; i++) {
map.put(letters[i], i + 1);
if(!hashset.add(letters[i]))
System.out.println("repeat"+i);
}
for (String s : map.keySet()) {
System.out.println("key= " + s + " and value= " + map.get(s));
}
for(Integer string :map.values()){
System.out.println("value is "+string);
}
System.out.println("---unsortmap-----");
Map<String, Integer> m = new HashMap<>();
for (int i = 0; i < 10; i++) {
m.put("key" + i, i);
}
System.out.println(m);//{key=value}的形式 map是无序!
}
@Test
public void testGetHead() {
assertEquals(getHead(map).getKey(), "a");
assertEquals(getHead(map).getValue(), Integer.valueOf(1));
}
@Test
public void testGetTail() {
System.out.println(map.size());
System.out.println(hashset.size());
assertEquals(getTail(map).getKey(), "e");
assertEquals(getTail(map).getValue(), Integer.valueOf(5));
}
@Test
public void testGetTailByReflection() throws NoSuchFieldException, IllegalAccessException {
assertEquals(getTailByReflection(map).getKey(), "e");
assertEquals(getTailByReflection(map).getValue(), Integer.valueOf(5));
}
public <K, V> Map.Entry<K, V> getHead(LinkedHashMap<K, V> map) {
return map.entrySet().iterator().next();
}
public <K, V> Map.Entry<K, V> getTail(LinkedHashMap<K, V> map) {
Iterator<Map.Entry<K, V>> iterator = map.entrySet().iterator();
Map.Entry<K, V> tail = null;
while (iterator.hasNext()) {
tail = iterator.next();
}
return tail;
}
@SuppressWarnings("unchecked")
public <K, V> Map.Entry<K, V> getTailByReflection(LinkedHashMap<K, V> map)
throws NoSuchFieldException, IllegalAccessException {
Field tail = map.getClass().getDeclaredField("tail");
tail.setAccessible(true);
return (Map.Entry<K, V>) tail.get(map);
}
}
4.HashMap操作时key是不能重复的,如果重复则肯定会覆盖之前的内容
使用IdentityHashMap,key允许重复,只要两个对象的地址不相等即可
HashMap比较的是equals,IdentitiHashMap比较的是对象地址(是引用而不是值)
map = new HashMap(); // 实例化Map对象
map.put(new Person(“张三”, 30), “zhangsan_1”); // 增加内容
map.put(new Person(“张三”, 30), “zhangsan_2”); // 增加内容,key重复
map.put(new Person(“李四”, 31), “lisi”);
Output:
姓名:李四;年龄:31 –> lisi
姓名:张三;年龄:30 –> zhangsan_2
map = new IdentityHashMap(); // 实例化Map对象
map.put(new Person(“张三”, 30), “zhangsan_1”); // 增加内容
map.put(new Person(“张三”, 30), “zhangsan_2”); // 增加内容,key重复
map.put(new Person(“李四”, 31), “lisi”); // 增加内容
Output:
姓名:张三;年龄:30 –> zhangsan_2
姓名:张三;年龄:30 –> zhangsan_1
姓名:李四;年龄:31 –> lisi