关于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
相关推荐
在Java编程语言中,`String`对象的创建是开发者经常遇到的问题,因为它涉及到内存管理和效率。`String`类在Java中被广泛使用,因为它代表不可变的字符序列,这使得它在很多场景下非常安全。这里我们将深入探讨`...
### String中的常见问题 在Java编程语言中,`String` 类型是最常用的数据类型之一,它代表了不可变的字符序列。本文将基于提供的代码片段深入探讨与 `String` 类型相关的几个关键概念,包括字符串常量池、字符串...
- **知识点**:通过实际案例演示如何运用`String`和`StringBuffer`解决具体问题。 - **例题**:题目可能会要求解决一个特定的问题,如“如何将两个字符串合并成一个,并确保结果字符串是可变的?” 综上所述,这份...
在IT行业中,数据编码是至关重要的,特别是在网络通信和存储中。`HexString`和`Base64String`是两种常见的二进制数据...掌握这个小程序的使用,不仅可以帮助处理日常开发中的数据编码问题,还能加深对数据编码的理解。
### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...
### Java String对象的经典问题 #### 一、String 类与对象机制概述 在Java中,`String`类是一个非常重要的类,它提供了丰富的功能用于处理文本数据。`String`类是不可变的(immutable),这意味着一旦一个`String`...
在编程领域,尤其是在C#语言中,`String`和`string`经常被提及,它们都是用来表示文本数据的类型,但两者之间存在微妙的区别。...理解和熟练运用`string`类型,对于提升编程技能和解决实际问题至关重要。
本文将深入探讨在IntelliJ IDEA (简称IDEA) 中连接达梦数据库时遇到的“input string \"8\"”问题,以及如何通过修复驱动程序来解决这个问题。 达梦数据库是一款国产的高性能关系型数据库管理系统,广泛应用于政府...
- **数组长度**:当使用`new String[list.size()]`创建数组时,确保列表中的元素数量与数组长度一致,避免出现数组越界的问题。 - **性能考虑**:在转换过程中,尽量减少不必要的对象创建,尤其是当列表很大时,这...
String a="hello world"; //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址...
C++ 语言中的字符串处理一直以来都是一个棘手的问题,许多开发者都认为 C++ 的文本处理功能太麻烦,不方便使用。但是,随着 STL 的出现,C++ 的字符串处理功能得到了极大的简化。特别是 C++ 的 string 类,它提供了...
一些开发者可能更倾向于使用原始的字符数组或`std::vector<char>`,因为它们更直观且避免了string对象的潜在问题。然而,对于简单的场景,string仍然是一种可行的解决方案。 总的来说,当在C++中使用string类处理二...
此外,对于跨语言交互或底层系统编程,可能还会涉及到字符编码的问题,比如在C++中,如果你的字符串包含非ASCII字符,可能需要使用宽字符(如`wstring`)并考虑UTF-8编码。在Java和C#中,字符串默认是Unicode编码,...
- **效率**:虽然`String`类方便了字符串操作,但过度使用可能导致内存问题,尤其是当处理大量数据或频繁创建新`String`对象时。因此,尽量减少不必要的复制和使用`substring()`。 在实际的Arduino项目中,`String`...
### C++ 中 string 转换为 double 的方法 在 C++ 编程语言中,字符串(`std::string`)与数值类型(如 `int`、`double`)之间的转换是常见的需求之一。这种转换通常用于处理用户输入的数据、解析配置文件或处理网络...
为了解决这些问题,标准库提供了一种更好的转换选择,那就是使用 stringstream。 stringstream 是 C++ 中的一个流类,主要用来进行数据类型之间的转换。它可以将各种数据类型转换为 string 类型,也可以将 string ...
C++ String 详解可以自动管理内存,避免了内存泄露和溢出的问题,同时也提供了许多实用的操作函数,使得字符串操作变得更加简单和高效。 C++ String 详解的优点在于,它不需要担心内存的分配和释放,字符串的长度也...
本文将详细介绍 string、CString 和 char* 之间的转化问题,并提供了-six种不同的转化方法。 首先,让我们了解一下这三种类型的特点。CString 是基于 MFC 的一种字符串类型,安全性最高,但可移植性最差。string 是...