JavaGuide常见面试题整理(中)

本文围绕Java开发展开,介绍面向对象基础,包括变量区别、对象创建、构造方法等。阐述面向对象三大特征,对比接口和抽象类,区分深拷贝和浅拷贝。还讲解native关键字、hashCode()作用,分析String、StringBuffer、StringBuilder特点,探讨字符串拼接及常量池相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象基础

静态变量成员变量和局部变量的区别

在这里插入图片描述

创建一个对象用什么运算符?对象引用和对象实体有什么区别?

new运算符
new创建对象实例,对象实例在堆内存。对象引用指向对象。一个对象引用可以指向一个实例。一个实例可以被多个对象指向。

构造方法的作用?特点?是否可以被override?

作用:用于初始化对象。
特点:
1.与类名同名
2.无返回值但不能用void
3.生成对象时自动执行
不能被重写可以被重载
注:一个类即使没有显式的声明构造方法也是会有一个默认的无参构造,当显式声明有参构造时,无参构造就不可用了。

面向对象的三大特征

封装

把对象的内部细节隐藏,提供指定的外部接口进行访问。

继承

不同的对象具有一定数量的相同点就可以使用创建一个类让其他类继承这个类从而降低代码的冗余性,提高代码的重用,程序的可维护性。同时子类可以定义自己特有的方法或者通过重写的方式对父类的同一方法进行不同的实现。
注:子类拥有访问父类所有的属性和方法,但是父类中的私有属性和方法子类是无法访问的。

多态

例如父类的引用可以指向子类的实例,接口的引用指向实现类。
注:
多态不能调用“只在子类存在但在父类不存在”的方法;
如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。

接口和抽象类有什么相同和不同

相同:
1.接口和抽象类都需要一个实现类才能对其进行实例化
2.都包含抽象方法
3.都可以有默认方法(default修饰,默认方法可以有方法体,实现类无需实现也可以使用)
区别:
1.接口更多是描述一个类的行为,抽象类更多描述的是一个所属关系。
2.接口的成员变量默认是public static finial的,不能被修改且必须由初始值。抽象类成员变量默认是default,可在子类中重新赋值。
3.一个类可以实现多个接口但是只能继承一个抽象类。

深拷贝和浅拷贝有什么区别?

深拷贝和浅拷贝最大的区别是是否对原对象产生影响,浅拷贝是拷贝一份引用到栈中,指向的仍然是同一个对象实例。深拷贝是重新拷贝了一份对象在堆中,然后让引用在栈中指向新的对象,新旧对象互不干扰。
在这里插入图片描述
在这里插入图片描述

注:Java中有两种数据类型,一种是基本数据类型,存在栈中。一种是引用数据类型,存在堆中。而对象的引用是存在栈中的。

native关键字

native关键字Java可以调用其他语言写的方法。
语法:
1.native的位置必须在返回类型之前。
2.不能被abstract修饰,不能有方法体。
3.返回值可以是任意类型。

hashCode()有什么用

hashCode()方法返回对象的哈希值,用于判断对象是否相等。如果是两个对象可以直接调用equals方法,但是如果有很多对象,就可以直接使用哈希值来比较对象是否相等。如果哈希值冲突则调用equals方法比较对象是否相等。因为不同的对象也可能具有相同的哈希值,但是如果两个对象的哈希值不相等我们可以直接认为他不相等。
Java在将对象加入不可重复的集合中时会调用hashCode(),大大减少对比成本。

String、StringBuffer、StringBuilder

String是不可变的,因为String类中使用final修饰字符数组,并且String也是被final修饰的类。(final修饰的变量不可更改,修饰的类不可继承)
StringBuffer、StringBuilder继承自AbstractStringBuilder,并且提供了很多修改字符串的方法。这些方法在StringBuffer 中是线程安全的。在StringBuilder中是非线程安全的,性能更高。
总结:
操作少量的数据: 适用 String
单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

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

Java本身不支持运算符重载,”+“和”+=“是专门为了String类重载过的运算符,也是Java中仅有的两个重载过的运算符。”+“实际上是通过StringBuilder调用append方法实现的,拼接完成之后使用toString得到一个String对象。但是每次拼接编译器都会创建一个StringBuilder。所以使用StringBuilder会更好一些。

注:在编译期可以确定的值编译器会进行常量折叠。例如`String s = “str”+“ing”会优化成String s = “string”从而避免字符串的重复创建。

注:String的equals()方法是被重写过的。比较的是字符串的值是否相同。而Obeject方法比较的是内存地址是否相同。

String的intern方法

intern方法是一个native方法。其作用是在常量池中创建一个字符串的引用并返回该引用。如果常量池中已经有该字符串的引用则直接返回。

字符串常量池

字符串常量池是JVM为了提升性能减少内存消耗针对字符串专门开辟的一片区域,主要是为了避免字符串的重复创建,在java1.6之前存在于永久代,Java1.7之后改为在堆中。在JVM中由一个HashTable来实现。默认容量是1099,可以通过-XX:StringTableSize来指定容量,但是容量过大会导致Hash冲突,每次进行大量比对性能·1下降。主要在使用过程中一定要控制容量。

2020/5月/15好上传最新版 JavaGuide 目前已经 70k+ Star ,目前已经是所有 Java 类别项目中 Star 数量第二的开源项目了。Star虽然很多,但是价值远远比不上 Dubbo 这些开源项目,希望以后可以多出现一些这样的国产开源项目。国产开源项目!加油!奥利给! 随着越来越多的人参与完善这个项目,这个专注 “Java知识总结+面试指南 ” 项目的知识体系和内容的不断完善。JavaGuide 目前包括下面这两部分内容: Java 核心知识总结; 面试方向:面试题面试经验、备战面试系列文章以及面试真实体验系列文章 内容的庞大让JavaGuide 显的有一点臃肿。所以,我决定将专门为 Java 面试所写的文章以及来自读者投稿的文章整理成 《JavaGuide面试突击版》 系列,同时也为了更加方便大家阅读查阅。起这个名字也犹豫了很久,大家如果有更好的名字的话也可以向我建议。暂时的定位是将其作为 PDF 电子书,并不会像 JavaGuide 提供在线阅读版本。我之前也免费分享过PDF 版本的《Java面试突击》,期间一共更新了 3 个版本,但是由于后面难以同步和订正所以就没有再更新。《JavaGuide面试突击版》 pdf 版由于我工作流程的转变可以有效避免这个问题。 另外,这段时间,向我提这个建议的读者也不是一个两个,我自己当然也有这个感觉。只是自己一直没有抽出时间去做罢了!毕竟这算是一个比较耗费时间的工程。加油!奥利给! 这件事情具体耗费时间的地方是内容的排版优化(为了方便导出PDF生成目录),导出 PDF 我是通过 Typora 来做的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值