java面试知识点总结

1集合

1hashMap:

  1. 当链表为阈值8的时候,链表转红黑树:
    1. 容器中节点分布在hash桶中的频率遵循泊松分布;
    • ​ 看作者的注解:当为8的时候,依据泊松分布(离散形式).概率统计得出,当为8的时候,链表中的元素个数的概率已经非常小了;所以作者选择了元素个数为8;是根据概率统计而选择的;
    2加载因子是0.75?

    默认是0.75;是对空间和时间效率的一个平衡选择;

    根据散列表的查找效率取决于三个因素:散列函数,处理冲突的方法,和填装因子;其中,填装因子定义为一个表的装满程度;为表中记录数n/散列表长度m;记录越满,发生冲突的可能性越大,反之,可能性越小;

    ​ 根据hash值判断hash因子:put方法中

    3为啥hashmap数组的长度是2的幂次方? / 为啥扩容的时候,是2的幂次方?

    (1)hashmap用的哈希函数本质是除留余数法;也就是求模留余数;改进成了hascode高位异或右移16位的值;为了右移,用右移取代了求模;因为右移的速度快; (3)右移运算;和currentHashmap一样;

    (2)从存储方面来说,在操作系统的内存管理中,对于虚拟内存的技术实现;建立在请求分页存储管理;

    为方便地址转换:页面大小应该是2的整数幂;同时页面大小应该始终,负责页表会过长,占用大量内存;页面的大小也应该在空间效率和时间效率之间权衡;

    jdk1.7和jdk1.8的区别:

    用生成的hashcode值与&上数组长度大小-1之后的结果去put;

    ​ 1.7为链表+数组,1.8为链表+数组+红黑树

    ​ 头插法和尾插法

    ​ 1.7先判断是否扩容,在插入Entry对象;

    ​ 1.8先判断node对象是链表还是红黑树,在判断是否有这个元素;有则替换;没有则插入插入之后,再判断扩容&&如果是链表还要判断是否长度大于8且数组长度大于64;

2基本数据类型(java)

  1. 四类八种:

    byte,short int long

    boolean;

    float,double,

    char;两字节

  2. 大小分别是:8位,1个字节,2的7次方减1; 16位,2字节的short,32位,四字节的int,范围2的31次方-1,也就是21亿,64位八字节的long,阿里手册建议当位l的时候,后面写大写的L,float为32位的四字节;double为64位的8字节;

  3. 对于浮点数,比较相同的时候,不能用==或者equls都不行;浮点数采用的是 尾数+阶码的存储,有误差,可以用都小于某一个更小的值的时候,近似小于;

  4. 在JVM虚拟机虚拟方法栈中栈帧中,规定了64位的long和double占用两个变量槽(slot),其余的数据类型只占用一个;一个变量槽的大小占用多少比特,是完全由具体的虚拟机自行决定的《java虚拟机规范》这本书也写的这样应该是,HotSpot规定的是一个槽是四个字节;(网上查的,在深入理解JVM虚拟机-周志明的那本没写具体是多少,只说了是虚拟机自行决定)

3为什么用元空间替换永久代

自己的理解:方法区,在《Java虚拟机规范》中把方法区描述位堆的一个逻辑结构,但是它还有一个别名:非堆;

在1.8之前,人们把方法区和永久区混为一谈,主要原因是他们两个的垃圾收集器的分代设计在方法区使用了永久代的来实现而已;其实两者不同,并且这不是个好主意,导致更容易遇到内存溢出的问题;有一些极少数的方法会应为永久代的原因而导致在不同的虚拟机下有不同的表现;例如方法引用;

到了1.7,已经把原本放在永久代的字符串常量池,静态变量等移出;

到了1.8,终于完全的废弃了永久代的概念,改用和j9等一样在本地内存中实现的元空间,

4重写hashcode的时候需要重写equals:

从Object类的源码我们知道,默认的equals 判断的是两个对象的引用指向的是不是同一个对象;而hashcode也是根据对象地址生成一个十进制整数数值

(1)阿里强制】关于 hashCode 和 equals 的处理,遵循如下规则: 1) 只要覆写 equals,就必须覆写 hashCode。

(2)《Effective java》一书中这样说到:在每个覆盖了 equals() 方法的类中,也必须覆盖 hashCode() 方法,如果不这样做的话,就会违反 Object.hashCode 的通用的约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap,HashSet 和 HashTable。
————————————————

(3)为了保证是同一个对象,在 equals 比较相同的情况下 hashcode值必定相同;

1: set里面不允许有相同的值,若不重写,容易程序混乱;set放入一个元素首先判断hashcode的值,在比较equals的属性值;若不重写,需要从头比较每一个值的属性用equals();

2:hashmap:中.对于get方法.首先根据hashcode计算hash值,

​ 程序先进行 hashcode 的比较,如果不同,那没就不必在进行 equals 的比较了,这样就大大减少了 equals 比较的次数,这对比需要比较的数量很大的效率提高是很明显的,

5、创建对象的5种方式

①、通过 new 关键字

这是最常用的一种方式,通过 new 关键字调用类的有参或无参构造方法来创建对象。比如 Object obj = new Object();

②、通过 Class 类的 newInstance() 方法

这种默认是调用类的无参构造方法创建对象。比如 Person p2 = (Person) Class.forName(“com.ys.test.Person”).newInstance();

③、通过 Constructor 类的 newInstance 方法

这和第二种方法类时,都是通过反射来实现。通过 java.lang.relect.Constructor 类的 newInstance() 方法指定某个构造器来创建对象。

Person p3 = (Person) Person.class.getConstructors()[0].newInstance();

实际上第二种方法利用 Class 的 newInstance() 方法创建对象,其内部调用还是 Constructor 的 newInstance() 方法。

④、利用 Clone 方法 ----实现浅拷贝;

Clone 是 Object 类中的一个方法,通过 对象A.clone() 方法会创建一个内容和对象 A 一模一样的对象 B,clone 克隆,顾名思义就是创建一个一模一样的对象出来。

Person p4 = (Person) p3.clone();

⑤、反序列化 -----用序列化可以实现深拷贝;

序列化是把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。而反序列化则是把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。

具体如何实现可以参考我 这篇博文

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值