java面试知识点
语法基础
什么是面向对象?
面向对象就是将事务对象化、行为化、模块化,包括属性和行为。
优点:易维护、易复用、易扩展。
特性:封装、继承、多态、抽象
封装:封装数据和操作,只对外暴露最简单的接口。
继承:也是封装的手段,从已有的类得到继承信息并创建新类的过程
多态:接口的多种不同的实现方式,包括方法重载(overload)–编译时多态、方法重写(override)–运行时多态
重载:在同一个类里,方法名相同,参数不同的情况。
重写:在继承的子类里,重写父类方法。
低耦合、高内聚。
在java中怎么跳出当前多重循环?
在最外层循环前加一个标记,如outfor,然后用break outfor;可以跳出多重循环。
public class TestBreak {
public static void main(String[] args) {
outfor: for (int i = 0; i < 10; i++){
for (int j = 0; j < 10; j++){
if (j == 5){
break outfor;
}
System.out.println("j = " + j);
}
}
}
}
JDK 和 JRE 有什么区别?
jre(java runtime enviroment ):java运行环境,是将要执行java程序的java虚拟机。
jdk(java development kit):java开发工具,包括jre,编译器和其他工具,可以开发、编译、执行java应用程序。
一般来说,如果只是运行java程序,安装jre完全就可以了,如果是代码的编写,编译则需要安装jdk。
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,hashCode通过对象的内存地址(不止)计算出一个整数值,少数情况下,内存地址不同,这个整数值也有可能相同。
equels比较的是两个对象是否相同。
Aa和BB的hashCode相同,但是地址不同,反过来说就可以,equels相同,hashCode一定相同。
hashMap判断一个对象是否相等,首先判断hashCode是否相等,相同再比较equels,不相同,判定为相等。
final 在 java 中有什么作用?
是java中的关键字,可以用于三个地方。用于修饰类,类属性,类方法。
特性:凡是引用final关键字的地方皆不可修改!
-
修饰类:该类不能被继承
-
修饰方法:该方法不能被重写。
-
修饰变量:该变量只能赋值一次,赋值一次不可修改。
修饰基本数据类型,初始化后不可修改;修饰引用数据类型,指向的地址不发生变化,但是保存在内存地址的对象信息可以修改。
java 中的 Math.round(-1.5) 等于多少?
round()是Math类的四舍五入的方法。
不论正负,都是向数轴右侧入。
所以为-1。
Math类封装了很多与数学有关的属性和方法。
Math.sqrt(16);//平方根
Math.cbrt(8);//立方根
Math.hypot(3,4);//(x的平方+y的平方)的平方根
Math.pow(3,2);//计算a的b次方
Math.exp(3);//e^x的值
Math.max(2.3,4.5);
Math.min(2.3,4.5);
Math.ceil(-10.1);//-10.0返回大的值,不分正负,向数轴右侧取整。
Math.floor(-10.1);//-11.0返回小的值,不分正负,向数轴左侧取整。
Math.random();// [0,-1)之间的随机数double
//四舍五入,向数轴右侧入。
Math.rint(10.1);//返回double
Math.round(-1.5);//float时返回int,double时返回long
String 属于基础的数据类型吗?
不是,String不是基本数据类型,是final修饰的java类,是引用数据类型。
java基本数据类型:byte,short,int,long,float,double,char,boolean。
引用数据类型:类,接口,数组,字符串,lambda。
== 和 equals 的区别是什么?
值类型是存储在内存中的栈中,引用类型的变量在栈中仅仅是存储引用变量的地址,本身存储在栈中。
==操作比较的是两个变量的值是否相同,对于引用变量表示存储在栈中的地址是否相同。
equels表示两个变量是否是同一个对象,即堆中的内容一致。
==比较的是两个对象的地址,equels比较的是两个对象的内容。
但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写.
坑:
String的比较:String的值保存在字符串常量池中,当有相同的值的对象,就引用该对象(new一个的话,会重新创建),否则重新创建
数据类型和封装类型(int和Integer):new两个Integer,为false,虽然会自动拆箱,但是比较的是两个对象的地址。equels比较的是两个对象,两边都不能是基本数据类型。
String str="i"与 String str=new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。前者,java虚拟机回分配到常量池中(string时final修饰的累,即常量),后者则会被分配到堆内存中。
String x = “i” 的方式,Java 虚拟机会将其分配到常量池中,而常量池中没有重复的元素,比如当执行“i”时,java虚拟机会先在常量池中检索是否已经有“i”,如果有那么就将“i”的地址赋给变量,如果没有就创建一个,然后在赋给变量;而 String z = new String(“i”) 则会被分到堆内存中,即使内容一样还是会创建新的对象。
this() & super()在构造方法中的区别?
-
调用super()必须写在子类构造方法的第一行, 否则编译不通过
-
super从子类调用父类构造, this在同一类中调用其他构造均需要放在第一行
-
尽管可以用this调用一个构造器, 却不能调用2个
-
this和super不能出现在同一个构造器中, 否则编译不通过
-
this()、super()都指的对象,不可以在static环境中使用
- 访问属性或方法:
this. 访问的是本类中的属性和方法,如果本类没有,向上访问父类的;
super. 只能访问父类的属性和方法。
- 调用构造方法:
调用本类的构造方法,this() 必须放在构造方法的首行;
调用父类的构造方法,super() 必须放在子类构造方法的首行。
- 通常都知道 this指代当前对象,super指代父类对象。