一、基础概念

为了讲清楚他们的差异,这里先介绍几个概念。

1.1 常量池

所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。

1.2 字符串常量池

在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。

当我们需要使用字符串时,首先会在该字符串常量中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。

1.3 在编译期间创建的常量和运行期间创建的常量保存的地址是不一样的

对象的引用都是存放在栈中

  1. 编译期间创建的常量保存在常量池中;
  2. 运行期间通过new创建时,会直接创建一个新字符串常量并会存储在堆中。

所以我们可以发现,在堆中,可以有很多重复相同的字符串,而在常量池中,不会出现重复的值。

1.4 equals()与==

  • ==
  1. 如果是基本类型,==表示判断它们值是否相等;
  2. 如果是引用对象,==表示判断两个对象指向的内存地址是否相同。
  • equals()
  1. equals()方法未被重写时(Object时),比较的是内存地址;
  2. equals()方法被String、Integer、Date等类重写时,其比较的是两个内容是否相同。

二、String str=""与new String()的区别

2.1 String str=""

例如:

String str = "风尘博客";
  • 先在栈区创建str引用,然后关于创建对象。

这个表达式,可能会创建一个对象,也可能不会创建对象。

  1. 如果常量池中没有“风尘博客”这个字符串,就需要创建;
  2. 常量池中存在“风尘博客"这个字符串,就直接拿来用。
  • 最后str指向常量池中的对象。

注意!这里就是上面说的,从常量池中直接取用,所以,两者引用地址应该也相同,即 == 比较为true。

2.2 String str=new String()

String str=new String(“风尘博客”)
  • 同样的,先在栈区创建str引用;

这个表达式,可能会创建一个对象,也可能创建两个对象。

  1. 然后会直接创建一个字符串存放在堆中;
  2. 其次,同样的:如果常量池中没有“风尘博客”这个字符串,就需要创建;常量池中存在“风尘博客"这个字符串,就直接拿来用。
  • 最后str指向常量池中的对象。

注意!这里这里和上面不一样,这里直接在堆里创建对象,每新建一个都会创建一个,所以,两者引用地址肯定不相同,即 == 比较为false。

【JDK】分析 String str=““ 与 new String()的更多相关文章

  1. compareTo(String str)与compareToIgnoreCase(String str)

    一.compareTo(String str)方法 返回值:如果参数字符串等于此字符串,则返回值 0:如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值:如果此字符串按字典顺序大于字符串参 ...

  2. String str=null; 和String str=""的区别

    1.最大的区别在于String str=null没有分配内存,String str=""分配了内存 2.String str=null   这个引用指向了一个null ,没有地址没 ...

  3. String str="abc";和String str2=new String("abc");有什么区别?

  4. .NET中string[]数组和List<string>泛型的相互转换以及Array类的Sort()方法(转)

    从string[]转List<string>: " }; List<string> list = new List<string>(str); 从List ...

  5. Library string type(2)——关于String的操作

    关于string的定义,请参阅博文http://blog.csdn.net/larry233/article/details/51483827 string的操作 s.empty() //Return ...

  6. Array和String测试与java.String.split

    java.string.split() 存在于java.lang包中,返回值是一个数组. 作用是按指定字符或者正则去切割某个字符串,结果以字符串数组形式返回. 例 String [] toSort = ...

  7. JDK源码分析(1)之 String 相关

    ​在此之前有无数次下定决心要把JDK的源码大致看一遍,但是每次还没点开就已被一个超链接或者其他事情吸引直接跳开了.直到最近突然意识到,因为对源码的了解不深导致踩了许多莫名其妙的坑,所以再次下定决心要把 ...

  8. jdk分析之String

      public class StringDemo01 { public static void main(String[] args) { String s1 = new String(" ...

  9. String str = new String("xyz") 会创建几个对象

    转载:https://blog.csdn.net/andychen314/article/details/50857313 答案是 两个对象,要理解这个,就要知道string类的工作原理.下面来慢慢分 ...

随机推荐

  1. 有赞Android实习五面都挂了,复习半月再战,转拿腾讯offer!

    缘起 为了有赞的面试准备了半个月的样子,当时还投了美团.字节.滴滴.京东,目的只有一个,就是要进大厂,但是只有有赞扛过了一面,其他都是一面就挂了. 前三面都自我感觉良好,以为能稳拿offer的,没想到 ...

  2. SunOS与Solaris系统的对应关系

    下文绝大部分译自维基百科Solaris词条的"历史"部分: http://en.wikipedia.org/wiki/Solaris_(operating_system)#Hist ...

  3. 一键部署lnmp基本

    #!/bin/bash systemctl stop firewalld systemctl disable firewalld setenforce 0 #--------nginx-------- ...

  4. SpringBoot开发十四-过滤敏感词

    项目需求-过滤敏感词 利用 Tire 树实现过滤敏感词 定义前缀树,根据敏感词初始化前缀树,编写过滤敏感词的方法 代码实现 我们首先把敏感词存到一个文件 sensitive.txt: 赌博 嫖娼 吸毒 ...

  5. noip13

    T1 一开始直接丢了个暴力走人50pts,然后开始打表找规律,啥也没找着,最后二十分钟突然看出来了什么,把 \(f_{n,m}\)式子列了一下,发现常数项没啥规律,最后五分钟,突然闪过一丝灵感,但是是 ...

  6. 题解 Cover

    传送门 考场上坚持认为树上背包可以有70pts,于是爆零了 首先我以为是树上背包的部分分其实是树形DP 然后极其魔鬼的正解: 首先我们令 \(dp[i][j]\) 为以i为根的子树覆盖次数至多为j时的 ...

  7. Windows安装Linux虚拟机(CentOS7)

    一.在电脑上安装虚拟机,百度搜索vmware,下载后傻瓜式安装即可. 二.CentOS下载,阿里云镜像:http://mirrors.aliyun.com/centos/7/isos/x86_64/. ...

  8. ES6中新增的数组知识记录

    JSON数组格式转换 let json = { '0': 'hello', '1': 'I am ', '2': 'michael', length:3 } 这就是一个JSON数组格式,跟普通的JSO ...

  9. C++ CLI简介(什么是C++ CLI)

    要知道C++/CLI是什么,首先知道什么是CLI. 一.CLI简介 CLI:(Common Language Infrastructure,通用语言框架)提供了一套可执行代码和它所运行需要的虚拟执行环 ...

  10. git 拉取代码指定分支

    问题背景: 新项目还在开发阶段,没有正式对外发布,所以开发同事合并代码到develop上(或者其他名称分支上),而不是到master分支上 通过git拉取代码的时候,默认拉取的是master分支,如下 ...