2020-11-1

一、Java中的protected关键字
1.protected关键字用于访问控制权限;
2.protected的可见性在于两点:
2020-11-1
基类的protected成员是包内可见的,并且对子类可见;
若子类和基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的 protected方法,而不能访问基类实例的protected方法(也就是可以使用自己的protected方法而不能使用父类的方法);

对于(1)而言,clone()方法来自于类MyObject2本身,因此其可见性为包P2及Myobject2的子类,虽然Test2是MyObject2的子类,但在Test2中不能访问基类MyObject2的protected方法clone(),因此编译不通过;对于(2)而言,由于在Test2中访问的使其本身实例从基类继承而来的clone(),因此编译可以通过;
3.对于protected关键字的访问权限还有一点很重要的是声明这些类实例的代码所在的类与需要调用的方法的位置关系!!!!
2020-11-1

对于(1)和(3)来说,其中的f()方法从类Father1继承而来,其包的可见性是包p1及其子类son1和son11,而由于调用的f()方法的类Test1所在的包也是p1,因此(1)(3)处编译通过。其次,对于(2)(4),其中的clone()方法的可见性是java.lang包及其所有的子类,对于两个clone()方法,其可见性是在类Son1和Son1,但对于Test1是不可见的,因此此处(2)(4)处编译不通过。
二、Java中的方法引用相当于lambda表达式
System.out::println是一个方法引用,它等价于lambda表达式 x -> System.out.println(x);
三、Java集合中Map集合的更新映射的方法
1、default V merge(K key, V value, Bifunction<? super V ,? super V, ? extends V> remappingFunctuion )
如果key 与一个非null值关联,将函数引用到V和value,将key与结果关联,或者如果结果为null,则删除这个键,否则将key与value相关联,返回get(key)
例如couns.merge(word,1,Integer::sum);
2、default V compute(K key,Bifunction<? super K ,? super V, ? extends V> remappingFunctuion )
将函数引用到key和get(key),将结果与Key关联,或者如果结果为null,则删除这个键。
3.default void replaceAll(Bifunction<? super K ,? super V, ? extends V> remappingFunctuion ))
在所有的映射项上引用函数,将键与非null结果关联,对于null结果,则将相应的键删除;
四、Java集合中的映射视图
1.有3中映射视图:键集、值集合以及键/值对集;下面的方法会返回这3中视图:
Set keySet()
Collection values()
Set<Map.Entry<K,V>> entrySet()
注:可以在这些集中删除元素,将从映射中删除,但不能增加任何元素;
2.对于通过entrySet()方法获取的的对象,可以通过getKey()以及getValue()方法来同时查看键和值;
五、Java集合中的弱散列映射(WeakHashMap)
这个集合主要用于解决当映射中的键已经消除,但对应的对象没有被删除时,JVM虚拟机跟踪到映射对象是活动的,因此无法回收这个对应的对象的问题。WeakHashMap主要是使用弱引用(weak references)来保存键;
六、Java集合中的链接散列表与映射(.LinkedHashSet和LinkedHashMap)
1.LinkedHashSet和LinkedHashMap类用来记住插入元素项的顺序(Linked开头的集合的作用都是记住元素插入集合的顺序)。避免散列表中的项从表面上看是随机排序的。
下图就是链接散列表的数据结构:
2020-11-1

2.可以使用LinkedHashMap<k,v>(initialCapacity,loasFactor,true)去构建一个将用访问顺序,而不是插入顺序对映射条目进行迭代。每次调用get或put,受影响的条目将从当前的位置删除,并放到条目链表的尾部。也就是说,位于链表后部的数据时经常使用的,位于前部的数据是不经常使用的。
七、Java集合中的枚举集与映射(EnumSet、EnumMap)
1.EnumSet是一个枚举类型元素集的高效实现;EnumSet类没有公共的构造器,主要使用静态工厂方法构造这个集;
allOf(class type):返回一个包含给定枚举类型的所有值的集;
noneOf(class type):返回一个空集,但有足够的空间保存所给定的枚举类型的所有值
2.EnumMap是一个键类型为枚举类型的映射;
Enum<Weekday,Employee> personInCharge = new Enum<>(Weekday.class);在构造器中指定键的类型;
八、Java集合中的标识散列映射(IdentityHashMap)
在这个类中键的散列值不是用hashcode函数计算的,而是用System.identityHashCode方法来进行计算,即不是根据对象的内存地址来计算散列码
!!!也就是说,不同键的对象,既使内容相同,也被视为不同的对象,但是对于HashMap来说,内容相同的键就被视为相同的键。