Java常见面试题2

Java常见面试题

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

面向对象(POP):将方法和数据封装为对象作为程序的基本单元,提炼出封装继承多态来作为代码指导,注重代码灵活性和复用性

面向过程(OOP):将过程作为基本程序的基本单元,过程对应到代码中就是函数,将函数和数据分离,注重步骤和流程

对象实体和对象引用有什么不同

Person person = new  Person()
你尝试打印 person 变量本身,输出可能是类似于"Person@12345678"的字符串

new Person()其实就是在堆中创建对象实体,而person就是对象的引用(放在栈内存中)

  • 一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);
  • 一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)

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

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

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

能,因为类有默认的无参构造方法,但一旦声明了有参构造,默认的无参构造方法就会消失,所以在添加了有参之后也要将无参构造声明出来

构造方法有哪些特点

  • 方法名跟类名一样
  • 没有返回值
  • 自动执行
  • 不能被重写,但是可以重载

接口和抽象类的共同点和区别

共同点:

  • 实例化:都不能实例化
  • 抽象方法:都含有抽象方法,必须在子类或者实现类中实现

区别:

  • 设计目的:接口用于行为约束,实现了就有了对应的行为。抽象类用于代码复用,所属关系
  • 一个类只能继承一个抽象类但是可以实现多个接口,一个接口也可以继承多个接口
  • 成员变量:接口中的变量只能是public static final的,不能被修改且必须有初始值,抽象类修饰符任意
  • 方法:JDK8后,接口允许有默认实现和静态方法。抽象类可以有非抽象方法

深拷贝和浅拷贝和引用拷贝

深拷贝:完全拷贝一个对象,包括基本类型和引用类型

浅拷贝:只拷贝对象本身和基本类型,不拷贝引用类型

引用拷贝:两个不同的引用指向同一个对象

shallow&deep-copy

Object类的常见方法

hashcode,equals(默认实现是==来判断),getclass,clone,toString,notify(唤醒线程),notifyall,wait,finalize(GC触发操作)

/**
 * native 方法,用于返回当前运行时对象的 Class 对象,使用了 final 关键字修饰,故不允许子类重写。
 */
public final native Class<?> getClass()
/**
 * native 方法,用于返回对象的哈希码,主要使用在哈希表中,比如 JDK 中的HashMap。
 */
public native int hashCode()
/**
 * 用于比较 2 个对象的内存地址是否相等,String 类对该方法进行了重写以用于比较字符串的值是否相等。
 */
public boolean equals(Object obj)
/**
 * native 方法,用于创建并返回当前对象的一份拷贝。
 */
protected native Object clone() throws CloneNotSupportedException
/**
 * 返回类的名字实例的哈希码的 16 进制的字符串。建议 Object 所有的子类都重写这个方法。
 */
public String toString()
/**
 * native 方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。
 */
public final native void notify()
/**
 * native 方法,并且不能重写。跟 notify 一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程。
 */
public final native void notifyAll()
/**
 * native方法,并且不能重写。暂停线程的执行。注意:sleep 方法没有释放锁,而 wait 方法释放了锁 ,timeout 是等待时间。
 */
public final native void wait(long timeout) throws InterruptedException
/**
 * 多了 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。。
 */
public final void wait(long timeout, int nanos) throws InterruptedException
/**
 * 跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念
 */
public final void wait() throws InterruptedException
/**
 * 实例被垃圾回收器回收的时候触发的操作
 */
protected void finalize() throws Throwable { }

==和equals的区别

==对于基本类型来说就是判断值是否相等,引用类型就是地址是否相等

equals不能判断基本数据类型,没有重写的equals就是==来实现的,重写了的就是看值是否相等(比如我想让一个对象的某个属性相等就认为这是一个对象就需要重写)

hashcode有什么用

它的作用就是得到哈希码(int),确定该对象在哈希表中的位置,方便快速找到对象

为什么要有hashcode

hashcode的效率更高比equals

那为什么 JDK 还要同时提供这两个方法呢?

hashCode()equals()都是用于比较两个对象是否相等。因为hash算法会出现碰撞,不同的对象得到同一个hash值,而且当两者都返回true时我们才认为两个对象相等,这也是为什么重写equals时要重写hashcode的原因

String和StringBuffer和StringBuilder有什么区别

String是不可变类,每次修改都会创建对象,导致资源浪费

StringBuider线程不安全

StringBuffer就是在StringBuider加上了sychronized同步锁线程安全但是牺牲了性能

但是StringBuider和StringBuffer两者底层使用的是char数组,如果在知道数据量的情况下,可以减少扩容,提高性能

不可变类

String就是典型的不可变类,类用final修饰,变量用private final修饰且不对外暴露修改方法(setter等),fianl修饰导致不能被继承,避免子类修改

Java9为什么将String的底层实现由char[]变为了byte[]

新版的 String 其实支持两个编码方案:Latin-1 和 UTF-16。如果字符串中包含的汉字没有超过 Latin-1 可表示范围内的字符,那就会使用 Latin-1 作为编码方案,而在这个方案下,byte占一个字节,char占两个字节,节省一半的内存空间,超过表示范围,两者占得空间一样

字符串拼接用StringBuilder还是+

Java 语言本身并不支持运算符重载,“+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的运算符。

使用+来创建对象实际是调用了StringBuilder的append方法实现的,然后调用tostring返回一个String对象,但是在循环下使用+会一直创建Stringbuilder对象,如果直接使用StringBuider就不会出现这种情况

字符串常量池

为了避免重复创建字符串专门开辟的区域,提高jvm性能和减少内存消耗

String s1 =new String(“abc”)创建几个对象

一个或者两个,当字符串常量池不存在abc就会在堆上创建两个字符串对象,其中一个字符串对象引用就会保存在常量池中

String的intern方法的作用

String.intern() 是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况:

  • 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用。
    ,其中一个字符串对象引用就会保存在常量池中

String的intern方法的作用

String.intern() 是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况:

  • 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用。
  • 如果字符串常量池中没有保存了对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值