`

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")这种代码绝对没有必要写,特别是在多次循环中,非常浪费,还有类似字符串累加不要太多
分享到:
评论

相关推荐

    StringAPI.java

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

    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 ...

    《C++String深入详解2.0版》PDF

    一、 C++的string的使用 3 1.1 C++ string简介 3 1.2 string的成员 3 1.2.1 append 3 1.2.2 assign 4 1.2.3 at 4 1.2.4 begin 5 1.2.5 c_str 5 1.2.6 capacity 5 1.2.7 clear 6 1.2.8 compare 6 1.2.9 copy 6 1.2.10...

    基于Keil实现字符串函数string.h的简单应用

    基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用...

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

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

    详解C++ string常用截取字符串方法

    string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos); 其中strSub是需要寻找的子字符串,npos为查找起始位置。找到返回子...

    StringUtil.java

    java编程中对字符串的各种方式的处理,包括(空字符串处理、判断是否是空字符串 null和"" 都返回 true、 把string array or list用给定的符号symbol连接成一个字符串、 判定第一个字符串是否等于的第二个字符串中的某...

    305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)

    305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)...

    C语言头文件 STRING.H

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

    C#_string_byte数组转换解析

    C# string byte数组转换解析 C# string byte数组转换实现的过程是什么呢?C# string byte数组间的转换需要注意什么呢?C# string byte数组间转换所涉及的方法是什么呢?让我们来看看具体的内容: C# string byte数组...

    c++作业设计string类

    设计string类 要求: 1、为该类定义构造函数,析构函数和赋值操作。构造函数至少应有三个:无参构造函数、C风格字符串构造函数和复制构造函数 2、为string类提供必要的成员函数,可以参考C++类库的string类提供了...

    C# char[]与string byte[]与string之间的转换详解

    1、char[]与string之间的转换 //string 转换成 Char[] string str=hello; char[] arr=str.ToCharArray(); //Char[] 转换成 string string str1 = new string(arr); 2、byte[]与string之间的转化 string str = 你好...

    《深入学习c++string》2.1版

    一、 C++的string的使用 4 1.1 C++ string简介 4 1.2 string的成员 4 1.2.1 append 4 1.2.2 assign 5 1.2.3 at 5 1.2.4 begin 6 1.2.5 c_str 6 1.2.6 capacity 6 1.2.7 clear 7 1.2.8 compare 7 1.2.9 copy 7 1.2.10...

    c++ string转换double

    string转换double string转换double string转换double string转换double

    C-Lib-string.c

    Linux的作者Linus Torvalds的C语言函数库源代码(部分)string.c &lt;br&gt;1 /* 2 * linux/lib/string.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 */ 6 7 /* 8 * stupid library ...

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

    String和string区别以及string详解

    string

    string

    protobuf根据DebugString输出字串反解pb对象的实例(C++)

    使用过protobuf的同学肯定对pb的DebugString相关方法再熟悉不过了,其作用就是打印输出pb对象。有些时候我们可能会有根据这个输出还原原始pb对象的需求。仔细观察发现输出并不是标准json格式,也就是说基于json→pb...

    String.h函数详解

    String.h函数详解 1、strcpy  函数名: stpcpy  功 能: 拷贝一个字符串到另一个  用 法: char *stpcpy(char *destin, char *source);  程序例:  #include &lt;stdio.h&gt;  #include &lt;string.h&gt;  int main...

    js中string和number类型互转换技巧(分享)

    1、string–&gt;number string类型 *1 即可变成 number类型 2、number–&gt;string number类型 +’‘ 即可变成 string 类型 [removed] function screenInfo() { var str = '012.8372'; var s = 0; str = str...

Global site tag (gtag.js) - Google Analytics