【JDK】分析 String str=““ 与 new String()
一、基础概念
为了讲清楚他们的差异,这里先介绍几个概念。
1.1 常量池
所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class
文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。
1.2 字符串常量池
在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。
当我们需要使用字符串时,首先会在该字符串常量中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。
1.3 在编译期间创建的常量和运行期间创建的常量保存的地址是不一样的
对象的引用都是存放在栈中
- 编译期间创建的常量保存在常量池中;
- 运行期间通过
new
创建时,会直接创建一个新字符串常量并会存储在堆中。
所以我们可以发现,在堆中,可以有很多重复相同的字符串,而在常量池中,不会出现重复的值。
1.4 equals()
与==
==
- 如果是基本类型,
==
表示判断它们值是否相等; - 如果是引用对象,
==
表示判断两个对象指向的内存地址是否相同。
equals()
equals()
方法未被重写时(Object
时),比较的是内存地址;equals()
方法被String
、Integer
、Date
等类重写时,其比较的是两个内容是否相同。
二、String str=""
与new String()
的区别
2.1 String str=""
例如:
String str = "风尘博客";
- 先在栈区创建
str
引用,然后关于创建对象。
这个表达式,可能会创建一个对象,也可能不会创建对象。
- 如果常量池中没有“风尘博客”这个字符串,就需要创建;
- 常量池中存在“风尘博客"这个字符串,就直接拿来用。
- 最后
str
指向常量池中的对象。
注意!这里就是上面说的,从常量池中直接取用,所以,两者引用地址应该也相同,即
==
比较为true
。
2.2 String str=new String()
String str=new String(“风尘博客”)
- 同样的,先在栈区创建
str
引用;
这个表达式,可能会创建一个对象,也可能创建两个对象。
- 然后会直接创建一个字符串存放在堆中;
- 其次,同样的:如果常量池中没有“风尘博客”这个字符串,就需要创建;常量池中存在“风尘博客"这个字符串,就直接拿来用。
- 最后
str
指向常量池中的对象。
注意!这里这里和上面不一样,这里直接在堆里创建对象,每新建一个都会创建一个,所以,两者引用地址肯定不相同,即
==
比较为false
。
【JDK】分析 String str=““ 与 new String()的更多相关文章
- compareTo(String str)与compareToIgnoreCase(String str)
一.compareTo(String str)方法 返回值:如果参数字符串等于此字符串,则返回值 0:如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值:如果此字符串按字典顺序大于字符串参 ...
- String str=null; 和String str=""的区别
1.最大的区别在于String str=null没有分配内存,String str=""分配了内存 2.String str=null 这个引用指向了一个null ,没有地址没 ...
- String str="abc";和String str2=new String("abc");有什么区别?
- .NET中string[]数组和List<string>泛型的相互转换以及Array类的Sort()方法(转)
从string[]转List<string>: " }; List<string> list = new List<string>(str); 从List ...
- Library string type(2)——关于String的操作
关于string的定义,请参阅博文http://blog.csdn.net/larry233/article/details/51483827 string的操作 s.empty() //Return ...
- Array和String测试与java.String.split
java.string.split() 存在于java.lang包中,返回值是一个数组. 作用是按指定字符或者正则去切割某个字符串,结果以字符串数组形式返回. 例 String [] toSort = ...
- JDK源码分析(1)之 String 相关
在此之前有无数次下定决心要把JDK的源码大致看一遍,但是每次还没点开就已被一个超链接或者其他事情吸引直接跳开了.直到最近突然意识到,因为对源码的了解不深导致踩了许多莫名其妙的坑,所以再次下定决心要把 ...
- jdk分析之String
public class StringDemo01 { public static void main(String[] args) { String s1 = new String(" ...
- String str = new String("xyz") 会创建几个对象
转载:https://blog.csdn.net/andychen314/article/details/50857313 答案是 两个对象,要理解这个,就要知道string类的工作原理.下面来慢慢分 ...
随机推荐
- tomcat及springboot实现Filter、Servlet、Listener
tomcat实现: 核心类org.apache.catalina.startup.ContextConfig //支持注解 see:org.apache.catalina.deploy.WebXml ...
- Git-05-文件删除与恢复
删除文件 1 添加一个文件test.txt文件用于测试 2 删除文件,这样删除,工作区和版本库一致 也可以直接rm 然后在 git rm,git commit 这样也能保证工作区和版本库一致 恢复误删 ...
- 浅析Java断言
Java断言 1.断言的概念 Java的断言机制assert是一种用于测试阶段的语法特性,它允许我们在测试期间向代码中插入一些检查语句.代码发布时这些检测语句将被自动移除. 断言关键字assert有下 ...
- 我的微服务之路,看我搭建dapr趟过的坑
前言 自从上周看了一个Dapr的视频,知道原来自己离微服务很近,简直触手可及. 心痒痒好久了,不动手实践验证一下简直是寝食难安.先是看官网的文档,可能是因为被墙了,有些网址是不能访问的,那安装搭建环境 ...
- 算法入门 - 动态数组的实现(Java版本)
静态数组 Java中最基本的数组大家肯定不会陌生: int[] array = new int[6]; for (int i = 0; i < array.length; i++){ array ...
- Clusternet - 新一代开源多集群管理与应用治理项目
作者 徐迪,腾讯云容器技术专家. 汝英哲,腾讯云高级产品经理. 摘要 在过去的数年里,云计算领域经历了多次巨大的变革,当前越来越多的组织将应用部署在本地和云上的多个基础设施平台上,这些平台可能是两个公 ...
- 使用C# 实现串口拨号器的SIM卡通信
参考网址:https://www.cnblogs.com/xugang/archive/2012/08/23/2652671.html 写此博客意为抛砖引玉,希望能和博客园的朋友们探讨一下关于.NET ...
- C# WCF的POST请求包含Stream及多个参数
当使用WCF的API的POST请求时,如果参数列表里,除了Stream类型形参,还具有多个形参, 在寄宿过程中会报错: 约定"IService1"中的操作"DoWork& ...
- (5)air202读取串口数据并上传到阿里云显示
一.首先进行云端设置 根据串口助手显示的信息,以及模块文档说明我们可以知道 其中red和ir是红光LED的原始数据, HR表示心率值, HRvalid是心率是否有效标识, SP02是血氧数值,,SPO ...
- 使用dom4j工具:获得文本内容(四)
package dom4j_read; import java.io.File; import org.dom4j.Document; import org.dom4j.Element; import ...