我们现在开始学习的就是一些工具类

这些工具类只需要我们学会查阅帮助文档进行开发就可以实现很多功能

例如:我们查看工具类String

关于java JDK中内置的一个类:java.lang.String

1、String表示字符串类型,属于引用数据类型,不属于基本数据类型

2、在java中随便用“双引号”括起来的都是String对象

例如:"abc"  "Hello World" ,这两个是String对象

3、java中规定,双引号括起来的字符串,是不可变的,也就是说"abc"从出生到死亡,不可能变成"abcd"

4、在JDK中,双引号括起来的字符串

例如:"abc" "Hello World",都是直接存储在"方法区" 的 "字符串常量池" 中(JDK8中字符串常量池在堆中)

5、JAVA的lang包路径下的东西不需要导包也可以用,这是SUN公司给lang包的权限

提问 :为什么SUN公司把字符串存储在一个"字符串常量池"中呢?

原因:字符串在实际的开发中使用太频繁,目的是为了提高效率

以下是JVM示图:

第一步:方法区中首先进行类加载,类加载进入到方法区中

第二步:程序执行,main主方法会执行,栈区会压入一个main方法栈帧,在栈帧中,引用类型String s1变量中存储的不是引号的内容,其实是引号的内容的内存地址,引号的内容就是字符串,这些字符串常量存储在方法区中的字符串常量池(JDK8中字符串常量池在堆中)

第三步:在main方法栈帧中,引用类型String s2变量中存储的也是内存地址,此时在字符串常量池中,"abcdef"直接从字符串常量池中提取,"xy"从字符串常量池中新建,"abcdefxy"也从字符串常量池中拼接新建,最终被s2存储的内存地址指向"abcdefxy"

代码演示:


public class StringTest01 {public static void main(String[] args) {String s1="abcdef";String s2="abcdef"+"xy";}
}

以下是代码演示:

public class StringTest01 {public static void main(String[] args) {//下面这两行代码表示底层创建了3个字符串对象,都在字符串常量池中String s1="abcdef";String s2="abcdef"+"xy";//下面演示的是调用String的构造方法//new一个对象就是调用构造方法//分析这个代码中的"xy"是从哪里来的?//凡是双引号括起来的都在字符串常量池中有一份//new一个对象的时候一定在堆内存中开辟空间String s3=new String("xy");}
}

以下是用new对象时对字符串常量池引用(间接引用)的不同

下面再举一个例子:

代码如下:

验证:s1和s2的内存地址是否相同

public class StringTest02 {public static void main(String[] args) {String s1="hello";String s2="hello";System.out.println(s1==s2);}
}

JVM示意图:

原因:

"hello" 是存储 在方法区的字符串常量池中 ,所以"hello"不会新建

== 比较的是变量中保存的内存地址

下面再举一个例子:

public class StringTest02 {public static void main(String[] args) {String s1="hello";String s2="hello";System.out.println(s1==s2);String x=new String("xyz");String y=new String("xyz");System.out.println(x==y);}
}

JVM示意图:

原因:

如上

结论:

字符创对象之间比较不能使用==

== 不够保险,应该调用String类的equals方法

发现:Object类中并没有重写equals方法,于是乎我们找到String类中equals,发现SUN公司已经对它进行重写了

接下来我们对其重写进行测试:

public class StringTest02 {public static void main(String[] args) {String s1="hello";String s2="hello";System.out.println(s1==s2);String x=new String("xyz");String y=new String("xyz");System.out.println(x==y);System.out.println(x.equals(y));String k=new String("testString");System.out.println("testString".equals(k));System.out.println(k.equals("testString"));}
}

为什么:"testString" 这个字符串后面可以加  "  . " 呢?

因为:"testString"是一个String字符串对象,只要是对象都能调用方法

这两句有什么区别呢:

System.out.println("testString".equals(k));System.out.println(k.equals("testString"));

建议使用第一种方式,可以避免空指针异常(当一个对象不存在时又调用其方法会产生异常,例如变量k就可能是空指针)

JAVA进阶开发之(String字符串的存储原理)相关推荐

