【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类的工作原理.下面来慢慢分 ...
随机推荐
- 9419页最新一线互联网Android面试题解析大全
网上高级工程师面试相关文章鱼龙混杂,要么一堆内容,要么内容质量太浅, 鉴于此我整理了如下安卓开发高级工程师面试题以及答案帮助大家顺利进阶,下面进入正题: 一.Android相关 1.Activity ...
- pikachu CSRF
CSRF简介 CSRF 是 Cross Site Request Forgery 的 简称,中文名为跨域请求伪造在CSRF的攻击场景中,攻击者会伪造一个请求(一般是一个链接)然后欺骗目标用户进行点击, ...
- Emlog V6.0.0代码审计笔记
前言 emlog是一套基于PHP和MySQL的博客及CMS建站系统. emlog v6.0.0存在后台SQL注入漏洞. 分析 官网下载emlog最新版v6.0.0,本地搭建. 前台功能不多,参数基本都 ...
- XSS挑战20关
第一关: 没有过滤,直接构造payload过关: http://127.0.0.1/xssgame/level1.php?name=test%3Cscript%3Ealert%28111%29%3C/ ...
- 《手把手教你》系列技巧篇(二十一)-java+ selenium自动化测试-浏览器窗口的句柄(详细教程)
1.简介 今天本来就要分享和讲解三大延时等待的,但是在写作过程中发了问题,会用到这一个知识点,于是就提前介绍一下,以便后边用到了可以更好的理解和掌握.本文就是要介绍如何获得浏览器窗体的句柄或者叫编号, ...
- 【硬件模块】华为NBIOT 使用记录
From: https://liudongdong1.github.io/ 1. background Low power wide area network (LPWAN) has become a ...
- windows下安装mysql5.6.47版本
详情转载地址:https://www.cnblogs.com/alan-lin/p/9966917.html
- ubunt中,使用命令su命令切换root账户,提示认证失败
报错截图: 解决方法: sudo passwd 重新设置root账户的密码,确认root账户的密码(再次输入密码),然后su ,输入root账户刚刚设置的密码即可切入到root账户:
- SQL:多表查询
参考网址: https://zhuanlan.zhihu.com/p/91973413 此次主要介绍多表查询中的三部分:合并查询结果.连接查询(交叉连接.内连接.左连接.右连接.全连接)和CASE表达 ...
- IOC--框架进阶
IOC控制反转 含义:把高层对底层的依赖 转移到由第三方决定 避免高层对底层的直接依赖 使得程序架构具有良好的扩展性和稳定性 理解:就是一种目的--解除依赖 DI依赖注入 含义:在构造对象是 可以自动 ...