一、基础概念

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

1.1 常量池

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

1.2 字符串常量池

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

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

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

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

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

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

1.4 equals()==

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

二、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. Go语言笔记[实现一个Web框架实战]——EzWeb框架(一)

    Go语言笔记[实现一个Web框架实战]--EzWeb框架(一) 一.Golang中的net/http标准库如何处理一个请求 func main() { http.HandleFunc("/& ...

  2. Java 多线程与并发【知识点笔记】

    Java 多线程与并发[知识点笔记] Java多线程与并发 先说一下线程与进程的由来: 在初期的计算机,计算机只能串行执行任务,并且需要长时间的等待用户的输入才行 到了后来,出现了批处理,可以预先将用 ...

  3. NOIP 模拟 $18\; \rm 炼金术士的疑惑$

    题解 \(by\;zj\varphi\) 高斯消元 根据高中化学知识,求解方程的就是一直方程凑出来的,焓值也一样 那么对于要求的方程和一直方程,我们做一次高斯消元,以每个物质为未知数,因为它保证有解, ...

  4. asp.net core 搭建WebAPI微服务-----cosnul服务

    参考网址:https://blog.csdn.net/weixin_42084199/article/details/108643555 在此之前需要准备的是: vs2019,以往版本不支持dotne ...

  5. 互斥锁(Lock)

    转载至:https://www.cnblogs.com/dolphin0520/p/3923167.html 一.synchronized的缺陷 synchronized是java中的一个关键字,也就 ...

  6. Sublime Text3 显示左侧的目录树

    file->open folder选择一个文件夹,打开一个新窗口把原来的关掉 View->Sise Bar->Hide Side Bar就可以了

  7. 漫画CAS 的ABA 问题

    链接:https://blog.csdn.net/bjweimengshu/article/details/79000506

  8. Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!

    在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常?                      注意:M ...

  9. jQuery中的内容、可见性过滤选择器(四、四)::contains()、:empty、:has()、:parent、:hidden、:visible

    <!DOCTYPE html> <html> <head> <title>内容.可见性过滤选择器</title> <meta http ...

  10. 微信小程序学习笔记四 页面的生命周期

    1. 生命周期 1.1 对应阶段说明 onLOad(Object query) 1.1 页面加载时触发, 一个页面只会调用一次, 可以在 onLoad的参数中获取打开当前页面路径中的参数 1.2 参数 ...