Java基础面试题干货系列(一)

创作不易,如果觉得这篇文章对你有帮助,各位老铁点个赞呗,您的支持是我创作的最大动力!

Java基础

前言

最近,感觉压力比较大,所以挑战下基础面试题,加深下自己对基础知识的理解。Java基础知识实在是太多了,这里打算持续更新,总结下常见的面试题。

博主打算每期更新10个知识点,后续慢慢迭代更新。

注:前期是以知识点总结为主,里面会混合一些实际的面试题。博主这里总结的目的在于,应付面试的同时,可以巩固自己的基础知识,工作几年的人都知道,如果稍微不留神,慢慢的,你的基础知识忘记的差不多了

1 下面的代码创建了几个对象

String str = new String("Hello");

以上代码,实际上创建了2个对象,JVM首先会在对象池中创建一个对象,然后根据对象池中的对象,在堆中创建一个对象。

String str1 = new String("Hello");
String str2 = new String("Hello");

这段代码,实际上创建了3个对象,JVM首先会在对象池中创建一个对象,而对象池中的对象,都是被共享的,所以str1和str2在对象池中,其实是同一个对象。通过new的方式,在堆中,又创建了对象str1,对象str2,str1和str2这两个引用,属于不同的内存地址,堆中创建了2个对象,综上所述,以上代码片创建了3个对象。

2 String对象是如何保证其对象的内容不可改变

这个问题在基础中,也算是很常见的了,这里做一下总结。

看本例子之前,给伙伴们脑补下基础知识:==基本数据类型中,比较的值是否相等,在引用数据类型中,比较的是内存地址是否相等(也即是执行的是不是同一个对象)。而equals比较的内容是否相等

private static void test8() {
		String str1 = new String("hello");
		String str2 = new String("hello");
		String str3 = str1;

		// str1和str2都使用new创建了对象,所以JVM会在堆中会创建两个不同的对象,所以属于不同的内存空间,str1和str2指向堆中的是,两个不同的内存地址,所以结果为false
		System.out.println("str1 == str2:" + (str1 == str2));// false
		// 这个输出语句str1.equals(str2)是调用了String类中的equals方法,该方法用于比较两个字符串对象的内容是否相等,结果为true。
		System.out.println("str1.equals(str2):" + str1.equals(str2));// true

		// 将str1赋值给了str3,指的是将str1对象的引用,赋值给了str3,这时候str1和str3,内存地址相同,指向堆中的同一块内存,所以这里返回true
		System.out.println("str1 == str3:" + (str1 == str3));// true
		// str1和str3指向堆中的同一块内存,所以值的内容相等,结果是true
		System.out.println("str1.equals(str3):" + str1.equals(str3));// true

		// 重点来了,String对象的不可变特性,这里修改了str1的内容
		str1 = "world";

		// 对于上面的 String str3 = str1
		// 这一行代码,小伙伴们会不会有这样的疑问,既然str1和str3具有相同的内存地址,引用的是堆中的同一个对象,为什么str1的值被改变了,str3的值并不会被改变呢?
		System.out.println("str1的值 = :" + str1);// str1的值 = :world
		System.out.println("str3的值 = :" + str3);// str3的值 = :hello

		// 这里修改了str1的内容,这就涉及到了Java中String对象的不可变性
		System.out.println("str1 == str3:" + (str1 == str3));// false
		// 这里内容已经不一样了,所以返回false
		System.out.println("str1.equals(str3):" + str1.equals(str3));// false
	}

该怎么理解Java中String对象的不可变性呢,简单来说就是:一旦一个String对象被创建并且被初始化(赋值)了,这个对象的值就不会再改变

一旦一个String对象在内存中创建,它将是不可改变的,所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象。

也就是说str1 = “world”,并不是改变了原有对象的值,而是在对象池中,创建了一个新的字符串共享对象,这个对象的值是world,并把这个对象的引用赋值给了str1,而str3这个引用依然指向的是原来的那个对象,所以这时候str1和str3是两个不同的内存地址。

