`

关于String的问题

阅读更多

关于String的经典问题很多,不过弄清楚jvm如果创建和存储String对象,一般的问题应该都能对付

1 String对象的存放

   (1) 直接使用双引号:String s = "abc"; "abc"字符串存在jvm的常量池中,常量池在方法区中

   (2) 使用new String:String s = new String("abc");在堆中分配内存区域

 

2 + 操作String对象

      (1) String s = "a" + "bc";这种类型的操作,类文件在编译成class文件时,直接把"a" + "bc"编译成了"abc";常量池中只存在"abc",不存在"a", "bc"

      (2) String a = "a"; String b = "bc"; String c = a + b;针对这种操作,编译后的指令为:先创建一个StringBuilder对象,然后使用append方法,把两个字符串append进来,然后调用 toString方法,生成一个新的String对象

 

3 itern()方法

   该方法去查找常量池用没有,有则返回,没有创建

 

4 两个类同时声明相同的str

   比如:

public class StringDemo {
    private static String xx = "abc";
    public static void main (String[] args) {
        String a = "a";
        String b = "bc";
        String c = a + b;
        String d = "a" + "bc";
        String e = "abc";
        String ss = "x" + "yyy";
        System.out.println(e == c );
        System.out.println(e == d );
        System.out.println(xx == e);
        System.out.println(xx == TestDemo.str);
    }
}

class TestDemo {

    public static final String str = "abc";

//    public static final StringDemo strDemo = new StringDemo();

    static {
        System.out.println("TestDemo clinit...");
    }
}

   执行结果:

  

com.malone.common.StringDemo
false
true
true
true

   在类TestDemo.java声明了str对象,在StringDemo声明了xx,两个类使用了相同的字符串,常量池中只存在一个"abc"

   看一下上面mian函数编译后的命令:

  

  

ldc "a"
astore_1
ldc "bc"
astore_2
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder/<init>()V
aload_1
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload_2
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String;
astore_3
ldc "abc"
astore 4
ldc "abc"
astore 5
ldc "xyyy"
astore 6
getstatic java/lang/System/out Ljava/io/PrintStream;
aload 5
aload_3
if_acmpne 26
iconst_1
goto 27
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
getstatic java/lang/System/out Ljava/io/PrintStream;
aload 5
aload 4
if_acmpne 34
iconst_1
goto 35
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
getstatic java/lang/System/out Ljava/io/PrintStream;
getstatic com/malone/common/StringDemo/xx Ljava/lang/String;
aload 5
if_acmpne 42
iconst_1
goto 43
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
getstatic java/lang/System/out Ljava/io/PrintStream;
getstatic com/malone/common/StringDemo/xx Ljava/lang/String;
ldc "abc"
if_acmpne 50
iconst_1
goto 51
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
return

 

 

分享到:
评论

相关推荐

    String对象创建问题

    在Java编程语言中,`String`对象的创建是开发者经常遇到的问题,因为它涉及到内存管理和效率。`String`类在Java中被广泛使用,因为它代表不可变的字符序列,这使得它在很多场景下非常安全。这里我们将深入探讨`...

    string中的常见问题

    ### String中的常见问题 在Java编程语言中,`String` 类型是最常用的数据类型之一,它代表了不可变的字符序列。本文将基于提供的代码片段深入探讨与 `String` 类型相关的几个关键概念,包括字符串常量池、字符串...

    java基础String类选择题练习题

    - **知识点**:通过实际案例演示如何运用`String`和`StringBuffer`解决具体问题。 - **例题**:题目可能会要求解决一个特定的问题,如“如何将两个字符串合并成一个,并确保结果字符串是可变的?” 综上所述,这份...

    HexString和Base64String的相互转换

    在IT行业中,数据编码是至关重要的,特别是在网络通信和存储中。`HexString`和`Base64String`是两种常见的二进制数据...掌握这个小程序的使用,不仅可以帮助处理日常开发中的数据编码问题,还能加深对数据编码的理解。

    String类创建对象问题

    ### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...

    Java String对象的经典问题

    ### Java String对象的经典问题 #### 一、String 类与对象机制概述 在Java中,`String`类是一个非常重要的类,它提供了丰富的功能用于处理文本数据。`String`类是不可变的(immutable),这意味着一旦一个`String`...

    String和string区别以及string详解

    在编程领域,尤其是在C#语言中,`String`和`string`经常被提及,它们都是用来表示文本数据的类型,但两者之间存在微妙的区别。...理解和熟练运用`string`类型,对于提升编程技能和解决实际问题至关重要。

    idea连接达梦数据库出现input string "8"问题,驱动已修复

    本文将深入探讨在IntelliJ IDEA (简称IDEA) 中连接达梦数据库时遇到的“input string \"8\"”问题,以及如何通过修复驱动程序来解决这个问题。 达梦数据库是一款国产的高性能关系型数据库管理系统,广泛应用于政府...

    list转换成string数组

    - **数组长度**:当使用`new String[list.size()]`创建数组时,确保列表中的元素数量与数组长度一致,避免出现数组越界的问题。 - **性能考虑**:在转换过程中,尽量减少不必要的对象创建,尤其是当列表很大时,这...

    String a="hello" String b="hello" a==b 返回true的问题分析

    String a="hello world"; //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址...

    c++string用法详解

    C++ 语言中的字符串处理一直以来都是一个棘手的问题,许多开发者都认为 C++ 的文本处理功能太麻烦,不方便使用。但是,随着 STL 的出现,C++ 的字符串处理功能得到了极大的简化。特别是 C++ 的 string 类,它提供了...

    C++实现string存取二进制数据的方法

    一些开发者可能更倾向于使用原始的字符数组或`std::vector&lt;char&gt;`,因为它们更直观且避免了string对象的潜在问题。然而,对于简单的场景,string仍然是一种可行的解决方案。 总的来说,当在C++中使用string类处理二...

    字符串数组转换成string类型的

    此外,对于跨语言交互或底层系统编程,可能还会涉及到字符编码的问题,比如在C++中,如果你的字符串包含非ASCII字符,可能需要使用宽字符(如`wstring`)并考虑UTF-8编码。在Java和C#中,字符串默认是Unicode编码,...

    Arduino项目开发 Strings_StringSubstring_StringSubstring.pdf

    - **效率**:虽然`String`类方便了字符串操作,但过度使用可能导致内存问题,尤其是当处理大量数据或频繁创建新`String`对象时。因此,尽量减少不必要的复制和使用`substring()`。 在实际的Arduino项目中,`String`...

    c++ string转换double

    ### C++ 中 string 转换为 double 的方法 在 C++ 编程语言中,字符串(`std::string`)与数值类型(如 `int`、`double`)之间的转换是常见的需求之一。这种转换通常用于处理用户输入的数据、解析配置文件或处理网络...

    Android byte[] 和 String互相转换

    综上所述,理解和熟练掌握`byte[]`与`String`之间的转换,是Android开发中的一项基础技能,能帮助开发者处理各种数据交换和存储问题。在实际应用中,根据具体需求选择合适的转换方法和字符编码,是确保数据正确性和...

    Android String字符串数组动态增加

    但需要注意的是,如果涉及到大量的数据操作,应考虑效率问题,可能需要使用更高效的数据结构或缓存策略。同时,对于从XML资源初始化的数组,动态增加后就无法再直接使用R.array.*引用,需要通过ArrayList来操作。

    stringstream的应用

    为了解决这些问题,标准库提供了一种更好的转换选择,那就是使用 stringstream。 stringstream 是 C++ 中的一个流类,主要用来进行数据类型之间的转换。它可以将各种数据类型转换为 string 类型,也可以将 string ...

Global site tag (gtag.js) - Google Analytics