面试题
JDK:Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java 运行环境,为 Java 的运行提供了所需环境。
== 和 equals 的区别是什么?
==:
基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;
equals :
在自定义对象中不重写equals 方法,其实就是==
重写后,比较地址值和成员属性值
进阶:为什么重写equals 方法后,一定要重写hashcode方法呢?
因为, 对象相同,那么hashcode值相同。不同的对象,hashcode值可能相同,也可能不同。
因此,equals方法与hashCode方法根本就是配套使用的。对于任何一个对象,不论是使用继承自Object的equals方法还是重写equals方法。hashCode方法实际上必须要完成的一件事情就是,为该equals方法认定为相同的对象返回相同的哈希值。如果只重写equals方法没有重写hashCode方法,就会导致``equals`认定相同的对象却拥有不同的哈希值。
注:重写equals和hashcode时 如果equals方法为true则两个对象地址和属性值都相等,如果hashcode相同,则对象的内容不一定相同
final 在 Java 中有什么作用?
final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
String 属于基础的数据类型吗?
String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
Java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
String str="i"与 String str=new String(“i”)一样吗?
以双引号的形式创建,采用字符串常量(字面量)的方式赋值,str变量存放在栈中,指向jvm常量池中的“str”,如果常量池中有“str”,就直接引用常量池中的值;如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。为编译期存在常量池String str = “str”;
new关键字新建一个字符串对象,创建了两个对象,s对象变量存放在栈中,他会先判断常量池中是否有对应的“str”,如果有,就直接引用常量池中的值;如果没有,则会创建一个“str”实例存放在堆中,同时指向常量池中的“str”。这个过程是在运行时完成的String s = new String(“str”);
接口和抽象类有什么区别?
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。且抽象类只能单继承(这里指的是子类只能继承一个抽象类),而接口可以继承多个接口。
创建线程有哪几种方式?
继承 Thread 重写 run 方法;
实现 Runnable 接口;
实现 Callable 接口。Callable 是对Runnable 的一种补充。
ArrayList 和 LinkedList 的区别是什么?
- ArrayList的实现是基于数组来实现的,LinkedList的基于双向链表来实现。这两个数据结构的逻辑关系是不一样,当然物理存储的方式也会是不一样。
- LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
- 对于随机访问,ArrayList要优于LinkedList。
- ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
- 在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,
- 因为 ArrayList 增删操作要影响数组内的其他数据的下标。
- 在需要频繁读取集合中的元素时,更推荐使用 ArrayList,
- 而在插入和删除操作较多时,更推荐使用 LinkedList。
synchronized 和 ReentrantLock 区别是什么?
synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。
主要区别如下:
ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;
ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁;
ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等。