`

String

阅读更多
写一篇String的blog,算是自己的笔记
public class StringTest {
	public static void main(String[] args) {
		/*
		 * 这句在编译的时候就在常量池确定了Hello字符串对象,
		 * 之后在运行时会通过ldc指令在常量池分配“Hello”字
		 * 符串对象并将引用压入操作数栈 (注意这里在常量池分
		 * 配的是String对象,不要认为char数组)
		 */
		String s1 = "Hello";

		/*
		 * 这一步并没有在编译的时候就在常量池确定了
		 * HelloWorld字符串(这个要注意) 通过字节码可以看见
		 * ,他会new一个StringBuilder对象,然后
		 * 在常量池分配World字符串对象,然后调用
		 * StringBuilder的append方法生成具有
		 * HelloWorld字符数组的StringBuilder
		 * 最后调用toString返回HelloWorld字符
		 * 串对象的引用,通过 看StringBuilder的
		 * toString 实现(return new String 
		 * (value, 0, count))就可以看见返回的
		 * 对象是new出来的,所以此时s1指向的堆中
		 * 的String对象,当然常量池一定也有 
		 * HelloWorld字符串对象
		 * 
		 * 到这一步,常量池中会有Hello字符串对象
		 * 和HelloWorld字符 串对象,而s1指向的
		 * 是堆中的HelloWorld字符串对象
		 */
		s1 = s1 + "World";

		/*
		 * 这里s2会指向常量池中早已经创建好的对象
		 * 常量池中不会重复创建含有相同字符序列的对象
		 */
		String s2 = "HelloWorld";

		// 所以很明显这里的s1和s2指向的分别是堆中的对象和常量池中的对象
		System.out.println(s1 == s2); // 打印false
		// 当然里面的字符串字面值是一样的
		System.out.println(s1.equals(s2));// 打印true

		String s3 = new String("HelloWorld");

		/*
		 * 这里的s3当然也会在堆中创建字符串对象, 
		 * 当然常量池中已经有HelloWorld对象,
		 *  所以此时不会再在常量池创建
		 */

		/*
		 * 既然是new出来的新的东东, 所以当然和s1不同了,返回false
		 */
		System.out.println(s1 == s3);

	}
        /*当然类似这样的写法会在编译的时候就确定了hello world在常量池中
          0  ldc <String "hello world"> [55]
          2  astore_1 [s]
          3  return
        */
        void m2() {
		String s = "hello" + " " + "world";
	}


}

像这种问题面试的时候经常会出现,只有搞清楚原理才能够保证类似的问题绝对不会出错,而且可以说的很详细,还有比如类似String s = new String("HelloWorld")这种代码绝对没有必要写,特别是在多次循环中,非常浪费,还有类似字符串累加不要太多
分享到:
评论

相关推荐

    C语言头文件 STRING.H

    C语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING....

    StringtoList和StringtoMap和StringtoObject和StringtoArray

    Map&lt;String, String&gt; map = gson.fromJson(jsonString, new TypeToken&lt;Map&lt;String, String&gt;&gt;(){}.getType()); ``` 4. **String to Object** 如果JSON字符串代表的是一个自定义Java对象,你可以创建一个对应的类...

    C#中char[]与string之间的转换 string 转换成 Char[]

    C#中char[]与string之间的转换 C#中char[]与string之间的转换是一种常见的操作,我们经常需要在这两种数据类型之间进行转换。今天,我们将探讨C#中char[]与string之间的转换,包括string转换成Char[]和Char[]转换成...

    C# String 的各种转换

    ### C# String 的各种转换 在C#编程语言中,字符串与数字之间的转换是非常常见的操作。本文将详细介绍如何在C#中实现字符串与其他数据类型(如整数、浮点数等)之间的转换,并特别关注字符串与十六进制之间的转换。...

    StringAPI.java

    Java String 类型 API 测试代码 1.String和char[]之间的转换 toCharArray(); 2.String和byte[]之间的转换 getBytes() Arrays工具类 : Arrays.toString(names) String类 String replace(char oldChar, ...

    String和string区别以及string详解.doc

    标题与描述中提到的知识点是关于C#编程语言中`String`与`string`的区别,以及`string`类型的深入解析。以下是对这些知识点的详细解释: ### `String`与`string`的区别 #### 1. **位置与来源** - `String`是.NET ...

    String对象创建问题

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

    string和char*

    string 和 char* 的区别和联系 在 C++ 编程中,字符串是一种常用的数据类型,string、CString 和 char*都是字符串的 представители,每种类型都有其特点和使用场景。下面我们将详细介绍 string、...

    JavaBean与JsonString的相互转换

    在Java开发中,JavaBean和JsonString是两种常见的数据表示形式。JavaBean是Java对象的一种规范,用于封装数据,而JsonString是一种轻量级的数据交换格式,常用于前后端交互。本篇将深入探讨JavaBean与JsonString之间...

    List转换成String数组

    ### List转换成String数组 在Java编程中,我们经常需要对集合进行操作,尤其是在处理大量字符串数据时。本文将详细介绍如何将一个`List&lt;String&gt;`类型的集合转换为`String[]`数组,并通过不同的方法来实现这一过程。...

    String[] list 相互转化

    ### String[] 与 List 相互转化 在 Java 编程语言中,`String[]` 数组和 `List` 集合之间的相互转换是非常常见的需求。这两种数据结构各有优势:数组提供了固定长度且访问效率高的特性,而列表则支持动态调整大小...

    c++中double与string相互转换算法

    本文将详细讨论如何在C++中将`double`类型的数值转换为`std::string`字符串,以及如何将`std::string`转换回`double`。我们将基于提供的`stringtodouble`工程文件进行讨论。 首先,让我们探讨`double`转`string`的...

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

    在C++编程中,STL(Standard Template Library)的string类是用于处理文本字符串的强大工具。然而,在处理二进制数据时,需要注意string类的一些特性,因为它通常与文本字符串关联,而二进制数据可能包含特殊的字符...

    java基础String类选择题练习题

    根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...

    list转换成string数组

    ### List转换成String数组 在Java编程语言中,经常需要将`List&lt;String&gt;`类型的数据转换为`String[]`数组类型,以便于进行某些特定的操作或适应某些方法的要求。本文将详细探讨这一转换过程,并通过几个具体的示例来...

    public static String[] split(String s, String regex)

    public static String[] split(String s, String regex) s参数为待拆分字符串, regex参数有两种格式: 单字符的字符串(长度1),功能如下:split(“ab#12#453”, “#”) 返回带5个元素的数组:ab, #, 12, #, 453 ...

    String型的不可变性

    "String型的不可变性" Java 中的 String 型是一个特殊的包装类数据,它具有不可变性。什么是不可变性呢?简单来说,就是 String 对象一旦被创建,不能被修改。那么,为什么 String 对象不能被修改呢?这就需要从 ...

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

    在编程领域,尤其是在使用C++、Java或C#等面向对象的语言时,经常需要将字符串数组转换为单一的string类型。这种操作在处理数据输入、输出或者格式化时非常常见。下面我们将详细讨论如何在不同语言中实现这个过程,...

    string 对象 与json互转

    与此相关的,`String`对象是Java编程语言中的基础类型,用于存储和处理文本数据。在实际开发中,我们经常需要在`String`对象与JSON对象之间进行转换,以满足不同的需求。本文将深入探讨`String`与JSON的互转方法,并...

    HexString和Base64String的相互转换

    `HexString`和`Base64String`是两种常见的二进制数据的文本表示形式。理解它们的特性和转换方法对于开发人员来说是非常基础且实用的知识。 首先,`HexString`(十六进制字符串)是一种将二进制数据表示为十六进制...

Global site tag (gtag.js) - Google Analytics