说明:

String在java中是使用频率很高的一个类,之前使用的时候并没有过多的在意,只知道有两种赋值方式,一种是采用字面值方式(String string1 = “string”;),一种是使用new关键字(String string2 = new String(“string”);)。如果使用string1==string2比较的话,你会发现结果为false,说明两者的地址并不一致,虽然我知道两个String比较的话为了避免出错要用string1.equals(string2),但是不知道为什么这么约定,直到今天才渐渐明白……

正是由于String是比较常用的类,不管是用户输入的字符串还是一些文本信息,都要使用String类。java为了提高效率,便于高效的管理这些String对象,设计了String池(String pool)用于存放String对象,下面我们来分析一下两种创建String对象的机制。

第一种方式:

String string1 = “string”;,这种采用字面值创建String对象的方法,首先检查 String Pool 中是否存在“string”这个对象:

1、如果存在,则不创建任何对象,直接将 String Pool 中的这个 string 对象的地址返回来,赋值给 string1 这个引用,这样 string1 就指向 String Pool 中的 “string” 这个对象;

2、如果 String Pool 中不存在 “string”这个对象,那么就先在 String Pool 中创建一个 “string” 对象,然后将 String Pool 中这个 “string” 对象的地址返回来。

第二种方式:

String string2 = new String(“string”);,众所周知new出来的对象是创建在堆内存中的,但是这里因为有 String Pool 的概念,所以略有不同,首先还是检查 String Pool 中是否存在“string”这个对象:

1、如果存在,则不在 String Pool 中再创建 “string”这个对象了,而是在堆内存(heap)中直接创建一个“string”对象,然后将堆中这个 “string”对象的地址返回来,赋值给 string2 引用,这时 string2 指向的是堆中的 “string”对象,注意并不是指向 String Pool;

2、如果 String Pool 不存在 “string”这个对象,则首先在 String Pool 中创建一个“string”对象(为了方便管理嘛),然后再在堆中创建一个“string”对象,返回堆中这个“string”对象的地址,赋值给 string2 这个引用,这便使得 string2 指向了堆中的对应地址。

总结:

使用字面赋值方式创建 String 对象,返回的地址是指向 String Pool 中的,而使用new关键字创建的 String 对象,返回的地址是指向堆内存的。

public class Test {

public static void main(String args[]) {

String string1 = "string";

String string2 = new String("string");

System.out.println(string1 == string2);

}

}

因此这里输出的肯定是false。

JAVA中string的赋值_Java中关于String赋值的两种形式相关推荐

  1. java校验码的设计_Java动态验证码单线设计的两种方法

    1.java的动态验证码我这里将介绍两种方法: 一:根据java本身提供的一种验证码的写法,这种呢只限于大家了解就可以了,因为java自带的模式编写的在实际开发中是没有意义的,所以只供学习一下就可以了 ...

  2. java传参数的方法_java中方法的参数传递机制

    无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些.闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递. 这里的内存模型涉及到 ...

  3. java 中 如何sum 乘法_JAVA中解决大数乘法和加法问题

    前言 在日常的算法练习中难免会遇见涉及阶乘的计算的题目,总所周知阶乘的数据会变得非常大,此时int和long型都装不下只能借助于String来表示,所以这里特为大家提供两种解决方案:1.使用Java ...

  4. java语言的多态性及特点_Java中的方法的多态性有两种形式:( )和( )。_学小易找答案...

    [填空题]已知函数 ,则微分 . [填空题]. [单选题]71.用转动小滑板法车圆锥时产生( )误差的原因是小滑板转动角度计算错误. [单选题] [填空题]Java中的方法的多态性有两种形式:( )和 ...

  5. php内li背景色,CSS_css中ul li的背景小图标属性设置的两种情况,这里我们分两种情况列出: ① - phpStudy...

    css中ul li的背景小图标属性设置的两种情况 这里我们分两种情况列出: ①当标题前的图标是很长的一绺而不是单独的一个点或者类似图标时,在定义背景图background要定义在 里.因为很长,所以放 ...

  6. c语言中的普通字符包括什么,【判断题】C语言中的字符常量通常有两种形式:普通字符和转义字符。...

    [判断题]C语言中的字符常量通常有两种形式:普通字符和转义字符. 更多相关问题 ---Can you speak French?---Yes, but only____.A.a littleB.lit ...

  7. windows系统中,在当前目录下打开cmd命令行的两种方法

    windows系统中,在当前目录下打开cmd命令行的两种方法 1.在当前路径地址栏中直接输入'cmd',然后回车. 2.在当前路径下,按住'shift'键同时点击鼠标右键,点击"在此处打开P ...

  8. ASP.NET中对Exception的统一集中处理常见的有两种方式的一些问题总结

    ASP.NET中对Exception的统一集中处理常见的有两种方式: 1.通过配置Web.config的customErrors节点,配置defaultRedirect属性来实现所有"未处理 ...

  9. java实参将数据传递给形参的两种形式

    java实参将数据传递给形参的两种形式 /*** java实参将数据传递给形参的两种形式* 1,按值传递* 2,按引用传递* * 当参数是基本数据类型时,数据不占用堆内存,按值传递* 当参数是引用类型 ...

最新文章

  1. 选项选择Windows XP系统安装MySQL5.5.28图解
  2. 水晶报表printmode的ActiveX打印
  3. python 矩阵中的冒号 逗号
  4. python 时间模块备忘
  5. python ide如何运行_如何在Ubuntu上安装IDLE Python IDE
  6. NAPI模式--中断和轮询的折中以及一个负载均衡的问题
  7. 【学习·求职必备】入行深度学习之前,应该做好哪些准备
  8. 判断是否为ie8浏览器
  9. 数据结构(六)查找---多路查找树(2-3-4树)
  10. Win11系统如何设置任务栏新消息提醒
  11. 深入浅出Visual C++串口编程--深入浅出VC++串口编程之DOS的串口编程
  12. bzoj1967 [AHOI2005]穿越磁场 离散最短路
  13. 卢伟冰为Redmi K50电竞版预热:相机拍照效果越来越出色
  14. AI、大数据、中台、AIoT、Fintech等十余场火热专题应有尽有,年度盛会BDTC 2019邀您共赴!...
  15. Js与flash交互:在html页面中用js与MyReport插件交互
  16. 计算机网络防护,计算机网络防护方法与流程
  17. 欧派caxa设计软件_CAXA 2016 非常优秀的CAD电子图版设计软件
  18. oracle 如何防止锁表,oracle锁表该如何解决
  19. ubuntu系统,网页版音乐播放器无声音
  20. windows驱动签名

热门文章

  1. 面试题 : Intent、IntentFilter、PendingIntent的区别
  2. changePage() 页面跳转
  3. XML在线转化为JSON
  4. “没有找到iliertutil.dll,因此这个应用程序未能启动。”文件拷贝 PE 或者 dos...
  5. urlrewrite 保持 posturl
  6. Community Server系列之三:页面间关系2[介绍]
  7. C++中使用TCP传文件
  8. linux shell date 1,linux shell date命令的坑(date 1 month ago 的诡异现象)
  9. git:The authenticity of host 'github.com (13.250.177.223)' can't be established.
  10. matlab 矩阵数据生成.csv表格