| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【Java】带你从零到一系列15 深入String类1 -> 正文阅读 |
|
[Java知识库]【Java】带你从零到一系列15 深入String类1 |
前言:String类是我们很常见的一种创建文本的类,但它也有许多有趣的地方,或者是可以深入了解一下的地方,所以我们本篇博客将带你深入String类。
每文一图: 一.创建字符串对于字符串,我们先简单提一个问题: 问题:什么是字符,什么是字符串?
1.常见的构造 String 的方式那么接下来就要进入
打印结果: 在官方文档上 (点我 我是官方文档) 我们可以看到 String 还支持很多其他的构造方式, 我们用到的时候去查就可以了。 2.字符串的习性对于字符串,我们先来了解它的一些习性:
这样的代码内存布局如下,所以String类是一种引用类型: 然后我们再试试看改一下str里面的内容:
所以修改内容的时候,其实只是修改该引用指向的内容,而不是修改引用: 二.字符串比较相等Java 中要想比较字符串的内容, 必须采用String类提供的equals方法:
对于equals方法的写法,是这样子的: 就好像上面的代码提到的,a在前面和b在前面都可以,但是我们最好使用哪一个在前面呢?我们需要注意: 对比下面两种方式哪一种更好:
在这里,我们更推荐使用 “方式二”,一旦 str 是 null,方式一的代码会抛出异常,而方式二不会。“Hello” 这样的字面值常量, 本质上也是一个 String 对象, 完全可以使用 equals 等 String 对象的方法。 对比两者的运行:
所以我们总结得出:
然后我们除了用equals对比,我们直接对比,看看接下来这个代码,这个代码输出的会是什么呢:
对于这里的str和str2,是指自身的引用是否相同,所以对于这里他们两个引用的hello不同,引用也就不一样了。但这里我们想说的不是引用,而是引出一个概念:字符串常量池。 什么是池?
比如:
什么是哈希表?
比如说:对于一组数据 12 45 2 7 15 92 ,我们要查找他们之间的一个关键字。我们可以选择顺序查找,也就是一个一个对比去查找,但是时间复杂度可以达到O(n),第二种是排序+二分查找,时间复杂度相对少一些。而这里,我们的哈希表,是这样子的: 这就是哈希表的大概理解,接下来我们进入字符串常量池中。 三.字符串常量池还是这代码,但是这次,我们要刨析它在底层中,是如何创建如何实现的,并且我们看一下这个字符串常量池,又是如何相关的。
首先对于这一段代码我们先做一个图,待会就在这个图中进行讲解,这里有栈,还有堆,而在上面说到字符串常量池是在堆里的,所以这里也画出来了: 然后我们来创建str,而对于创建的过程,其实是这样子的:
这就是我们对于这一段简简单单的代码的解读,然后我们这里只是纸上说说,是不是真的,我们可以去打一个断点调试起来,看一看内存中的量: 实际上也是如此, 那么上面的是有new一个String的,但是现在我们如果不new呢,比如下面的代码,他又是什么样子的,我们来看一下:
那么这里既然没有新建对象,那么在创建好第一个"hello"之后,在第二次的时候,就会在常量池中找到这个"hello",所以就直接指向了这个常量,不用再创建了: 第一种:字符串是拼接的
第二种:变量拼接字符串
四.理解字符串不可变字符串是一种不可变对象,它的内容不可改变。String 类的内部实现也是基于 比如说这个代码:
别看它只有一点点,因为字符串不可变,所以导致了在拼接其他字符串的时候,产生的是新的对象。 这里短短的代码,产生了5个对象。 形如 += 这样的操作, 表面上好像是修改了字符串, 其实不是. 内存变化如下:
引用相当于一个指针,里面存的内容是一个地址。我们要区分清楚当前修改到底是修改了地址对应内存的内容发生改变了,还是引用中存的地址改变了。 那么如果实在需要修改字符串, 例如, 现有字符串
IDEA 中 ctrl + 左键 跳转到 String 类的定义,可以看到内部包含了一个 char[] ,保存了字符串的内容。
对于这个代码,其实我们在这篇文章中暂时不需要理解那么多,只需要知道有这种反射的存在就好。
指的是程序运行过程中,获取/修改某个对象的详细信息(类型信息,属性信息等),相当于让一个对象更好的 “认清自己”。Java 中使用反射比较麻烦一些。
所以,对于String是不可变的,我们有了一定的了解,而且在平时中,因为这个不可变,我们有一些代码也不应该写,比如:
这种代码会产生大量的临时对象,效率比较低!!! 这就是本篇深入String类1的全部内容啦,接下来我们还有深入String类2,里面会讲解到关于String中优化的几个点。欢迎关注。一起学习,共同努力!也可以期待这个系列接下来的博客噢。 还有一件事: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:28:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |