String连环问,你能接的下来几问?

简介: String连环问,你能接的下来几问?
免得说我欺负你,先来个简单的给你热热身

1、String 是最基本的数据类型吗?

不是

  • Java 中的基本数据类型只有 8 个 :byte、short、int、long、float、double、char、boolean;除了基本类型,剩下的都是引用类型,Java 5 以后引入的枚举类型也算是一种比较特殊的引用类型。

2、字符型常量和字符串常量的区别?

  1. 形式上: 字符常量是单引号引起的一个字符,字符串常量是双引号引起的若干个字符;
  2. 含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放位置,相当于对象;
  3. 占内存大小:字符常量只占 2 个字节;字符串常量占若干个字节(至少一个字符结束标志) (注意: char 在Java中占两个字节)。

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

  • 字符串常量池:jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串常量池。当需要使用字符串时,先去字符串常量池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符串常量池中。
  • 所处位置说明

    1. 在jdk6中,常量池的位置在永久代(方法区)中,此时常量池中存储的是对象。
    2. 在jdk7中,常量池的位置在堆中,此时,常量池存储的就是引用了。
    3. 在jdk8中,永久代(方法区)被元空间取代了。

4、String str=new String("aaa")创建了几个对象?

1个或者2个

  • 第一种情况:字符串常量池中已经有了 "aaa" 字符串常量了,那么此时会在堆中通过 new String()方法 创建 1 个字符串对象。
  • 第二种情况:那就是字符串常量池中没有 "aaa" 字符串常量了,此时会创建 2 个对象。首先 "aaa" 该表达式会查看字符串常量池中是否含有 "aaa" 常量,如果没有的话,那么在字符串常量池中就会生成一个值为 "aaa" 的字符串常量,然后再在堆中通过 new String()方法 创建一个值为 "aaa" 的对象。

5、字符串的 intern 方法的执行过程是怎样的?

你学 Java 的别这个高频知识点都不知道呀不知道的赶紧偷摸补一下

在解析这个问题之前,我们先来做个题目:

public class Test {
    public static void main(String[] args) {
        String s = new String("2");
        s.intern();
        String s1 = "2";
        System.out.println(s == s1);

        String s3 = new String("3") + new String("3");
        s3.intern();
        String s4 = "33";
        System.out.println(s3 == s4);
    }
}
  • 输出结果
//jdk6
false
false

//jdk7
false
true

intern 方法在JDK1.6以前 和 JDK1.7以后有不同的处理:

  • JDK1.6中,intern 的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,则将该字符串常量加入到字符串常量区,也就是在字符串常量区建立该常量;
  • JDK1.7中,intern 的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,说明该字符串常量在堆中,则处理是把堆区该对象的引用加入到字符串常量池中,以后别人拿到的是该字符串常量的引用,实际存在堆中。

6、String,StringBuffer,StringBuilder 的区别是什么?

  • 可变与不可变
  1. String
// 源码
private final char value[];

String 类中使用字符数组保存字符串,因为有 “final” 修饰符,所以 String 对象是不可变的。对于已经存在的 String 对象的修改都是重新创建一个新的对象,然后把新的值保存进去。

  1. StringBufferStringBuilder
// 源码
char[] value;

StringBufferStringBuilder 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串,这两种对象都是可变的。

  • 是否多线程安全
  1. String 中的对象是不可变的,也就可以理解为常量,显然线程安全。
  2. StringBuilder 是非线程安全的。
  3. StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
// StringBuffer 的追加操作
public synchronized StringBuffer append(StringBuffer sb) {
     toStringCache = null;
     super.append(sb);
     return this;
 }
  • 性能
  1. 每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
  2. StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

7、String为什么要设计成不可变的?

  1. 便于实现字符串常量池
  2. 使多线程安全
  3. 避免安全问题:在网络连接和数据库连接中字符串常常作为参数,例如,网络连接地址 URL,文件路径path,反射机制所需要的String参数。其不可变性可以保证连接的安全性。如果字符串是可变的,黑客就有可能改变字符串指向对象的值,那么会引起很严重的安全问题。
  4. 加快字符串处理速度:由于String是不可变的,保证了hashcode的唯一性,于是在创建对象时其hashcode就可以放心的缓存了,不需要重新计算。这也就是Map喜欢将String作为Key的原因。
相关文章
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
40 0
java基础(13)String类
|
3月前
|
API 索引
String类下常用API
String类下常用API
44 1
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
58 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
1月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
30 2
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
22 1
|
2月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
1月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
54 4
|
1月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
25 2
|
1月前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
36 4
|
1月前
|
存储 编译器 程序员
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
65 2
下一篇
无影云桌面