一、JavaSE面试题之JavaSE语法
主要总结了JavaSE语法中会出现的相关面试题,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。
Q:
&和&&的区别?
&运算符有两种用法:
按位与
逻辑与
&&运算符是短路与运算。逻辑与跟短路与的差别是很大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。
&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。
很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null
且不是空字符串,应当写为:
username!=null&&!username.equals("")
,二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生
NullPointerException
异常。
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
Q:
==和equals的区别?
==与equals的主要区别是:
equals和==最大的区别是一个是方法,一个是运算符
==常用于比较原生类型,而equals()用来比较方法两个对象的内容是否相等。
==如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。
注意:equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。
Q:
在Java中,如何跳出当前的多重嵌套循环?
方案一:使用标记
1publicstaticvoidmain(String[]args){2System.out.println("标记前");3ok:4for(inti=0;i<10;i++){5for(intj=0;j<10;j++){6System.out.println("i="+i+",j="+j);7if(j==5){8breakok;9}10}11}12System.out.println("标记后");13}
运行结果:
1标记前2i=0,j=03i=0,j=14i=0,j=25i=0,j=36i=0,j=47i=0,j=58标记后
方案二:使外层的循环条件表达式的结果可以受到里层循环体代码的控制
1publicstaticvoidmain(String[]args){2System.out.println("标记前");3booleanflag=true;4for(inti=0;i<10;i++){5for(intj=0;j<10&&flag;j++){6System.out.println("i="+i+",j="+j);7if(j==5)8flag=false;9}10}11System.out.println("标记后");12}
注:不推荐使用标记,因为它容易破坏代码的执行顺序
Q:
为什么重写equals时必须重写hashCode方法?
hashCode()的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码。(可以快速找到所需要的对象)
为什么要有hashCode?
这里以“HashSet如何检查重复”为例子来说明为什么要有hashCode:当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode值作比较,读书笔记(https://www.yuananren.com)如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。
如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了equals的次数,相应就大大提高了执行速度。
hashCode()与equals()的相关规定:
如果两个对象相等,则hashcode一定也是相同的
两个对象相等,对两个对象分别调用equals方法都返回true
两个对象有相同的hashcode值,它们也不一定是相等的
因此,equals方法被覆盖过,则hashCode方法也必须被覆盖
hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
Q:
Java中的Math.round(1.5)等于多少?
等于-1在数轴上取值时,中间值(0.5)向右取整:
+0.5是往上取整
-0.5直接舍弃
二、JavaSE面试题:基本数据类型与访问修饰符
主要总结了Java基础语法中访问修饰符会出现的相关面试题,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。
Q:
Java的数据类型有哪些?
Q:
访问权限修饰符public、private、protected,以及不写(默认)时的区别?
Java中成员的访问权限共有四种,可见性如下:
Q:
接口和抽象类有什么区别?
实现:
抽象类的子类使用extends来继承
接口必须使用implements来实现接口
构造函数:
抽象类可以有构造函数
接口没有
main方法:
抽象类有main方法,并且可以运行
接口不能有main方法
实现数量:
类可以实现多个接口,
但是只能继承一个抽象类。
访问修饰符:
接口中的方法默认使用public修饰符
抽象类的方法可以是任意访问修饰符
Q:
final,finally,finalize的区别?
final
用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.
finally
是异常处理语句结构的一部分,表示总是执行.
finalize
是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等.JVM不保证此方法总被调用.
Q:
抽象类能用final修饰吗?
不能:
定义抽象类就是让其他类继承的,如果定义为final,该类就不能被继承,这样彼此就回产生矛盾,所以final不能修饰抽象类。
Q:
为什么不能用浮点型表示金额?
由于计算机中保存的小数其实是十进制的小数的近似值,并不是准确值,所以,千万不要在代码中使用浮点数来表示金额等重要的指标。
建议使用BigDecimal或者Long(单位为分)来表示金额。
Q:
int和Integer有什么区别?
int是Java提供的8种原始数据类型之一。
Java为每个原始类型提供了封装类,Integer是Java为int提供的封装类。
int的默认值为0,而Integer的默认值为null,是引用类型,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况
Java中int和Integer关系如下:
int是基本的数据类型;
Integer是int的封装类;
int和Integer都可以表示某一个数值;
int和Integer不能够互用,因为他们两种不同的数据类型;
Q:
char型变量中能不能存储一个中文汉字,为什么?
char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。
补充:使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是Unicode,当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以Java中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务;