反射是指将一个类的成员映射成相对应的java类型。
Class是反射的核心。
JVM中每个Class实例都指向一个数据类型(class或者interface),而这个实例又包含有class的所有信息。
JVM创建的class 的实例Class具有唯一性。
创建一个实体类Person:
因为Class实例在JVM中是唯一的,所以,上述方法获取的Class实例是同一个实例。可以用==比较两个Class实例:
注意一下Class实例比较和instanceof的差别:
用instanceof不但匹配指定类型,还匹配指定类型的子类。而用双等于判断class实例可以精确地判断数据类型,但不能作子类型比较。
通常情况下,我们应该用instanceof判断数据类型,因为面向抽象编程的时候,我们不关心具体的子类型。只有在需要精确判断一个类型是不是某个个class的时候,我们才使用双等于判断class实例。
不考虑反射,正常场景:
考虑反射,同样也是需要靠构造方法来创建对象的。
Spring组件即通过反射使用无参构造方法创建bean:
Spring组件即通过反射使用有参构造方法创建bean:
成员:
补充:
泛型的本质是类型参数化。
允许在定义类、接口、方法时使用类型形参,当使用时指定具体类型。
所有使用该泛型参数的地方都被统一化,保证类型一致。
如果未指定具体类型,默认是Object类型。
体系中的所有类都增加了泛型,泛型也主要用在。
泛型优点:
定义一个接口泛型:
因为>通配符既没有extends,也没有super,因此:
格式:类型名称 extends 类> 对象名称
意义:只能接收该类型及其子类
格式:类型名称 supper 类> 对象名称
意义:只能接收该类型及其父类
对比extends和super通配符
作为方法参数, extends T>类型和 super T>类型的区别在于:
一个是允许读不允许写,另一个是允许写不允许读。
泛型是提供给javac编译器使用的,它用于限定的输入类型,让编译器在源代码的级别上,即挡住向中插入非法数据。但编译器编译完带有泛型的java程序后,生成的class文件中将不再带有泛型信息,以此使程序运行效率不受影响,这个过程称之为“擦除”。
由于类型被擦除了,为了维持多态性,所以编译器就自动生成了桥接方法。
jvm不认识泛型,会把泛型擦除掉
ArrayList和Vector的区别是:ArrayList是线程不安全的,当多条线程访问同一个ArrayList时,程序需要手动保证该的同步性,而Vector则是线程安全的
数据结构:数组
数据结构:双向链表
数据结构:数组+链表+红黑树
把key的hashhcode值,区分为高半区16位和低半区16位;
取异或时,相同为0,不同为1。(实则干扰的是从0位到size-16位的数据,干扰函数)
初始化数组大小为16、负载因子为0.75、阈值为16*0.75=12。
(hashmap中元素个数大于12,或者链表长度大于8时,需要扩容,数组长度和阈值都变为原来的两倍,resize函数中决定)
扩容时会将原来的数组元素进行重排。
计算数组下标是根据(hash值)和(数组大小-1)的按位与的值。(这就决定了int类型的0、16、···、128、······都在数组下标为0的链表中)
如map.put(0, “a0”),那么hash值为0000,数组大小为16,则下标为(16-1)&0 = 1111&0000 = 0000 = 0;
map.put(16, “a16”),那么hash值为10000,数组大小为16,则下标为(16-1)&16 = 1111&10000 = 0000 = 0;
为什么是8 和64?
因为链表长度小于8的时候效率比红黑树高,红黑树的插入需要旋转比较耗时;
数组大于64才转,是防止空的太多(数组上没挂链),防止浪费内存。
红黑树的性质:
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://jaq.tttmy.cn/news/3668.html