总结:
一个String对象在堆内存中创建以后,就不能被改变了。正因为String对象的不可变性,如果需要对字符串进行大量的修改、添加字符、删除字符等操作时,尽量不要使用String对象,因为这样会频繁的创建新的String对象,浪费大量的不必要的内存,也需要耗时来执行垃圾回收,从而导致程序的执行效率下降。

如果我们需要可改变的字符串,则需要使用字符串生成器StringBuffer或者StringBuilder。

注意:String对象的所有方法都不会改变其本身,而是会返回一个新的String对象

想要了解更多,可以查看我的另一篇博文:Java中的String是不可变的

3 计算机组成有哪些

  • 硬件
    硬件又包含:输入设备输出设备存储设备CPU其他设备
    输入设备常见的:鼠标、键盘、麦克风………
    输出设备常见的:显示器、音响、打印机……
    存储设备常见的:硬盘、内存条、U盘……
    CPU(中央处理器)包含:运算器、控制器
    其他设备常见的:机箱
  • 软件
    软件又分为:系统软件应用软件
    系统软件常见的:Win7、Win10、Win8、Linux、Mac
    应用软件常见的:QQ、微信等
    应用软件包含两种结构:
    C/S(Client/Server):客户端/服务器
    先下载,然后在安装,最后才可以使用,如:Idea…
    B/S(Browser/Server):浏览器/服务器
    如:淘宝、JD……

4 计算机存储单位换算关系

计算机中使用二进制存储信息,也就是0和1,而平时呢,我们使用最多的是十进制。底层中,一个字节使用8个二进制位去存储。

单位换算关系:

大单位 小单位
1byte 8bit
1KB 1024byte
1MB 1024KB
1GB 1024MB
1TB 1024GB

5 Java语言特性

  • 简单
    Java舍弃了C++中难以掌握并不安全的功能,如:指针、多继承等
    Java语言底层是C++实现的
  • 面向对象
    Java和C++一样,是一种面向对象编程语言
  • 安全性
    如:运行时堆栈溢出,强制类型检查
  • 健壮性
    Java语言在运行过程中产生的垃圾会自动回收,简称GC机制。而C语言没有自动回收机制,申请的资源,需要手动回收。
  • 可移植性
    Java程序编译一次,不做任何修改时可以到处运行,也就是跨平台。只需要在不同操作系统上安装不同JVM

6 Java中,JDK、JRE、JVM各自是什么,以及之间有什么关系

JDK:Java开发工具包,里面有好多类库,开发时可以直接使用。另外,JDK里含有JRE。
JRE:Java的运行时环境。跟客户部署应用时,其实只配置JRE环境即可运行。
JVM:Java虚拟机(不能单独安装),JVM在不同的环境下版本略有不同。

7 Java的加载与执行

Java加载执行过程:首先通过源码文件(.java后缀),手动或者通过ide把源文件编译为字节码(.class后缀)文件,JVM通过类加载器运行字节码文件,把字节码文件解释为1001等二进制,与不同环境下的底层系统进行交互。
如下图所示:
在这里插入图片描述

Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。

8 Java关键字有哪些?

Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。

java中关键字共53个(其中包含两个保留字constgoto),另外,Java还有3个保留字:truefalsenull。它们不是关键字,而是文字。和关键字一样,它们也不可以作为标识符使用

Java关键字与含义基础对照:

