设为首页 加入收藏

TOP

Java中关于String类以及字符串拼接的问题
2023-07-25 21:29:40 】 浏览:36
Tags:Java 关于 String 符串拼

面试题

  • String为什么不可变?
答案
/*
1.Java中String类维护一个final修饰的char[]数组实现不可变,意味着一旦分配了内存空间,它们就不能被修改。
2.我们所说的不可变指的是字符串池中的对象是不可更改的(这样方便JVM的内存管理) 但当前变量可以修改指向
eg1.当我们创建String实例的时候 字符串中存在-->返回引用,而不是开辟新的对象空间 不存在-->字符串中开辟对象空间并返回引用
eg2.当我们使用String中的方法来对其进行操作时,例如使用 replace() 方法修改字符串内容时,实际上是创建了一个新的字符串对象,并将其返回。
  原始的字符串本身并没有被修改,只是改变了指向该字符串的引用。这种设计保证了在多线程环境下,String对象不会被修改,从而提高了代码的可靠性和安全性。
*/
  • String s1=new String("abc");创建了几个字符串对象
答案
/*
创建一个字符串对象
在Java中,使用 String s = "abc" 方式创建的字符串常量在编译期就已经被确定并放入常量池中,
因此,如果使用 String s = "abc" 创建多个字符串对象时,实际上只有一个对象会被创建。
而使用 String s = new String("abc") 方式创建的字符串对象则是在运行时创建的,每次都会在堆中创建一个新的对象,
因此在本例中,该语句创建了一个在堆中的字符串对象
*/

String类部分源码

//被final修饰不可被继承
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    //String维护char[] 所以不可修改
    private final char value[];

创建String对象的方式

image

  • str1它首先会去方法区的常量池中找,有“hello”这个对象就直接引用,没有就创建一个新的对象“hello”,存放在常量池中。
  • 而new的方式首先会在堆中创建一个对象,然后再去常量池中找,有直接引用,没有就创建一个新的对象“hello”。

两者区别

  • 直接赋值创建0或1个对象,而new的方式创建1或2个对象。
  • 为了提升Java虚拟机的性能和减少内存的开销,避免字符串的重复创建,尽量少使用new的方式创建String对象

代码分析

public static void main(String[] args) {
        String str1 = "hello";//指向常量池中的引用
        String str2 = new String("hello");//指向堆中的引用
        String str3 = str2;//str3==str2 true
        String str4 = "hello";//str1==str4 true
    }

字符串拼接

String a="A";
String b="B";
String c=new String("C");
a="A"+b;//变量拼接 指向变为堆中地址
a="A"+c;//变量拼接 指向变为堆中地址!
a="A"+"A";//常量拼接依旧指向常量池中的地址 a=="AA" true
final String d="D";//这是常量
a="A"+d//a=="AD" true

+号变量拼接底层原理 StringBuidlerd构造初始化容量为16的char[] 然后调用append()进行拼接 最后将结果new String()的形式赋给左边变量

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SpringBoot(三) - Ribbon客户端负.. 下一篇Java多线程(6):锁与AQS(上)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目