搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
从前慢现在也慢
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
用Java将数组中的元素向右移动_给定一个数组,将数组中的元素向右
2
Educoder —Java面向对象 - 封装、继承和多态的综合练习(1)_任务描述 本关任务:按要求编写一个java应用程序,巩固java面向对象知识。 相关知识
3
Oracle Linux download_oracle linux下载
4
流程图习题集
5
BERT实战[1]:利用BERT对语句中[MASK]部分进行预测_bert预测mask
6
uniapp获取(下载)图片_uniapp下载图片
7
数据结构——希尔排序
8
C++ 可变参数_c++可变参数
9
Molecular Psychiatry:三种主要精神疾病中的神经变异性
10
实验六、数据挖掘之关联分析_数据挖掘关联分析实验报告
当前位置:
article
> 正文
字符串string
作者:从前慢现在也慢 | 2024-05-19 19:10:55
赞
踩
string平台
要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable)。什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变。java为什么要把String设计为非可变类呢?你可以问问 james Gosling :)。但是非可变类确实有着自身的优势,如状态单一,对象简单,便于维护。其次,该类对象对象本质上是线程安全的,不要求同步。此外用户可以共享非可变对象,甚至可以共享它们的内部信息。(详见 《Effective java》item 13)。String类在java中被大量运用,甚至在class文件中都有其身影,因此将其设计为简单轻便的非可变类是比较合适的。
一、创建。
好了,知道String是非可变类以后,我们可以进一步了解String的构造方式了。创建一个Stirng对象,主要就有以下两种方式:
java 代码
1. String str1 = new String("abc");
2. Stirng str2 = "abc";
虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。看下面的例子:
java 代码
1. String str1 = new String("abc"); //jvm 在堆上创建一个String对象
2.
3. //jvm 在strings pool中找不到值为“abc”的字符串,因此
4. //在堆上创建一个String对象,并将该对象的引用加入至strings pool中
5. //此时堆上有两个String对象
6. Stirng str2 = "abc";
7.
8. if(str1 == str2){
9. System.out.println("str1 == str2");
10. }else{
11. System.out.println("str1 != str2");
12. }
13. //打印结果是 str1 != str2,因为它们是堆上两个不同的对象
14.
15. String str3 = "abc";
16. //此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”
17. //因此直接返回str2指向的对象给str3,也就是说str2和str3是指向同一个对象的引用
18. if(str2 == str3){
19. System.out.println("str2 == str3");
20. }else{
21. System.out.println("str2 != str3");
22. }
23. //打印结果为 str2 == str3
再看下面的例子:
java 代码
1. String str1 = new String("abc"); //jvm 在堆上创建一个String对象
2.
3. str1 = str1.intern();
4. //程序显式将str1放到strings pool中,intern运行过程是这样的:首先查看strings pool
5. //有没“abc”对象的引用,没有,则在堆中新建一个对象,然后将新对象的引用加入至
6. //strings pool中。执行完该语句后,str1原来指向的String对象已经成为垃圾对象了,随时会
7. //被GC收集。
8.
9. //此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”
10. //因此直接返回str1指向的对象给str2,也就是说str2和str1引用着同一个对象,
11. //此时,堆上的有效对象只有一个。
12. Stirng str2 = "abc";
13.
14. if(str1 == str2){
15. System.out.println("str1 == str2");
16. }else{
17. System.out.println("str1 != str2");
18. }
19. //打印结果是 str1 == str2
20.
为什么jvm可以这样处理String对象呢?就是因为String的非可变性。既然所引用的对象一旦创建就永不更改,那么多个引用共用一个对象时互不影响。
二、串接(Concatenation)。
java程序员应该都知道滥用String的串接操作符是会影响程序的性能的。性能问题从何而来呢?归根结底就是String类的非可变性。既然 String对象都是非可变的,也就是对象一旦创建了就不能够改变其内在状态了,但是串接操作明显是要增长字符串的,也就是要改变String的内部状态,两者出现了矛盾。怎么办呢?要维护String的非可变性,只好在串接完成后新建一个String 对象来表示新产生的字符串了。也就是说,每一次执行串接操作都会导致新对象的产生,如果串接操作执行很频繁,就会导致大量对象的创建,性能问题也就随之而来了。
为了解决这个问题,jdk为String类提供了一个可变的配套类,StringBuffer。使用StringBuffer对象,由于该类是可变的,串接时仅仅时改变了内部数据结构,而不会创建新的对象,因此性能上有很大的提高。针对单线程,jdk 5.0还提供了StringBuilder类,在单线程环境下,由于不用考虑同步问题,使用该类使性能得到进一步的提高。
三、String的长度
我们可以使用串接操作符得到一个长度更长的字符串,那么,String对象最多能容纳多少字符呢?查看String的源代码我们可以得知类String中是使用域 count 来记录对象字符的数量,而count 的类型为 int,因此,我们可以推测最长的长度为 2^32,也就是4G。
不过,我们在编写源代码的时候,如果使用 Sting str = "aaaa";的形式定义一个字符串,那么双引号里面的ASCII字符最多只能有 65534 个。为什么呢?因为在class文件的规范中, CONSTANT_Utf8_info表中使用一个16位的无符号整数来记录字符串的长度的,最多能表示 65536个字节,而java class 文件是使用一种变体UTF-8格式来存放字符的,null值使用两个字节来表示,因此只剩下 65536- 2 = 65534个字节。也正是变体UTF-8的原因,如果字符串中含有中文等非ASCII字符,那么双引号中字符的数量会更少(一个中文字符占用三个字节)。如果超出这个数量,在编译的时候编译器会报错。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/594224
推荐阅读
article
Golang
变量
声明及
初始化
_
golang
string
初始化
...
Golang
变量
声明及
初始化
的基本术语是声明与定义的区别。声明是告诉编译器
变量
类型和
初始化
的值,定义会申请内存空间。函...
赞
踩
article
数据结构
:
Mysql
索引
原理(
通俗易懂
)_
mysql
数据库
索引
原理...
在工作中如果经常写业务代码,说白了就是CURD,比如做一个查询功能,我们会将前端参数传递到后端后拼接SQL查询数据,那为...
赞
踩
article
02、Java
数据结构
:
时间
复杂度
与
空间
复杂度
...
空间
复杂度
和
时间
复杂度
很类似,当一个算法的
空间
复杂度
为一个常量,即不随被处理数据量 n 的大小而改变时,可表示为 O(1...
赞
踩
article
【
C语言
|
数据结构
】
双向
链表
...
各位小伙伴大家好,即上回的单向
链表
之后,
双向
链表
来了,他和单向
链表
的主要区别就是,他有两个指针,同时指向前面一个节点,和...
赞
踩
article
【
数据结构
】
单链
表
专题
详细分析
...
学习完了顺序
表
,我们发现对顺序
表
的增删查改存在一定的缺点,那有没有更好的
数据结构
可以更好地解决问题呢?那就进来看看吧~【...
赞
踩
article
Android
发送一个通知到状态栏去_
notify
(
string
tag
, int id, noti...
Notification 概述Notification,是一种具有全局效果的通知,可以在系统的通知栏中显示。当 APP ...
赞
踩
article
数据结构
---LRU
算法
...
哈希链表_lru
算法
lru
算法
LRU
算法
哈希链表自己的J...
赞
踩
article
Kotlin
学习
:
1.2
.语言基础之基本
数据类型
_
kotlin
string
contains
...
字符串与模板表达式1.转义字符2.字符串插入代码1.转义字符转义字符不沿用java的写法,而是通过 “”“ ”“”六个引...
赞
踩
article
Kotlin
—
—
初级篇(八):
关于
字符串
(
String
)
常用
操作
汇总...
在前面讲解
Kotlin
数据类型的时候,提到了
字符串
类型,当然
关于
其定义在前面的章节中已经讲解过了。对
Kotlin
中的数据...
赞
踩
article
请收下这些
Kotlin
开发必知必会的编码实践方式_
only
primitives
and
strin...
任何傻瓜都可以编写计算机可以理解的代码。优秀的程序员编写出人类可以理解的代码。— 马丁·福勒_
only
primitiv...
赞
踩
article
Kotlin
:
字符串
(
String
)_
kotion
字符串
截取...
面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份...
赞
踩
article
kotlin
中
字符串
replace
操作(
1
),2024年最新
android
游戏
开发
从入门到精通_k...
【代码】
kotlin
中
字符串
replace
操作(
1
),2024年最新
android
游戏
开发
从入门到精通。_
kotlin
...
赞
踩
article
Kotlin
开发Android app(三):
Kotlin
的
字符串
indexOf,substri...
每一种语言中,最重要的类型应该就是String了,为什么
字符串
用的这么多了,计算机一开始设计出来是为了计算用的,像整型或...
赞
踩
article
Kotlin
:
字符串
(
String
,
你值得拥有_
kotlin
截取
字符串
...
我见过很多技术leader在面试的时候
,
遇到处于迷茫期的大龄程序员
,
比面试官年龄都大。这些人有一些共同特征:可能工作了5...
赞
踩
article
【
数据结构
】---
树
:
中序
遍历
...
中序
遍历
,是
数据结构
中
树
的
遍历
方式之一。特点:左、根、右。每次
遍历
时,先
遍历
左节点的数据,之后
遍历
本节点,最后
遍历
右节点...
赞
踩
article
【
数据结构
】
顺序
表
的
定义
和
基本操作
_
顺序
表
的
定义
及
基本操作
...
顺序
表
——用
顺序
存储
的
方式实现线性
表
顺序
存储。把逻辑上相邻
的
元素存储在物理位置也相邻
的
存储单元中,元素之间
的
关系由存储单...
赞
踩
article
Java
【
数据结构
】
哈希
(
Hash
超详解)
Hash
Set&
Hash
Map
【
神装】...
哈希
桶机制通过将冲突的元素组织在一起,而非直接覆盖,保证了
哈希
表的灵活性和高效性。它允许
哈希
表在面对大量数据时仍能保持较...
赞
踩
article
my
sql
hzpy
_get
hzpy
.
sql
源代码在线查看 - 获取汉字
拼音
和
拼音
首字母的功能函数...
--
获取汉字
拼音
和
拼音
首字母的功能函数
--
作者:david.liu
--
email/msn: david2068@gmai...
赞
踩
article
【
数据结构
】
Java
中
Map
和
Set
详解(含
二叉
搜索树
和
哈希表)...
在
Java
中
Map
和
Set
最常见到下面四个实现类,Hash
Map
/Tree
Map
/Hash
Set
/Tree
Set
,他们分...
赞
踩
article
【
数据结构
】 |
java
中
map
和
set
详解...
本文介绍了Java中的Map
和
Set
数据结构
。文章详细解释了搜索树的概念、操作
和
性能分析,并提及了搜索的概念、使用场景
和
...
赞
踩
相关标签
golang
c++
开发语言
数据结构
mysql
数据库
java
算法
c语言
链表
青少年编程
android
ui
kotlin
移动开发
javascript
ViewUI