Java基础面试题(更新ing)

1、JDK和JRE有什么区别 ?
JDK(Java Development Kit)是Java的开发工具,它不仅提供了Java程序运行所需要的JRE,还提供了一系列的编译、运行等工具,如Javac、Java、Javaw等;
JRE(Java Run Environment )是Java运行环境,它最核心的内容就是JVM(Java虚拟机)及核心类库;

2、 == 和 equals 的区别是什么 ?
java中值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
== 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中的存储地址是否相等,即栈中的内容是否相同;
equals操作表示两个变量是否是同一个对象的引用,即堆中的内容是否相同;
== 比较的是2个对象的地址,而equals比较的是2个对象的内容,当equals为true ==不一定为true
3、两个对象的hashCode()相同,则equals()也一定为true 吗?

如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等;
如果equals方法得到的结果为false,则两个对象的hashcode可能相等;
如果两个对象的hashcode值不等,则equals方法得到的结果必定为false;
如果两个对象的hashcode值相等,则equals方法得到的结果不一定;
(hashcode生成是根据规则生成的,可能存在不通对象生成相同的hashcode)

4、final在java中有什么作用?
(1)当final修饰基本数据类型时,这个数据被初始化后将不能被改变;当final修饰引用数据类型时,引用在初始化后将永远只想一个内存地址,不可以修改,但是内存地址中保存的对象信息时可以修改的,如下:

final User user = new User("名称",18);
user.setName("名称1");
user.setAge(28)

final修饰的常量会被放入常量池,所以被final修饰的常量会在编译器进入常量池,如果涉及到常量的操作,可能在编译器完成。
(2)匿名内部类在使用外部局部变量时只能使用final修饰的变量:
内部类和外部类访问的是同一个变量,使用了final修饰局部变量值就永远不会改变,避免了数据不一致的发生
(3)final修饰方法主要方法是不让任何继承类对其进行修改。另一个作用就是提升效率,但是现在基本不需要以此为由使用final.
(4) final修饰的类不能被继承,被final修饰的类所有成员方法都是final方法

5、String属于基础的数据类型吗?
Java中8种基础的数据类型:
byte、short、char、int、long、float、double、boolean
String类型是最常用到的引用类型

6、Java中操作字符串都有哪些类?他们都有哪些区别
Java中String、StringBuffer、StringBuilder三个类操作字符串。这三个类都是以char[]形式保存的字符串.
String类型的字符串是不可以改变的,对String类型的字符串做修改操作都是相当于重新创建对象,而StringBuffer和StringBuilder都是对同一个对象操作。
StringBuffer中的方法大部分都使用了synchronized关键字修饰,所以是线程安全的
StringBuilder没有使用synchronized,所以性能更高,但线程不安全
在单线程环境下最好选用StringBuilder,多线程环境下使用StringBuffer,如果字符串几乎不做修改则直接使用String。

7、String str="i"与String str = new String(“i”)一样吗?
String str = "i"的方式,Java虚拟机会将其分配到常量池中;
String str=new String(“i”) 会被分到堆内存中
所以不一样

8、抽象类必须要有抽象方法吗?
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类;
(本人看来抽象类的意义在于提示继承抽象类必须要重写抽象方法)

9、普通类和抽象类的区别
抽象类不能被实例化
抽象类可以有抽象方法,抽象方法只需申明,无需实现
含有抽象方法的类必须声明为抽象类
抽象类子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
抽象方法不能被声明为静态
抽象方法不能用private修饰
抽象方法不能用final修饰
== 以上也是抽象类的特点==

10、接口和抽象类的区别
(1)抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
(2)抽象类要被子类继承,接口要被类实现。
(3)接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
(4)接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
(5)抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
(6)抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
(7)抽象类里可以没有抽象方法
(8)如果一个类里有抽象方法,那么这个类只能是抽象类
(9)抽象方法要被实现,所以不能是静态的,也不能是私有的。
(10)接口可继承接口,并可多继承接口,但类只能单根继承。

后续继续更新

你可能感兴趣的:(Java面试题)