关键字 含义
abstract 表明类或者成员方法具有抽象属性
assert 断言,用来进行程序调试
boolean 基本数据类型之一,布尔类型
break 提前跳出一个块
byte 基本数据类型之一,字节类型
case 用在switch语句之中,表示其中的一个分支
catch 用在异常处理中,用来捕捉异常
char 基本数据类型之一,字符类型
class 声明一个类
const 保留关键字,没有具体含义
continue 回到一个块的开始处
default 默认,例如,用在switch语句中,表明一个默认的分支,也可用在接口中默认方法(jdk1.8以后)
do 用在do-while循环结构中
double 基本数据类型之一,双精度浮点数类型
else 用在条件语句中,表明当条件不成立时的分支
enum 枚举
extends 表明一个类型是另一个类型的子类型,这里常见的类型有类和接口
final 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量
finally 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
float 基本数据类型之一,单精度浮点数类型
for 一种循环结构的引导词
goto 保留关键字,没有具体含义
if 条件语句的引导词
implements 表明一个类实现了给定的接口
import 表明要访问指定的类或包
instanceof 用来测试一个对象是否是指定类型的实例对象
int 基本数据类型之一,整数类型
interface 接口
long 基本数据类型之一,长整数类型
native 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
new 用来创建新实例对象
package
private 一种访问控制方式:私用模式
protected 一种访问控制方式:保护模式
public 一种访问控制方式:共用模式
return 从成员方法中返回数据
short 基本数据类型之一,短整数类型
static 表明具有静态属性
strictfp 用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
super 表明当前对象的父类型的引用或者父类型的构造方法
switch 分支语句结构的引导词
synchronized 表明一段代码需要同步执行
this 指向当前实例对象的引用
throw 抛出一个异常
throws 声明在当前定义的成员方法中所有需要抛出的异常
transient 声明不用序列化的成员域
try 尝试一个可能抛出异常的程序块
void 声明当前成员方法没有返回值
volatile 表明两个或者多个变量必须同步地发生变化
while 用在循环结构中

关键字参考原文链接:https://blog.csdn.net/Myuhua/article/details/81411707

9 Java中标识符

定义:在Java中,可以自己命名的都是标识符。标识符就是一个名字,可以对类名(接口名)、变量名称、方法名称、参数名称等进行修饰。

这个知识点一般在面试的笔试题中会遇到。

标识符的命名规则:

  • 标识符由数字、字母、下划线_或$组成
  • 标识符必须以字母、下划线或者美元符号$开头,不能以数字开头。
  • Java关键字不能作为标识符
  • 标识符区分大小写
  • 标识符理论上没有长度限制,但是,最好见名知意,不要太长,否则影响可读性

10 Java字符编码

字符编码定义:
字符编码按某种格式某种规定将数据存在计算机中。是现实世界中文字和计算机转换规则的表示方式。

常用字符编码:

  • GB2312 / GBK / GB18030
    都是中文编码,这三种编码从容量上来看,是一种包含关系,从左至右,容量有小到大。
    这三种字符集的主要区别,可参考链接:https://www.zhihu.com/question/19677619

  • ISO-8859-1
    主要是西欧语言中的字符编码,兼容ASCII

  • ASCII
    定义:ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。

    ASCII码值:65~90为26个大写英文字母(控制字符),97~122号为26个小写英文字母(控制字符)
    比如:英文小写字母a对应的值97,b对应的值98。英文大写字母A对应的码值65,B对应的码值66。控制字符0,对应的码值为48

    想了解更详细的ASCII码,可以看考博文:ASCII码

  • Unicode
    统一全球所有国家的文字编码

    Unicode编码共有三种具体实现:
    分别为utf-8,utf-16,utf-32,其中utf-8占用一到四个字节,utf-16占用二或四个字节,utf-32占用四个字节。Unicode 码在全球范围的信息交换领域均有广泛的应用。

    char字符,底层占用两个字节,采用的是Unicode编码,实现方式为UTF-16。

    注意:java源代码采用Unicode编码

写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,希望尽自己的努力,做到更好,大家一起努力进步!

如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

给自己的梦想添加一双翅膀,让它可以在天空中自由自在的飞翔!

猜你喜欢

转载自blog.csdn.net/smilehappiness/article/details/105889524