String是在代码中非常常见的一种数据类型.它能直接像基本类型一样直接赋值(String str = "test"),也能像引用类型一样创建一个实例(String str = new String("test")),当然毫无疑问String是引用类型.

(1)Sring str = "test";  //此种方式会在字符串常量池中创建一个"test'"常量,当有一个新的变量同样也赋值为"test"时,这个新的变量也指向了这个"test"常量.

(2)String str = new String("test");  //此种方式会在堆内存中new一个"test"对象实例,详细分析见下文.


(1)只有使用引号包含文本的方式创建的String对象之间使用"+"连接产生的新对象才会被加入到字符串池中。

String str = "hello" + "world";        //这才会在字符串池中创建一个"helloworld"字符串,而不是去堆中创建一个String对象。

(2)对于所有包含new方式创建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中。

String str1 = "hello";
String str2 = "world";
String str = str1 + str2; //此时str产生的"helloworld"并不会在字符串池中,而是在堆中创建一个String对象。

综上.

tring str1 = "hello";
String str2 = "world";
String str3 = "hello" + "world";
String str4 = str1 + str2;
//str3 == str4 ->false,原因见上。str4是在堆中创建的String对象,str3是在字符串池中创建的的"helloworld"

但是!以上的情况是一般情况!

special1.这个例子实际仔细一分析也很好理解,STR1和STR2都是final常量,它们在类编译时就已经确定。

public class Demo {
public static final String STR1 = "hello";
public static final String STR2 = "world"; public static void main(String[] args) {
String str3 = "hello" + "world";
String str4 = STR1 + STR2;
System.out.println(str3 == str4); //true
}
}

special2.这个例子和上个例子不同在于final常量被声明的时候,并没有马上给它赋值。在str4被赋值前STR1+STR2是何值都还不确定,STR1和STR2在赋值前实际上就是一个变量而不是一个常量,那么str4就不能在编译期被确定,而只能在运行时被创建。

public class Demo {
public static final String STR1 ;
public static final String STR2 ;
static {
STR1 = "hello";
STR2 = "world";
} public static void main(String[] args) {
String str3 = "hello" + "world";
String str4 = STR1 + STR2;
System.out.println(str3 == str4); //false
}
}

回到开始提到的问题:

String str = new String("test"); //创建了几个对象?

2个。在类加载时会创建一个"xyz"对象放到字符串常量池中,在运行时会从常量池中赋值一份到堆中,并且将堆中这个对象的引用交给s1持有。

关于String的问题的更多相关文章

  1. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  2. JavaScript String对象

    本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...

  3. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  4. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  5. js报错: Uncaught RangeError: Invalid string length

    在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...

  6. c# 字符串连接使用“+”和string.format格式化两种方式

    参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...

  7. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

  8. JavaScript中String对象的方法介绍

    1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...

  9. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

  10. BCL中String.Join的实现

    在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...

随机推荐

  1. 大数据测试之hadoop系统生态

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标,也是国内最早探索大数据测试培训的机构,开发了独有的课程体系.如果对课程感兴趣,请大 ...

  2. js随机模块颜色

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  3. 细细探究MySQL Group Replicaiton — 配置维护故障处理全集

             本文主要描述 MySQL Group Replication的简易原理.搭建过程以及故障维护管理内容.由于是新技术,未在生产环境使用过,本文均是虚拟机测试,可能存在考虑不周跟思路有误 ...

  4. 实现五种分组加密模式ECB,CBC,CFB,OFB,CTR

    没什么好说的,简单无脑! #include<iostream>using namespace std; int ECB(){ int duan[4]; int messageLen = 1 ...

  5. jdk8的新特性 Lambda表达式

    很多同学一开始接触Java8可能对Java8 Lambda表达式有点陌生. //这是一个普通的集合 List<Employee> list = em.selectEmployeeByLog ...

  6. JS的内置对象以及JQuery中的部分内容

     [js中的数组]              1  数组的概念:可以再内存中连续存储的多个有序元素的结构                元素的顺序:称为下标,通过下标查找对应元素.           ...

  7. JS属性描述符

    var myObject = { a:2 }; Object.getOwnpropertyDescriptor(myObject,"a"); { value:2, writable ...

  8. STM32学习笔记(五)——通用定时器计数延时

    STM32定时器概述 STM32F40x系列总共最多有14个定时器,定时器分为三类:基本定时器.通用定时器和高级定时器.它们的都是通过计数来达到定时的目的,和51的定时器差不多,基本原理都是一样的,就 ...

  9. cookie方法封装及cookie缺点分析

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Consolas; color: #4f5d66 } p.p2 { margin: 0.0px ...

  10. 2017/4/27-Gradle的配置与Spring的下载

    Gradle的配置与Spring的下载 1.Gradle 1) 介绍 Gradle是一个基于Groovy的构建工具,类似Maven,但是比其更加简单轻便.它可以自动化地进行软件构建.测试.发布.部署. ...