new String("ab")到底创建了几个对象? 之前一直被这个问题困扰,网上一些描述的都不是很清楚,自己看了一些资料可算搞清楚了,那就在博客上记录一下吧! String str = new String("ab"); 答案是2个 第一个是在堆中开辟了一块空间,存放String对象. 第二个是在字符串常量池中放入了一个"ab" 可通过其字节码证明. 字节码解释如下: 0 new #2 <java/lang/String> 这一步在…
String str=new String("aaa"); 这行代码究竟创建了几个String对象呢?答案是2个,而不是3个.由于 new String("aaa")相当于"aaa"与一个就是创建出来的放在堆时原实例对象,而另一个就是放在常量池中的 "aaa" 对象,当然这里的str本身只是一个引用,放在栈里,用来指向堆中创建出来的对象. 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class…
对于如下代码: package reviewTest; /** * @ClassName: StringTest * @Description: 测试String的字符串相加优化 * @author Kingram * @date 2018年7月27日 * */ public class StringTest { public static void main(String[] args) { String s1 = "a"; String s2 = s1 + "b"…
  String str=new String("aaa"); <span style="font-size:14px;">String str=new String("aaa");</span> 这行代码究竟创建了几个String对象呢?答案是2个,而不是3个.由于new String("aaa")相当于"aaa"与一个就是创建出来的放在堆时原实例对象,而另一个就是放在常量池中的…
首先看一下这道常见的面试题,下面代码中,会创建几个字符串对象? String s="a"+"b"+"c"; 如果你比较一下Java源代码和反编译后的字节码文件,就可以直观的看到答案,只创建了一个String对象. 估计大家会有疑问了,为什么源代码中字符串拼接的操作,在编译完成后会消失,直接呈现为一个拼接后的完整字符串呢? 这是因为在编译期间,应用了编译器优化中一种被称为常量折叠(Constant Folding)的技术,会将编译期常量的加减乘除的…
本篇重点(tips): 1. String Pool 是以Java 中 String 对象是不可变的这一特性为基础的 2. String Pool是Heap(堆)中的一块特殊空间(JDK 1.7 之前不是,是在PermGen里面,从1.7开始在heap里面了),存储不重复的String 常量 3. 用new关键字和用 "" 创建String 的方式有所不同.new 关键字每次都会在heap中创建一个新的String 对象, 用"" 创建(这种创建方式学名儿叫Stri…
前言 POLARDB For MySQL(下文简称POLARDB)目前是阿里云数据库团队主推的关系型数据库.线上已经有很多企业用户在使用并且稳定运行了很久.当然,由于POLARDB是为云上环境专门打造的数据库,与原生的官方MySQL相比,有一些需要注意的事项.前几个月的月报介绍了一些,详见这篇[月报](http://mysql.taobao.org/monthly/2018/10/01/),结合笔者最近几个月一线的开发和运维经验,总结出以下几点新的注意事项并给出了建议. 空表/空实例空间问题 由…
## 前言 POLARDB作为阿里云下一代关系型云数据库,自去年9月份公测以来,收到了不少客户的重点关注,今年5月份商业化后,许多大客户开始陆续迁移业务到POLARDB上,但是由于POLARDB的很多默认行为与RDS MySQL兼容版不一样,导致很多用户有诸多使用上的困惑,本来总结了几点,给大家答疑解惑.另外,本文提到的参数,在新版本上,用户都可以通过控制台修改,如果没有,可以联系售后服务修改.本文适合读者:阿里云售后服务,POLARDB用户,POLARDB内核开发者,需要有基本的数据库知识,最…
String str = new String(“abc”)  到底创建了几个对象? 首先String str是定义了一个字符串变量,并未产生对象,=不产生对象,那么只有后面的new String("abc")了.把它拆分成"abc"和new String(),首先在字符串常量池去寻找有没有"abc"这个字符串,没有就创建一个“abc”字符串对象在栈中,然后new String把这个字符串对象拷贝一份到堆中,返回这个对象的引用.所以一共产生两个对…
这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必要来说一说这个问题的. 从方法区说起 常量池存在于方法区,而方法区在jdk1.7版本前后改变比较大,所以还是先来说说方法区的演变. 在jdk1.7版本之前,常量池存在于方法区,方法区是堆的一个逻辑部分,他有一个名字叫做非堆. 1.7版本把字符串常量池放到了堆中. 而在1.8以后,则是移除了永…