JavaSE面试题

面试题

## JDK 和 JRE 有什么区别?

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 的区别是什么?

  1. ArrayList的实现是基于数组来实现的,LinkedList的基于双向链表来实现。这两个数据结构的逻辑关系是不一样,当然物理存储的方式也会是不一样。
  2. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
  3. 对于随机访问,ArrayList要优于LinkedList。
  4. ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
  5. 在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,
  6. 因为 ArrayList 增删操作要影响数组内的其他数据的下标。
  7. 在需要频繁读取集合中的元素时,更推荐使用 ArrayList,
  8. 而在插入和删除操作较多时,更推荐使用 LinkedList。

synchronized 和 ReentrantLock 区别是什么

synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。

主要区别如下:

ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;
ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁;
ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值