HashMap,LinkedHashMap,IdentityHashMap,HashSet之间的异同

1.HashMap键值不允许重复,重复会覆盖之前的键值对,显示的是最后的键值对。
2.HashSet存放的是某种类型的数据,如果数据重复,就不会往集合里添加数据,显示的是之前的数据。
3.map,set都是无序的,LinkedHashMap跟LinkedHashSet是有序的4.HashMap操作时key是不能重复的,如果重复则肯定会覆盖之前的内容。

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);
 }
 }

使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值