  1. java源码系列:HashMap底层存储原理详解——4、技术本质-原理过程-算法-取模具体解决什么问题

    目录 简介 取模具体解决什么问题? 通过数组特性,推导ascii码计算出来的下标值,创建数组非常占用空间 取模,可保证下标,在HashMap默认创建下标之内 简介 上一篇文章,我们讲到 哈希算法.哈希 ...

  2. Java实现ASCII与String字符串互相转换

    将ASCII转成String字符串 @Test public void ASCIIToConvert(){String value = "20320 22909 21568 65281 26 ...

  3. JAVA进阶开发之(二维数组)

    1.二维数组其实是一个特殊的一维数组,特殊在这个二维数组中每一个元素是一个一维数组 2.就是一维数组里面都是一样的元素,二维数组就是把元素换成了一维数组 3.实际开发中,使用最多的就是一维数组,二维数 ...

  4. Java性能优化之String字符串优化,BAT 面试官 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 字符 ...

  5. JAVA进阶开发之(异常类)

    保姆级别的异常类教学(附代码) 目录 1.什么是异常: 2. java语言中异常以什么形式存在的呢? 3.异常对应的现实生活中是怎样的? 4.异常处理机制 5.异常处理的具体方式 6.运行时异常编写程 ...

  6. java进阶开发-----Set集合、Map集合(接java集合)

    (一).Set系列集合 Set系列集合特点 无序:存取顺序不一致 不重复:可以去除重复 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素. Set集合实现类特点 Ha ...

  7. JAVA进阶开发之(数组练习题)

    1.题目: 写一个Army类,代表一支军队 这个类有一个属性,Weapon[ ]  w  数组,用来存储该军队所有武器 Army类提供一个构造方法,构造方法里面通过传递一个int类型的参数来限定该类所 ...

  8. (010) java后台开发之String字符串操作

    转自: https://course.tianmaying.com/java-basic+string#1 先看一个例子: String str1; String str2 = "" ...

  9. JAVA进阶开发之(异常练习题)

    编写程序模拟用户注册: 1.程序开始执行的时候,提示用户输入"用户名"和"密码"信息 2.输入信息之后,后台JAVA程序模拟用户注册 3.注册时用户名要求长度在 ...

最新文章

  1. 中的count函数_关于计数的5个函数都不掌握,那就真的Out了!
  2. Linq to SQL Like Operator(转)
  3. AngularJs Cookie 的使用
  4. 初二计算机辅导记录,(初中信息技术兴趣小组活动记录.doc
  5. HDU - 5008 Boring String Problem(后缀树求本质不同第k大子串)
  6. java运行构建期间出错_构建和运行Java 8支持
  7. MyBatis学习总结(4)——解决字段名与实体类属性名不相同的冲突
  8. 高通“扶”大唐 狙击低端芯片玩家
  9. 易语言计算机代码,易语言基础教程之简单代码的编写
  10. 智慧医疗整体解决方案
  11. RAL 2022|基于3D语义共视图的语义SLAM精确回环检测
  12. C语言基础级——N维数组定义与使用
  13. WIN7 声音图标不见
  14. 什么是跨域?怎么解决跨域问题
  15. STM32F407ZGT6的OLEDIIC的实现(全代码)
  16. Java学习意见 (来自CSDN 网友wlh86618 )
  17. c语言怎么判断一个目录下面的文件是否为隐藏文件,怎么能显示出隐藏文件?...
  18. Java简易图书DVD管理系统
  19. 【毕业季】在校生怎么看待毕业季?
  20. 水仙花数的while方法

热门文章

  1. angular element()
  2. transition的唧唧歪歪
  3. anddroid悬浮窗的手机QQ后台清理不掉的秘密
  4. 递归判断一个数是否递增
  5. HTTP 和 HTTPS 协议
  6. 王道计算机网络 网络层整理 超详细版
  7. 【操作系统复习】操作系统的特征
  8. TCP的拥塞控制机制
  9. Leetcode--671. 合并二叉树
  10. shell 进入hadoop_php通过shell调用Hadoop的方法