精华内容
下载资源
问答
  • 新建一个继承HashMap的Bean @Data @EqualsAndHashCode(callSuper = true) public class R<T> extends HashMap<String,Object> implements Serializable { private T data; } 进行fastjson...

    新建一个继承了HashMap的Bean

    @Data
    @EqualsAndHashCode(callSuper = true)
    public class R<T> extends HashMap<String,Object> implements Serializable {
    
        private T data;
    
    }

    进行fastjson进行序列化和反序列化

    public static void main(String[] args) {
       R r = new R();
       r.setData("1");
       String s = JSONObject.toJSONString(r);
       R r1 = JSONObject.parseObject(s,R.class);
       System.out.println(r1.getData());
    }

     结果输出null

    R如果不继承HashMap,结果输出“1”

    这是为什么呢???

    我们进一步观察可以看到,其实是R在序列化的时候就为{},所以反序列化也为null

    可以用debug去看下fastjson的源码:

    以上是fastjson的源码,会将Map类型的javaBean强转为Map类型,所以子类的私有属性都会被丢弃,而又是不是所有都会转化为Map类型呢?不是的

    可以看到,如果使用Map.class.isAssignableFrom(clazz)判断就会进入Map的处理方式中,看来fastjson是对map进行了特殊封装

    那么spring自带的jackson呢?

    public static void main(String[] args) {
       R<String> r = new R<>();
       r.put("test","1");
       r.setData("1");
       ObjectMapper build = new Jackson2ObjectMapperBuilder().build();
       System.out.println(r.getData());
       String s = null;
       try {
          s = build.writeValueAsString(r);
       } catch (JsonProcessingException e) {
          e.printStackTrace();
       }
       System.out.println(s);
    }
    

    不出意料,以上代码也是输出为:

    1
    {"test":"1"}

    其中“data”属性并没有被带上

    我们也可以进入jackson的源码中分析下:

    可以看到,jackson也是在不断的尝试寻找Serializer,但是并没有通过常规的方式找到,我们进入这个_createAndCacheUntypedSerializer方法,它是返回了一个MapSerializer序列化器

    找不到了,反正是返回了一个MapSerializer.....

    然后我们可以继续往下面看,看这个MapSerializer是怎么进行序列化的

    到了以上这步就很明显了,Object作为实参,而Map作为形参,所以会有类型强制转化的操作,相当于进行了向上转型,导致了子类中的私有变量消失了

    至此,我们得出了结论,继承了HashMap的实体类的私有属性,通过fastjson与Jackson都是不能被序列化与反序列化的

     

    展开全文
  • JAVA基础 接口与继承 HashMap使用

    千次阅读 2018-11-29 09:08:05
    抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量 接口不可继承抽象类,抽象类可实现多个接口。接口与接口之间是继承,用...mport java.util.HashMap; import java.util.Map; interface T...

    https://blog.csdn.net/u010575093/article/details/50731281
    

    抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量
    接口不可继承抽象类,抽象类可实现多个接口。接口与接口之间是继承,用extends,可继承多个接口

    mport java.util.HashMap;
    import java.util.Map;
    
    interface Test{
            public void mm();
    }
    
    interface Test1{
            public void kk();
    }
    //接口可以继承多个接口
    interface Test2 extends Test, Test1{
            public void mk();
    }
    //抽象类成员都是public,
    //抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。
    //抽象类可以继承接口,并实现接口方法
    abstract class ATest1 implements Test1{
            public void kk(){  System.out.println("ATtest mm");  }
    }
    
    abstract class ATest2 implements Test1, Test{
            public void mm(){       System.out.println("ATest2 mm");        }
            public void kk(){}
    }
    // 抽象类可以继承抽象类 也可以继承实体类
    abstract class ATest3 extends ATest1{
    
    }
    
    class Solution{
    	//时间复杂度n
            public void tosum(int[] nums, int target){
                    Map<Integer, Integer> map = new HashMap<>();
                    for(int i = 0; i < nums.length; i++)
                            map.put(nums[i],i);
                    for(int i = 0; i < nums.length; i++){
                            int comp = target - nums[i];
                            System.out.println("comp="+comp+" containsKey "+map.containsKey(comp));
                            System.out.println("map get "+map.get(comp));
                            if(map.containsKey(comp) && map.get(comp)!=i){
                                    System.out.println("match:"+i+" "+map.get(comp));
                            }
                    }
                    System.out.println("tosum");
            }
            //时间复杂度1
            public int[] tosum1(int[] nums, int target){
                    Map<Integer, Integer> map = new HashMap<>();
                    for (int i = 0; i < nums.length; i++) {
                            int complement = target - nums[i];
                            if (map.containsKey(complement)) {
                                    return new int[] { map.get(complement), i };
                            }
                            map.put(nums[i], i);
                    }
                    throw new IllegalArgumentException("No two sum solution");
            }
    }
    class HashSum{
    
            public static void main(String argv[]){
                    System.out.println("111");
                    new Solution().tosum();
            }
    }
    
    
    展开全文
  • 代码实践中,碰到一个小问题,实现类A继承HashMap 并实现了BeanPostProcessor接口。结果在应用启动,容器初始化工程并没有按照预期执行类A中postProcessBeforeInitialization实现方法。 解决 定义一个简单类,实现...

    问题场景

    代码实践中,碰到一个小问题,实现类A继承了HashMap 并实现了BeanPostProcessor接口。结果在应用启动,容器初始化工程并没有按照预期执行类A中postProcessBeforeInitialization实现方法。

    解决

    定义一个简单类,实现BeanPostProcessor,在B的postProcessBeforeInitialization方法中实现A要做的逻辑。

    展开全文
  • public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable public class LinkedHashMap<K,V> extends HashMap<K,V> implements...

    JDK源码的类定义

    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
    
    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
    

    可以发现LinkedHashMap extends HashMap已经被动实现了Map,
    为什么还需要主动 implements Map
    以下将自己建立接口,模仿业务逻辑,从设计的角度分析这个问题

    自己重现JDK设计

    理清楚类的关系,去考虑自己设计这种类应该注意什么方面

    建立 LinkedHashMap 的依赖关系

    public interface Map {
        public void get();
    }
    
    public class HashMap implements Map {
        @Override
        public void get() {
            System.out.println("HashMap实现Map接口的方法");
        }
    }
    

    LinkedHashMap 不主动实现 Map

    public class LinkedHashMap extends HashMap {
        @Override
        public void get() {
            System.out.println("linkedHashMap的get方法");
        }
    }
    

    使用自建的 LinkedHashMap

    public class MyApplication {
    
    	/**
         * @param map 多态的实现,可以传入LinkedHashMap 或者HashMap
         */
        private static void doMapAction(Map map){
            map.get();
        }
        
        public static void main(String[] args) {
            LinkedHashMap linkedHashMap = new LinkedHashMap();
            doMapAction(linkedHashMap);
        }
    }
    

    遇到重构任务

    • 任务:HashMap 要进行升级,HashMap implements Map 修改成 HashMap implements SuperMap

    重构出现问题

    • 问题:修改HashMap实现,doMapAction会报错
            LinkedHashMap linkedHashMap = new LinkedHashMap();
            doMapAction(linkedHashMap); // 报错,方法声明为Map, linkedHashMap不再是Map的多态实现
    

    解决问题

    解决以上的问题,其实很简单,只需要把LinkedHashMap的类定义主动实现Map
    public class LinkedHashMap extends HashMap implements Map

    结论

    从两种设计的类图来看:
    public class LinkedHashMap extends HashMap
    在这里插入图片描述
    public class LinkedHashMap extends HashMap implements Map
    在这里插入图片描述
    doMapAction(Map map)的业务逻辑兼容HashMap的改动
    在这里插入图片描述
    implements Map 的设计思想就是把Map 作为 LinkHashMap直接依赖
    从工具类的语义上,方法doMapAction(Map map) 不用关心HashMap 类的设计,是一种解耦。

    展开全文
  • 继承于map或者list或者set后,在其他对于这个类的操作时需要特别注意,比如,使用fastjson等工具类进行转换成json时将不会转换map、list、set之外的属性。举例,A类继承list后,又在A类中添加了一个name属性,如果...
  • 继承HashMap类,重写了toString()方法。

    千次阅读 2008-04-22 13:53:00
    //定义一个HashMapSon类,它继承HashMap类 class HashMapSon,V> extends HashMap { //重写HashMapSon类的toString()方法  @Override public String toString(){  Set,V>> keyset = this.entrySet();  Iterator,V>...
  • 分析LinkedHashMapLinkedHashMap是继承HashMap的一个子类,除了包含HashMap的方法外,还提供了removeEldestEntry方法,该方法在源码中实现:protected boolean removeEldestEntry(Map.Entry,V> eldest) { ...
  • HashMap继承Map

    千次阅读 2018-03-09 12:27:53
     import java.util.HashMap;import java.util.Map;import java.util.Set; /** *HashMap 类 ,是Map接口的实现类 * 特点: * 1:内部是依靠哈希表存储 * 2:不允许键的重复 * 3:允许null键和null值的出现 * ...
  • HashMap

    2019-09-06 16:27:38
    HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改 HashMap是非synchronized,所以HashMap很快HashMap可以接受null键和值,而Hashtable则不能(原因就是equlas()方法...
  • 一张图看懂java HashMap继承关系

    千次阅读 2018-08-05 12:34:20
    这是JDK1.8.0_151下的HashMap类定义: public class HashMap&lt;K,V&gt; extends AbstractMap&lt;K,V&gt; implements Map&...根据类定义,追根刨底,看看HashMap继承结构图: ...
  • HashMap如何添加元素详解

    千次阅读 2020-03-16 14:18:15
    Map接口结构 ...MapHashMapLinkedHashMapHashtable实现map接口实现map接口继承HashMap实现map接口MapHashMapLinkedHashMapHashtable HashMap特点 存储结构在jdk1.7当中是数组加链表的结构,在jdk1...
  • 继承HashMap,如 SortHashMap extends HashMap ,然后HashMap里面的每个Node都增加指向before、after的变量,即所有节点构成一个具有顺序的链表(双向链表),每次添加Key/Value时,安装某中顺序插入链表中,这里按...
  • 转自:十二页 的 《为什么HashMap继承了AbstractMap还要实现Map接口》 原址:https://blog.csdn.net/u011392897/article/details/60141739   jdk中HashMap的声明如下  public class HashMap&lt;K,V&...
  • 1、HashMap 继承与接口关系图 2、HashSet 继承与接口关系(HashSet 独立图) 3、List 、ArrayList 、HashSet、Set、关系图  
  • 前言 之前看源码一直忽略了这个现象,按理说HashMap的父类AbstractMap已经实现了Map,它为什么还要实现一次呢?遂上网查了一下,背后原因让人...为什么HashMap继承了AbstractMap还要实现Map接口Why does LinkedHa...
  • HashMap的面试题,HashMap扩容,put方法流程图,继承关系以及集合类的成员   在了解完上一篇HashMap的文章后,同学在面试时,面试官可能会问以下几个问题:    1.当两个对象的hashCode相等时会...
  • 细心的人可能对HashMap类的定义有疑问,JDK源码中是这样定义的: ...AbstractMap已经实现了Map接口,HashMap继承了AbstractMap,为什么还要实现Map接口呢? 网络上有些细心的人对这样的写法有疑问,解答
  • java源码-HashMap类设计

    2018-08-15 10:57:00
    map(内部interface Entry<K,V>)->abstractMap(定义视图 entrySet抽象方法)->hashMap(静态内部类Node...TreeNode继承 LinkedHashMap.Entry 继承HashMap.Node 转载于:https://www.cnblogs.com/1ssqq1lxr/...
  • HashMap原理

    2020-10-25 22:36:13
    HashMap原理讲解1.HashMap继承体系图2.Node数据结构3.底层存储结构图4.put数据原理图5.什么是Hash碰撞?6.什么是链化?7.jdk8为什么引入红黑树?8.HashMap扩容原理? 1.HashMap继承体系图 这张图上最重要的接口...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 156,506
精华内容 62,602
关键字:

继承hashmap