java 面试突击-(1-10)
Posted 栗子~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 面试突击-(1-10)相关的知识,希望对你有一定的参考价值。
文章目录
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
java 面试突击-(1-10)
01 JDK、JRE、JVM什么区别
JDK是java给开发者提供的开发工具(包含于JRE)
JRE是运行的环境(包含于JVM)
JVM是虚拟机,用来编译解析class文件,目的是让操作系统运行
02 == 和 equals的区别
相同点:
- == 和 equals 在java中都是用来比较的方法
- Object的equals方法比较的也是栈中的值,因为Object默认的equals方法就是==,不过我们一般会重写该方法,比如String 的equals方法重写的结果就是比对字符串的内容。
不同点:
- 比对的是栈中的值,即基本数据类型的变量,但不能比对引用类型的变量,
一般我们重写后的equals 除了基本数据类型的变量外也可以比对引用类型的变量(引用类型比对的是堆中对象的地址)。
03 hashcode()与equals()的作用、区别和联系
首先我们要知道hashcode()和equals()都是比较对象的方法。
区别:
hashcoe():获取哈希码,获取int整数,该值为哈希表里的索引位置,通过该索引位置可以快速在堆中找到该对象所在的位置,主要的作用就是快速检索所需的值。
equals():java提供的一个对比的方法,如果不重写,那么Object.equals()比较的逻辑就是==(比较的栈中的值)
问:既然有hashcode了,为什么还需要equals。
答:因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠
hashcode与equals联系:
- 如果两个对象相等,那么hashcode一定是相等的;
- 两个对象相等,对两个对象分别调用equals方法都返回true;
- 两个对象有相同的hashcode值,它们也不一定是相等的;
- equals 方法被覆盖过,则hashcode方法也必须被覆盖;
- hashcode的默认行为是对堆上的对象产生独特值,如果没有重写hashcode(),则两个class对象无论如何都不会相等(即使这两个对象指向相同的数据);
使用:
hashset利用hashcode检测重复
原理:
对象加入hashset时,hashset会先计算对象的hashcode值来判断对象加入的位置,看该位置是否有值,
如果没有值,hashSet会假设对象没有重复出现;
如果有值,调用equals()方法来检查两个对象是否真的相同,
若相同HashSet不会让其加入;
若不同,就会重新散列到其他位置;
这样就大大减少了equals的次数,相应的提高执行效率。
04 重载和重写的区别
区别:
- 重载是同一个类下的概念,重写是父子类下的概念。
- 重载:方法名相同,参数个数、参数顺序、参数类型不同,重写:发生在父子类中方法名和参数列表必须相同
- 重载当方法返回值和访问修饰符不同的时候,编译的时候就会报错,如下:
public int add(String a);
public String add(String a);
编译的时候就会报错
重写:返回值范围小于等于父类,抛出的异常小于等于父类,访问修饰符权限大于等于父类。
如果父类的访问修饰为private时,不可重写。
05 final的作用
概念:最终的
- 当final修饰在类上时,表示此类不可被继承;
- 当final修饰在方法上时,表示此方法不可以被覆盖,可以被重载;
- 当final修饰在基本数据类型变量上时,此变量的值不可被修改;
- 当final修饰在引用数据类型变量上时,此变量的地址不可以改变,值可以改变;
- 当final修饰在局部变量时,使用之前必须必须赋值;
06 为什么局部内部类和匿名内部类只能访问局部final变量?
原因:
因为内部类和外部类是同级的存在,内部类不会随着外部类的结束而结束,这个时候,JVM的解决办法就是通过复制一份变量给到内部类,同时保证该变量不可变,所以局部内部类和匿名内部类只能访问局部final变量。
07 String、StringBuffer,StringBuilder的区别?
区别:
- 操作上的区别,String为final类,有不可变的属性,即每次操作String类型的对象都会生成一个新的对象
而StringBuffer和StringBuilder是在原来对象上操作,不会生成新的对象。
注:所以当对一个字符串操作频繁的时候,使用StringBuffer和StringBuild - 线程安全上的区别:
String线程安全,因为字符串是不可变的,所以是线程安全的.
StringBuffer线程安全,因为StringBuffer里的每个方法上都加上了synchronized
StringBuilder线程不安全的
08 String为什么是final类型的
- 实现字符串常量池,只有当字符串是不可变时字符串池才有可能实现,字符串池的实现可以在运行时节约很多 heap 空间,因为不同的字符串变量都指向池中的同一个字符串,即可以实现多个变量引用 JVM 内存中的同一个字符串实例 ;
- 安全问题,因为很多地方都有用到字符串的形式,比如:数据库的用户名,Socket 的主机和端口…;
- 线程安全,因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步;
- 缓存提升性能,String 大量运用在哈希的处理中,由于 String 的不可变性,可以只计算一次哈希值,然后缓存在内部,后续直接取就好了,字符串的处理速度要快过其它的键对象,这就是 HashMap 中的键往往都使用字符串的原因;
09 什么情况下使用StringBuffer,什么情况下使用 StringBuilder?
在所有场景下优先使用StringBuilder,只有满足
- 操作共享对象时;
- 有多线程场景出现下;
使用StingBuffer
10 list和set的区别
- list 有序,set无序
- list 可重复,set不可重复
- list 遍历除了迭代器还有其他方式,而set只有通过迭代器才能遍历出来。
以上是关于java 面试突击-(1-10)的主要内容,如果未能解决你的问题,请参考以下文章