全面理解Java中的String数据类型
1. 首先String不属于8种基本数据类型,String是一个对象。
因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。
2. new String() 和 new String(“”) 都是申明一个新的空字符串,是空串, 不是null
3. String str=”kvill” 和 String str=new String (“kvill”) 的区别:
先不谈堆 和 栈 ,先简单引入常量池这个简单的概念。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
例1:
String s0=”kvill”; String s1=”kvill”; String s2=”kv” + “ill”; System.out.println( s0==s1 ); // true System.out.println( s0==s2 ); // true
首先,要知道Java会确保一个字符串常量只有一个拷贝.
因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。
所以得出s0==s1==s2;
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的内存地址。
例子2:
String s0=”kvill”; String s1=new String(”kvill”); String s2=”kv” + new String(“ill”); System.out.println( s0==s1 ); //false System.out.println( s0==s2 ); //false System.out.println( s1==s2 ); //false
例2中s0还是常量池中”kvill”的引用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以没有引用常量池, 是新创建的一个字符串对象”kvill”; 明白了这些也就知道为何得出此结果
4. String.intern():
再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中新增加一个Unicode等于str的字符串并返回它的引用;看例3就清楚了
例3:
String s0= “kvill”; String s1=new String(”kvill”); String s2=new String(“kvill”); System.out.println( s0==s1 ); // false System.out.println( “**********” ); s1.intern(); s2=s2.intern(); //把常量池中“kvill”的引用赋给s2 System.out.println( s0==s1); //false, 虽然执行了s1.intern(),但它的返回值没有赋给s1 System.out.println( s0==s1.intern() ); // true , 说明s1.intern()返回的是常量池中”kvill”的引用 System.out.println( s0==s2 ); // true
5. 关于 equals() 和 == 区别:
equals()对于String简单来说就是比较两字符串的Unicode序列是否相同,如果相等返回true; 而 == 是比较两字符串的地址是否相同,比较是不是同一个字符串的地址引用。
6. 关于String是不可变的
这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+” “+”ans”;
就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的
最后: 如果有不正确的请指出,谢谢
转载于:https://www.cnblogs.com/guo-rong/p/9675984.html
全面理解Java中的String数据类型相关推荐
- 深入理解Java中的String(原地址https://www.cnblogs.com/xiaoxi/p/6036701.html)
深入理解Java中的String 一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class Stringimplem ...
- 深入理解Java中的String
一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class Stringimplements java.io.Seri ...
- Java中的String数据类型,String类(字符串)详解
目录 第一章.String概述 1)String是什么 2)String长什么样 3)String的构造方法(声明方式) 第二章.String类的详解 1)String底层是什么 2)字符串存储的内存 ...
- Java中的String数据类型归纳
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
- 全面解析Java中的String数据类型
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
- 理解Java中的String
1. String是如何实现的? 里面是char数组实现的,最新的版本换成了byte数组(ASCII占1位,中文的话占2位). 2. 字符串常量池 Java堆内存中一个特殊的存储区域,当创建一个Str ...
- c++中string插入一个字符_Java内存管理-探索Java中字符串String(十二)
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 一.初识String类 首先JDK API的介绍: public final class String extends O ...
- java 字符串是对象吗_解析Java中的String对象的数据类型
解析Java中的String对象的数据类型 2007-06-06 eNet&Ciweek 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所 ...
- [转载] Java内存管理-你真的理解Java中的数据类型吗(十)
参考链接: Java中的字符串类String 1 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 推荐阅读 第一季 0.Java的线程安全.单例模式.JVM内存结构等知识 ...
最新文章
- myeclipse生成注册码,破解,不用下载任何文件,代码方式破解
- InnoDB支持的最大事务数量
- html鼠标悬停区域拉伸,html – :将鼠标悬停在具有边框半径的div上
- android手机微信收藏功能实现,Android模仿微信收藏文件的标签处理功能
- python3 正则表达式模块re相关
- Symfony 框架实战教程——第一天:创建项目(转)
- mycat分库分表建索引
- Unix中$$、$@、$#、$*的意思
- 华为架构师_华为首席架构师刘敏:5G商业落地 中小企业如何分一杯羹?
- Snagit 2019 for Mac(最好用的截图软件)v2019.1.11汉化版 MacOS 11 Big Sur支持
- 内容分发网络(CDN)关键技术、架构与应用(一)
- 生产环境和开发环境_生产环境 VS 开发环境,关于Kubernetes的四大认识误区
- Shapley_Value全解析与公式推导
- Linux下显示IP地理位置信息的小工具—nali(很强大)
- 新生电脑Win10入门基础操作
- 网络最大流中一般增广路算法(标号法)
- html css animate,animate.css的使用方法
- qq邮箱做php邮箱发送,PHP中利用PHPMailer发送QQ邮件
- java学习之JDO
- python隐秘的角落——笛卡尔之心
热门文章
- 7.3.4 异步IO(Asynchronous I/O)
- WebDriver自动化测试框架详解
- 【Linux】一步一步学Linux——mii-tool命令(154)
- 【Linux】一步一步学Linux——虚拟机简介和系统要求(04)
- python数据框常用操作_转载:python数据框的操作
- 类属性的特征java_java定义类、属性、方法
- ios加载本地游戏html,使用WKWebView iOS加载本地HTML / Javascript
- cad导出pdf_通过CAD导出的文件或者由CAD导出的PDF文件打印慢
- C++一级与二级指针基础详解
- OllyDbg捕捉MFC程序按钮事件