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数据类型相关推荐

  1. 深入理解Java中的String(原地址https://www.cnblogs.com/xiaoxi/p/6036701.html)

    深入理解Java中的String 一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class Stringimplem ...

  2. 深入理解Java中的String

    一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class Stringimplements java.io.Seri ...

  3. Java中的String数据类型,String类(字符串)详解

    目录 第一章.String概述 1)String是什么 2)String长什么样 3)String的构造方法(声明方式) 第二章.String类的详解 1)String底层是什么 2)字符串存储的内存 ...

  4. Java中的String数据类型归纳

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  5. 全面解析Java中的String数据类型

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  6. 理解Java中的String

    1. String是如何实现的? 里面是char数组实现的,最新的版本换成了byte数组(ASCII占1位,中文的话占2位). 2. 字符串常量池 Java堆内存中一个特殊的存储区域,当创建一个Str ...

  7. c++中string插入一个字符_Java内存管理-探索Java中字符串String(十二)

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 一.初识String类 首先JDK API的介绍: public final class String extends O ...

  8. java 字符串是对象吗_解析Java中的String对象的数据类型

    解析Java中的String对象的数据类型 2007-06-06 eNet&Ciweek 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所 ...

  9. [转载] Java内存管理-你真的理解Java中的数据类型吗(十)

    参考链接: Java中的字符串类String 1 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 推荐阅读 第一季 0.Java的线程安全.单例模式.JVM内存结构等知识 ...

最新文章

  1. myeclipse生成注册码,破解,不用下载任何文件,代码方式破解
  2. InnoDB支持的最大事务数量
  3. html鼠标悬停区域拉伸,html – :将鼠标悬停在具有边框半径的div上
  4. android手机微信收藏功能实现,Android模仿微信收藏文件的标签处理功能
  5. python3 正则表达式模块re相关
  6. Symfony 框架实战教程——第一天:创建项目(转)
  7. mycat分库分表建索引
  8. Unix中$$、$@、$#、$*的意思
  9. 华为架构师_华为首席架构师刘敏:5G商业落地 中小企业如何分一杯羹?
  10. Snagit 2019 for Mac(最好用的截图软件)v2019.1.11汉化版 MacOS 11 Big Sur支持
  11. 内容分发网络(CDN)关键技术、架构与应用(一)
  12. 生产环境和开发环境_生产环境 VS 开发环境,关于Kubernetes的四大认识误区
  13. Shapley_Value全解析与公式推导
  14. Linux下显示IP地理位置信息的小工具—nali(很强大)
  15. 新生电脑Win10入门基础操作
  16. 网络最大流中一般增广路算法(标号法)
  17. html css animate,animate.css的使用方法
  18. qq邮箱做php邮箱发送,PHP中利用PHPMailer发送QQ邮件
  19. java学习之JDO
  20. python隐秘的角落——笛卡尔之心

热门文章

  1. 7.3.4 异步IO(Asynchronous I/O)
  2. WebDriver自动化测试框架详解
  3. 【Linux】一步一步学Linux——mii-tool命令(154)
  4. 【Linux】一步一步学Linux——虚拟机简介和系统要求(04)
  5. python数据框常用操作_转载:python数据框的操作
  6. 类属性的特征java_java定义类、属性、方法
  7. ios加载本地游戏html,使用WKWebView iOS加载本地HTML / Javascript
  8. cad导出pdf_通过CAD导出的文件或者由CAD导出的PDF文件打印慢
  9. C++一级与二级指针基础详解
  10. OllyDbg捕捉MFC程序按钮事件