类String的比较
需要掌握的前提知识
1、知道什么是栈,什么是堆,什么是常量池,以及三者之间的区别。
2、想要不再纠结String的比较问题,需要掌握String literal.以及java虚拟机对String的处理机制
3、明白那些代码是在编译期产生,那些代码在运行期产生,也是有助于我们理解String的比较问题
一、String的声明与初始化的两种主要方式:
1.1、使用关键字new
对于String s1 = new String(“hello”)语句与String s2 = new String(“hello”)语句,存在两个引用对象s1、s2,而且还是两个内容相同字符串对象”hello”,但是纵使这样,他们在内存中的地址也是不同。因为在java中只要new总会产生新的对象。
1.2、直接定义赋值
对于String s1=”hello”;语句与String s2=”hello”语句:在jvm中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,s1,s2引用的同一个常量池中的对象。由于String采用了Flyweight的设计模式,当创建一个字符串常量时,例如String s3=”hello”;,会首先在字符串常量池中查找是否已经拥有相同的字符串被定义,其判断依据是String类的equals(Object)的返回值。若已经定义了,则直接获取对其定义的引用,此时不需要创建新的对象。若没有定义,就会在字符串常量池中创建新的对象,再将它的引用返回。由于String属于不可变类,一旦创建成功就不会被修改,因此String对象可以被共享并且不会不出现混乱。
具体而言:
String s="abc";//把"abc"放在常量池中,在编译期产生
String s= new String("abc");//运行期把"abc"放在堆里面
举例如下:
String s1 = "abc";//把字符串"abc"放在常量池中
String s2 = "abc";//s2 引用 常量池中的"abc"对象,因此不会在创建新的对象
String s3= new String("abc");//运行期在堆中创建新的对象
String s4= new String("abc");//运行期在堆中创建新的对象
图1:两种字符串存储方式如下:
二、String字符串的”+”连接字符串
让我们先看下面的代码
String s1="abc";
String s2="abc";
String s3=s1+s2;
String s4="abc"+"abc";
System.out.println(s3==s4);
输出结果为:false;
问什么会是false?在刚学习java没多久时笔者对这个问题也是弄得昏头转向,不明所以。
后来带着困惑看了一些书仔细琢磨后发现两句话就直接解决了:
1) 通过常量表达式计算的String,计算在编译时进行,并将它作为String字面常量对待。
2) 通过连接操作得到的String(非常量表达式),连接操作是运行时进行的,会新创建对象,所以它们是不同的。
当然你如果你已经是java大牛(比如通读java虚拟机和java编程思想)这些当然对你非常简单了。
三、String的”+”号创建对象问题
这个问题需要我们知道那些代码在编译期完成那些代码在运行期完成。
3.1、String str =”a”+”b”+”c”+”d”; 创建了几个对象?
答案:1个。
原因:”a”、”b”、”c”、”d”都是常量,”a”+”b”+”c”+”d”是一个常量表达式,常量表达式得到的String是在编译期计算得到的,因此执行这句话时只有”abcd”一个对象被创建。str代表”abcd”在常量池中的引用.
另外利用final修饰的常量也是同样的效果。
3.2、new String(“abc”)创建了几个对象?
答案:1个或者2个。
原因:如果常量池中已经存在”abc”,该句程序只会在堆中创建一个对象指向常量池的abc。如果常量池中没有”abc”,那么会先在常量池中创建一个”abc”,然后创建一个对象指向常量池的abc。因此答案是一个或者两个。
类String的比较相关推荐
- 【Java系列】从JVM角度解析Java核心类String的不可变特性
凯伦说,公众号ID: KailunTalk,努力写出最优质的技术文章,欢迎关注探讨. 1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设 ...
- 编辑从字节码和 JVM 的角度解析 Java 核心类 String 的不可变特性
1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...
- Java常用类(1)--字符串相关类String、StringBuffer、StringBuilder全面知识
文章目录 String类 StringBuffer类 StringBuilder类 String:不可变的字符序列:底层使用char[]存储 StringBuffer:可变的字符序列:线程安全的,效率 ...
- 类String的构造函数、析构函数和赋值函数
一.类String的原型为: 1 class String 2 { 3 public: 4 String(const char *str = NULL); //普通构造函数 5 6 ~String(v ...
- 类string的构造函数、拷贝构造函数和析构函数
原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html 类string的构造函数.拷贝构造函数 ...
- 101-字符串类string基础使用
字符串的学习 创建字符串: System.String类(string是这个类别名) 1.创建字符串 string s="www.devsiki.com" 2 ...
- java 字符串 面试题_Java常用类String的面试题汇总(java面试题)
1.比较两个字符串时使用"=="还是equals()方法? 当然是equals方法."=="测试的是两个对象的引用是否相同,而equals()比较的是两个字符串 ...
- java string su_JAVA基础--常用类String
字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...
- 3.4 java基础总结①常用类String②Stringbuffer③Stringbuilder
①常用类String②正则表达式③Stringbuffer④Stringbuilder 一.String ①String内存分析 String str0 = "hello";预先放 ...
- JAVA基础(12.Java中的常用类String)
目录 1.前言 2.日期(时间)相关类 2.1 日期类的应用场景 2.1.1Java中的日期相关的几个类 3. Java中的常用类学习方式 3.1 什么是常用类?为什么要学习? 3.2 怎么使用Jav ...
最新文章
- 自动转发outlook的邮件
- python从入门到精通书-Python从入门到精通,跟着《这本书》学就够了?
- Aop获取bean的过程---spring debug
- masm汇编标号用法总结
- 上网时间监控软件_电脑监控系统软件有哪些作用?主要功能有哪些?
- androidsdcard挂载目录_获取android手机的自带存储路径和sdcard存储路径
- Linux下NTP时间同步客户端配置
- Apex 中插入更新数据的事件执行顺序
- 思维导图,UML在线画图工具
- 输入法快捷键_关于日语输入法,你需要知道的一切
- 如何用无桥图腾柱功率因数校正控制器实现出色的AC-DC功率转换效率
- Ardunio开发实例-简单声音感应控制开关
- python求三重积分_三重积分的Python数值计算
- 软件架构模式 mark Richards - 读后总结 5 - 基于空间的架构
- hive和presto下标准时间格式和时间戳的转化
- 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)
- 《Android源码设计模式解析与实战》读书笔记(十六)
- 基于jsp酒店管理系统设计
- 微信小程序项目上传到git仓库
- 用python做flash动画_将Flash应用于Python项目
热门文章
- 808协议与php通讯,车载808协议对接、交通部794对接、部标808协议809协议对接
- 5岁自学python编程-一张图告诉你孩子学编程怎么选
- python程序员工资-Python工资高还是Java?
- DOM介绍~超好理解的哦
- 解决font-weight:600在安卓机不生效的方法
- ffmpeg函数介绍
- X264 输出的统计值的含义(X264 Stats Output)
- 全参考视频质量评价方法(PSNR,SSIM)以及相关数据库
- 添加负载机_从 Coco 转向 Koko,Jumpserver 堡垒机 V1.5.3 发布
- matlab中s查找数据,在数据中查找信号
- MATLAB Simulink
- MathWorks 中国