首页 雷火竞猜正文

韩国三级片,备战“金九银十”10道String高频面试题解析-雷火电竞下载

admin 雷火竞猜 2019-10-28 144 0

前语

String 是咱们实践开发中运用频率十分高的类,Java 能够经过 String 类来创立和操作字符串,运用频率越高的类,咱们就越简单忽视它,由于见的多所以了解,由于了解所以以为它很简单,其实仅仅了解到皮裘,并没有真实把握,而 String 又是面试的高频考点,所以咱们有必要将 String 这个类深入研究,彻底搞定,本节课就为咱们详细解说 String 的中心机制以及实践运用。

String 三大中心:

1、不变性:String 是只读字符串,是一个典型的 immutable 目标,对它进行任何操作,其实都是创立一个新的目标,再把引证指向该目标。不变形式的首要效果在于当一个目标需要被多线程同享并频频拜访时,能够确保数据的一致性。

2、常量池优化:String 目标创立之后,会在字符串常量池中进行缓存,假如下次创立相同的目标时,会直接回来缓存的引证。

3、final:运用 final 来界说 String 类,表明 String 类不能被承继,进步了体系的安全性。

String 不是根本数据类型

这是很根底的东西,可是许多初学者却简单忽视,Java 的 8 种根本数据类型中不包括 String,根本数据类型中用来描绘文本数据的是 char,可是它只能表明单个字符,比方 'a','好' 之类的,假如要描绘一段文本,就需要用多个 char 类型的变量,也便是一个 char 类型数组,比方“你好” 便是长度为2的数组 char[] chars = {'你','好'};

可是运用数组过于费事,所以就有了 String,String 底层便是一个 char 类型的数组,仅仅运用的时分开发者不需要直接操作底层数组,用愈加简洁的办法即可完结对字符串的运用。


高频面试题

1、== 和 equals 的差异?

== 能够理解为是比较栈内存中的值,假如变量是根本数据类型,则栈内存中寄存的便是详细数值,假如是引证类型,则栈中寄存的是引证的内存地址。

所以关于根本数据类型,== 是比较值是否持平,关于引证数据类型,比较的是引证的内存地址是否持平。


equals 是 Object 类供给的一个办法,其本质便是在用 == 进行判别。

public boolean equals(Object obj) {
return (this == obj);
}

一同 Java 中恣意一个类都能够对其进行重写,依据详细需求从头界说其判别逻辑,比方咱们自界说一个 Student 类,如下所示。

public class Student {
private Integer id;
private String name;
public Student(Integer id, String name) {
this.id = id;
this.name = name;
}
}

创立两个成员变量值彻底持平的实例化目标,并用 equals 办法判别是否持平。

Student student1 = new Student(1,"张三");
Student student2 = new Student(1,"张三");
System.out.println(student1.equals(student2));

成果为 false,由于有两个实例化目标,就必定会在堆内存中拓荒两块空间来存储,引证一定是不相同的。而在实际的逻辑中,假如两个学生的 id 和 name 都相同,咱们就以为他们是同一个学生,用程序如何来完结呢?经过重写 equals 办法即可,如下所示。

public class Student {
private Integer id;
private String name;
public Student(Integer id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj) {
Student student = (Student) obj;
if(id.equals(student.id) && name.equals(student.name)){
return true;
}
return false;
}
}

再次运转代码,回来值为 true。

2、下面代码的运转成果是?

String str1 = "Hello World";
String str2 = "Hello"+" World";
System.out.println(str1 == str2);

true,"Hello" 和 " World" 都是字符串字面值,字符串字面值 + 字符串字面值的成果依然保存在字符串常量池中,所以 str1 和 str2 相同。

3、下面代码的运转成果是?

String str1 = "Hello World";
String str2 = "Hello";
str2 += " World";
System.out.println(str1 == str2);

false,这题看似与第 2 题相同,为什么成果彻底不同呢?由于 str2 = "Hello"+" World" 是直接创立,str2 = "Hello"; str2 = "Hello"; 是先创立再修正,一同修正完结之后的字符串是放在堆内存中的,为什么呢?由于 str2 是一个字符串变量," World" 是字符串字面值,当字符串字面值与 String 类型变量拼接时,得到的新字符串不再保存在常量池中,而是在堆中拓荒一块新的空间来存储,所以 str1 引证指向字符串常量池,str2 引证指向堆内存,必定不相同。

4、下面代码的运转成果是?

String str1 = "Hello World";
String str2 = " World";
String str3 = "Hello"+str2;
System.out.println(str1 == str3);

false,str2 是变量,"Hello" 是字符串字面值,字符串字面值 + 变量会在堆内存中拓荒新的空间来存储,所以 str1 和 str3 不同。

5、下面代码的运转成果是?

String str1 = "Hello World";
final String str2 = " World";
String str3 = "Hello"+str2;
System.out.println(str1 == str3);

true,"Hello" 是字符串字面值,str2 是常量,字符串字面值+常量的成果依然保存在字符串常量池中,所以 str1 和 str3 相同。

6、下面代码的运转成果是?

String str1 = "Hello World";
final String str2 = new String(" World");
String str3 = "Hello"+str2;
System.out.println(str1 == str3);

false,str2 是常量,可是 new String(" World") 保存在堆内存中,所以即便运用 final 进行了润饰,str2 依然保存在堆中,则 str3 也就保存在堆中,所以 str1 和 str3 不同。

7、下面代码的运转成果是?

String str1 = "Hello World";
String str2 = "Hello";
String str3 = " World";
String str4 = str2 + str3;
System.out.println(str4.intern() == str1);

true,当调用 str4 的 intern 办法时,假如字符串常量池现已包括一个等于 str4 的字符串,则回来该字符串,否则将 str4 添加到字符串常量池中,并回来其引证,所以 str4.intern() 与 str1 相同。

8、什么是字符串常量池?

字符串常量池坐落堆内存中,专门用来存储字符串常量,能够进步内存的运用率,防止拓荒多块空间存储相同的字符串,在创立字符串时 JVM 会首要查看字符串常量池,假如该字符串现已存在池中,则回来它的引证,假如不存在,则实例化一个字符串放到池中,并回来其引证。

9、String 是线程安全的吗?

String 是不可变类,一旦创立了String目标,咱们就无法改动它的值。因而它是线程安全的,同一个字符串实例能够被多个线程同享,确保了多线程的安全性。

10、在运用 HashMap 的时分,用 String 做 key 有什么优点?

HashMap 内部完结是经过 key 的 hashcode 来确认 value 的存储方位,由于字符串是不可变的,所以当创立字符串时,它的 hashcode 被缓存下来,不需要再次核算,所以比较于其他目标更快。


上一篇引荐:

6个常见的高并发缓存问题,你知道几个?


最终

欢迎咱们一同沟通,喜爱文章记住重视我点赞转发哟,感谢支撑

雷火电竞版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

最近发表

    雷火电竞下载_雷火网站_雷火苹果app

    http://www.home-keiji.com/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    雷火电竞出品