Java面试基础2

面向对象基础

面向对象和面向过程的区别?

  • 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
  • 面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。

创建一个对象用什么运算符?对象实体与对象引用有何不同?

  • 对象实体:对象实体是类的一个具体实例,具有特定的属性和行为。
  • 对象引用:用于访问对象的变量,它存储了对象在内存中的地址。通过对象引用可以对该对象进行操作。

对象的相等和引用相等的区别?

  • 对象的相等一般比较的是内存中存放的内容是否相等。
  • 引用相等一般比较的是他们指向的内存地址是否相等。

如果一个类没有声明构造方法,该程序能正确执行吗?

  • 如果一个类没有声明构造方法,Java 编译器会为该类自动生成一个默认构造方法(无参构造方法),因此程序可以正确执行。

构造方法有哪些特点?是否可被 override?

  • 名字与类名相同
  • 没有返回值,但不能用 void 声明构造函数。
  • 构造方法不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况

面向对象三大特征

  • 封装:通过将数据隐藏在对象内部,然后提供公共的接口来访问和操作数据,进而来减少对对象内部数据的直接访问
  • 继承:继承指一个子类可以继承父类的属性和方法。并且可以在此基础上进行拓展和重写
  • 多态:同一操作作用于不同的对象,可以有不同的行为表现。(解释:父类来调用子类的方法时实际上执行的是子类重写父类的方法,从而表现出了不同的行为。)

接口和抽象类有什么共同点和区别?

  • 相同点:接口和抽象类都是用来定义抽象类型的,不能被实例化。
  • 接口用于描述类之间的公共行为,是一种行为规范。抽象类用于描述类之间的共性,提供了一种代码重用的机制。
  • 一个类可以实现多个接口,一个类只能继承一个抽象类

深拷贝和浅拷贝区别了解吗?什么是引用拷贝?

  • 引用拷贝:是在内存中创建了原始对象的一个新的引用。即新对象引用和原始对象引用指向相同的数据。
  • 浅拷贝:创建了一个新的对象,但是新对象的某些元素和原始对象的相应元素共享相同的内存。
  • 深拷贝:创建一个新的对象,该对象的所有元素都是原始对象中元素的副本,而不是原始对象元素的引用。

Object

Object 类的常见方法有哪些?

  • toString():返回对象的字符串表示形式
  • equals():比较两个对象是否相等。
  • hashCode():返回对象的哈希码

== 和 equals() 的区别

  • ==:对于基本数据类型(如整数、浮点数等),==通常比较它们的值是否相等。对于引用类型(如对象、数组等),==通常比较它们的引用是否指向同一个内存地址。即比较它们是否是同一个对象的引用。
  • equals():为object类的一个方法,子类可以重写该方法,用来比较两个对象的内容是否相等,通常根据对象的属性值来判断

hashCode() 有什么用?

  • hashCode():该方法用于返回对象的哈希码,用于快速确定对象在散列表中的索引位置

hashset如何检查散列表中重复元素的?

  • 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashCode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashCode 值作比较
  • 如果没有相符的 hashCode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashCode 值的对象,这时会调用 equals() 方法来检查 hashCode 相等的对象是否真的相同。
  • 如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,即发生冲突(利用拉链法、二次散列来解决冲突)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

hashCode() 和 equals()都是用于比较两个对象是否相等。那么JDK那为什么 JDK 还要同时提供这两个方法呢?

  • Hashcode主要用于在散列结构当中快速定位对象的位置。默认若对象HashCode不等,这俩对象值肯定不相等
  • equals():通常用于业务逻辑中比较对象的内容是否相同。
  • 这俩配合使用,先比较两个对象的HashCode值是否相等,如果相等再用equals方法来判断HashCode相等的对象其内容是否相等。这样一来,可以减少使用equals的次数

那为什么不只提供 hashCode() 方法呢

  • 两个对象的hashCode 值相等并不代表两个对象就相等。

那为什么两个对象有相同的 hashCode 值,它们也不一定是相等的?

  • 因为 hashCode() 所使用的哈希算法会让多个对象传回相同的哈希值。

为什么重写 equals() 时不重写 hashCode() 方法会导致什么问题?

  • 违反了约定:根据Java的规定,如果两个对象在equals()方法中相等,那么他们的hashCode值必须相等。如果违反了该API规范,会导致其不能正确的查找和删除对象。

String

String、StringBuffer、StringBuilder 的区别?

  • String:String 类是不可变的,一旦创建,其值就不能被修改。因为不可变性,保证了多个线程同时访问时,不会发生修改,因此String对象是线程安全的。在进行拼接或者替换操作时,实际上是创建了新的String对象
  • StringBuffer:是可变的。且方法加了同步锁,所以是线程安全的
  • StringBuilder:是可变的。但是没有加同步锁,所以不是线程安全的

String 为什么是不可变的?

  • String类被final修饰导致其不能被继承,避免了子类对进行破坏
  • 保存字符串的数组被final修饰且其为私有的,且String类没有提供修改字符串的方法

Java 9 为何要将 String 的底层实现由 char[] 改成了 byte[]

  • 为了更好地支持不同的字符集编码
  • 节省内存空间

字符串拼接用“+” 还是 StringBuilder?

  • 利用“+”对字符串进行拼接底层原理:实际上是通过StringBuilder调用append()方法实现的,拼接完成之后通过toString()得到一个String对象。但是在循环内使用“+”进行字符串的拼接的话:编译器不会创建单个 StringBuilder 以复用,会导致创建过多的 StringBuilder 对象
  • 如果直接使用 StringBuilder 对象进行字符串拼接的话,就不会存在这个问题了。

String#equals() 和 Object#equals() 有何区别?

  • String中的equals方法是被重写过的,比较的是String字符串的值是否相等
  • Object的equals方法比较的是对象的内存地址

字符串常量池的作用了解吗?

  • 字符串常量池:是JVM为了提高性能和减少内存消耗针对字符串(String类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建

String s1 = new String("abc");这句话创建了几个字符串对象?

之前解释的优点晦涩难懂,下面是通俗解释:

  • 会创建 1 或 2 个字符串对象。
  • 在执行new String("abc")语法创建一个字符串对象时,首先会在堆内存中创建一个新的字符串对象,然后检测字符串常量池中是否存在相同内容的字符串对象。
  • 如果字符串常量池中不存在字符串对象“abc”,最后将堆内存中创建的对象的引用指向字符串常量池中的“abc”对象。而之前在堆内存中创建的对象由于没有引用指向它,根据垃圾回收机制,这部分内存空间将会被回收
  • 字符串常量池中已存在字符串对象“abc”的引用,那么在堆内存创建的对象的引用会指向字符串常量池中“abc”这个对象,而对内存创建的对象后续很快会被垃圾回收

String#intern 方法有什么作用?

  • 作用是将指定的字符串对象添加到字符串常量池中,并返回字符串常量池中该字符串的引用
  • 如果使用inter方法时字符串常量池中保存了对应的字符串对象,就直接返回该该字符串在常量池的引用。
  • 如果字符串常量池中没有保存了对应的字符串对象,则将该字符串添加到字符串常量池当中,并且返回该字符串在常量池的引用
  • 减少内存占用

String 类型的变量和常量做“+”运算时发生什么?

  • 运算时,编译器会通过优化将其转换为 StringBuilder 对象的 append 方法调用,然后在运行时进行字符串连接操作,最终生成结果字符串。

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值