JavaSE——常用类库(String类)

第1节 常用类库——String

因为String相对之前的类来说更加常用一些,所以对字符串类进行专门的整理。

1. 概述

   String类表示字符串,Java中的所有字符串文字都实现为此类的实例。

字符串是不变的,它们的值在创建后无法更改 。因为它的创建是通过一个由private final修饰的byte数组value来实现的,一旦赋值,不可更改。
在这里插入图片描述
在这里插入图片描述
如果想要使用可变字符串,后面的StringBufferStringBuilder会介绍。

因为String对象是不可变的,所以可以共享它们。 这句话怎么理解?需要结合下面的赋值方式来理解。

2. String的两种赋值方式:

  • 一种为直接赋值,因为一个字符串可以表示一个String类的对象,
String text = "123";
  • 第二种为通过关键字new调用String的构造方法赋值:
String text3 = new String("123");

先来看一段代码,体会一下两者的区别:

package com.kaikeba.coreclasslibrary.string;public class Demo {public static void main(String[] args) {String text = "123";String text2 = "123";String text3 = new String("123");System.out.println(text == text2);System.out.println(text == text3);}
}结果为:
true
false

这里就用到了1中说的因为String对象是不可变的,所以可以共享它们。

因为String在内存中存储在永久代中(后续会介绍),该内存不会去进行GC,所以没有必要给同样的字符串分出两块地址,使用第一种赋值方式,并不会开辟出两块地址,而是会将两个引用对象指向同一个地址 ,所以text和text2就是一样的值,这就是共享的意思。 但是第二种赋值方式,使用new关键字强制地开辟了一块内存,所以地址值不一样。

给一张图会更直观一些,str1就是上述代码的text3,str2和str3就是上述代码的text和text2。
在这里插入图片描述

3. 字符串常量池

3.1 方法区(Method Area)

方法区(Method Area),又称永久代(Permanent Generation),又称非堆区(Non-Heap space)。

方法区是被所有线程共享的:

    - 所有字段和方法字节码,以及一些特殊方法和构造函数,接口代码也在此定义。简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间

    - 该区域存储的是:静态变量+常量+类信息(构造方法/接口定义)+运行时常量池。

但是,实例变量(对象)存在堆内存中,和方法区无关。

以上,只是逻辑上的定义,在HotSpot中,方法区仅仅只是逻辑上的独立,实际上还是包含在Java堆中,也就是说,方法区在物理上属于Java堆区中的一部分,而永久区(Permanent Generation)就是方法区的实现。

3.2 堆(heap)

一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。

堆 在逻辑上分为三部分(Perm):

  • 新生代 (Young Generation,常称为YoungGen):刚创建的内存存储位置,频繁地进行GC,若一个对象连续经过15次GC还没有被回收,它就会被放到老年代。位于堆空间

    - Eden区 :存储新创建的对象;

    - Survior区 (幸存区):存储GC次数1~14次的对象。

  • 老年代 (Old Generation。常称为OldGen、TenuringGen):GC的频次较低,位于堆空间

  • 永久代 (Permanent Generation,常称为PermGen):是一个常驻内存区域,用于存放JDK自身所携带的Class、Interface的元数据,也就是说它存储的是运行环境必须的类信息,被装在进此区域的数据是不会被垃圾回收器回收的,关闭JVM才会释放此区域所占用的内存。(不进行GC,类、方法、常量、静态修饰的内容都会放在永久代位于非堆空间。

4. 构造方法

在这里插入图片描述

最常用的当然还是直接给一个字符串而不是用构造器。

此外还需要注意三个构造方法:

1、构造一个新的String并用指定的解码集解码,读入不同集的字符串会需要。

在这里插入图片描述

2、3:用一个StringBufferStringBuilder对象来构造String,这个可以实现StringBufferStringBuilderString类的转变。

在这里插入图片描述

5. 各种方法

String类的方法很多。。。

1、返回指定索引处的char值,这还是很常用的,因为Java字符串不能像数组一样使用[索引]来访问,charAt方法就是替代。IntStream类先跳过,没学过。

在这里插入图片描述

2、返回Unicode的方法,目前还没用过。

在这里插入图片描述

3、按字典顺序比较两个字符串,不用多解释。

在这里插入图片描述

4、拼接字符串,返回拼接后的结果。

在这里插入图片描述

5、功能很明确

在这里插入图片描述

6、字符串与字符序列或StringBuffer比较是否相等。

在这里插入图片描述

7、判断字符串是否以指定的后缀结尾。

在这里插入图片描述

8、比较是否相等

在这里插入图片描述

9、指定的格式字符串和参数返回格式化字符串,没用过。

在这里插入图片描述

10、将字符串变为数组

在这里插入图片描述

11、返回字符串的哈希码

在这里插入图片描述

12、返回字符第一次出现的索引

在这里插入图片描述

13、啥是规范表示?

在这里插入图片描述

14、判断字符串是否为空

在这里插入图片描述

15、将字符序列按照指定的连接符拼接为字符串,这个很常用

在这里插入图片描述

16、返回字符最后一次出现的索引

在这里插入图片描述

17、返回字符串的长度,常用

在这里插入图片描述

18、现在不懂

在这里插入图片描述

19、判断字符串是否与指定的正则表达式匹配,没用过

在这里插入图片描述

20、不懂

在这里插入图片描述

21、判断两个字符串区域是否相等

在这里插入图片描述

22、返回该字符串重复了count次的字符串

在这里插入图片描述

23、字符串替换

在这里插入图片描述

24、字符串拆分,按照指定的拆分符

在这里插入图片描述

25、判断字符串是否以指定前缀开头

在这里插入图片描述

26、去除头尾的空格

在这里插入图片描述

27、取子字符串

在这里插入图片描述

28、将字符串转为字符数组

在这里插入图片描述

29、大小写

在这里插入图片描述

30、和strip类似,去除的不只空格

在这里插入图片描述

31、将数据类型转为字符串,注意是静态方法,直接用类名调用

在这里插入图片描述

6. 字符串拼接问题

观察如下代码:

package com.kaikeba.coreclasslibrary.string;public class Demo {public static void main(String[] args) {String t1 = "锄禾日当午";String t2 = "汗滴禾下土";String t3 = "床前明月光";t1 = t1+t2+t3;System.out.println(t1);}
}

它在内存中的细节如下图所示:

在这里插入图片描述

通过“+”运算符会产生很多中间字符串,而且没有引用,另外因为字符串是存在字符串常量池,也就是在永久代中的, 所以GC不会来回收它们,这样就导致了一个严重的问题,内存占用过大

7. StringBuffer、StringBuilder类

为了解决上述的问题,就需要用到另外两个类StringBufferStringBuilder。这两个都是长度、内容可变的字符序列类型,字符串缓冲区类似于String,但是可以进行修改。它们两个方法上上很相似,主要区别是:StringBuffer是线程安全的,StringBuilder是线程不安全的,单个线程情况下,StringBuilder更快,线程的问题后续再介绍。

7.1 构造方法

在这里插入图片描述

在这里插入图片描述

两者是一样的,重点关注将String类直接转为相应的类的构造方法。

7.2 方法

   最常用的就是append和insert方法,插入新数据:

在这里插入图片描述

在这里插入图片描述

有加入就有删除:

在这里插入图片描述

还有设置:

在这里插入图片描述

注意获取长度是capacity:

在这里插入图片描述

还有一个需要特别记忆,翻转操作,String类没有:

在这里插入图片描述

还有一个需要特别注意,它们的toString方法已经被重写,调用toString直接将这两类转为String返回:

在这里插入图片描述

其他的方法很多String类的都有。

看一个简单例子:

package com.kaikeba.coreclasslibrary.string;public class Demo2 {public static void main(String[] args) {//线程不安全的实现StringBuilder sb = new StringBuilder();//StringBuffer 线程安全的实现sb.append("1");sb.append("2");sb.append("3");String text = sb.toString();System.out.println(text);}
}结果为:
123

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VVDocumenter 使用

函数说明文档插件下载链接 https://github.com/onevcat/VVDocumenter-Xcode下载后,直接运行项目升级Xcode后可能不能再次使用,需要做一些处理从Xcode 5开始,苹果要求加入UUID证书从而保证插件的稳定性。因此Xcode版本更新之后需要在VVDocumen…

大自然创作的分形艺术

来源:http://blog.sciencenet.cn/blog-420554-363521.html数学上的分形 (Fractal) 是指“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少会大略)是整体缩小尺寸的形状”。数学家们已经创作出许多美丽的…

JavaSE——类集(上)(Collection、List、Iterator、forEach)

第2节 集合(上) 因为已经有数据结构的基础,前面有关数据结构的知识就不单独整理了,直接上Java的集合类的知识。 一、类集(集合类) 1.1 集合概述 集合: 集合是java中提供的一种容器&#xff…

第二个spring冲刺总结

讨论成员:罗凯旋、罗林杰、吴伟锋、黎文衷 第二阶段总体是做到了四则运算的demo,,包括APP进入动画,以及界面的基本效果设计,还有能进行综合计算(选择题,可以 自动生成简单,容易,困难…

图灵奖得主姚期智:求解人工智能的中国答案

来源:清华大学他是“图灵奖”创立以来首位获奖的亚裔学者,也是迄今为止获此殊荣的唯一华裔计算机科学家。2004年从普林斯顿辞去终身教职回到清华任教。2005年,他为清华本科生创立了计算机科学实验班“姚班”。如今,在中国乃至全球…

JavaSE——类集(下)(Set、Comparable、Collections、Comparator、Map)

第2节 集合(下) 一、Set接口 java.util.Set 接口和 java.util.List接口一样,同样继承自 Collection接口,它与Collection接口中的方法基本一致,并没有对 Collection接口进行功能上的扩充,只是比Collection…

美国国家科学院发布《材料研究前沿:十年调查》

来源:中国科学院科技战略咨询研究院2月8日,美国国家科学院发布了针对材料研究的第三次十年调查《材料研究前沿:十年调查》报告。这次的调查主要评估了过去十年中材料研究领域的进展和成就,确定了2020-2030年材料研究的机遇、挑战和…

JavaSE——IO(上)(File、字节流、字符流、转换流、打印流、缓存流)

第3节 IO(上) 一、File类与文件基本操作 在程序中经常需要用到文件的操作,Java有专门的类来进行文件的操作——File类。 1.1 File类概述 它是对文件和目录路径名的抽象表示。 即它本身不是一个文件,只是一个抽象表示&#xff…

学习新技能时,大脑在如何发生改变?

来源:中国生物技术网众所周知,无论是一项运动、一种乐器还是一门手艺,掌握一项新技能都是需要花费时间并进行训练的。虽然我们都知道健康的大脑能够应付的来,但是为了开发出新行为大脑如何发生改变科学家们对此仍知之甚少。近日&a…

JavaSE——IO(下)(Properties类、序列化与反序列化)

第3节 IO(下) 一、.properties文件与Properties类 1.1 .properties文件介绍 .properties文件一种属性文件,以键值对 的格式存储内容,在Java中可以使用Properties类来读取这个文件,一般来说它作为一些参数的存储&…

VS调试dll详细过程记录

VS调试dll详细过程记录 qianghaohao(孤狼) 前言:在我们写的程序中有时候调用dll,并且需要跟踪dll中的函数,此时直接调试调用dll的工程是无法跳进dll的函数的,此时我们可以启动dll工程 来跟踪程序的走向。注意:要有…

谁在真正领跑 5G:技术创新和标准

来源:云头条5G是包括美国总统特朗普在内的所有人都在谈论的新技术。所以,每家公司自然都想谈论5G以及如何领跑这个领域。然而现实情况是,移动5G是一项涵盖甚广的无线标准,它改变了我们对蜂窝通信的认识,并前所未有地拓…

JavaSE——XML与JSON(语法格式、解析内容)

第6节 XML与JSON 一、XML 1.1 XML简介 XML全称为可扩展标记语言(extensible Markup Language) 。 特性: xml具有平台无关性,是一门独立的标记语言; xml具有自我描述性。 用途: 网络数据传输 数据存…

三大阶段,四大领域,详解你不知道的AIoT!

AIoT即AIIoT,指的是人工智能技术与物联网在实际应用中的落地融合。目前,越来越多的行业及应用将AI与IoT结合到了一起,AIoT已经成为各大传统行业智能化升级的最佳通道,也是未来物联网发展的重要方向。来源:物联网智库AI…

人类为什么会同情机器人,是否需要禁止虐待机器人

6月14日,一段形似波士顿动力机器人Atlas反击人类的视频在网络热传,制作这款视频的团队Corridor Digital,是一家位于洛杉矶的美国制作工作室。自2010年以来,一直以制作与流行文化相关的病毒在线短片视频而闻名。Corridor Digital由…

dubbo学习总结——思维导图

Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的、轻量级的开源Java RPC框架,可以和Spring框架无缝集成,2018年阿里巴巴把这个框架捐献给了apache基金会 什么是RPC? RPC全称为remote procedure call,即远程…

python为字体添加上下标

添加上标:^ 添加下标:_ 举例: import numpy as np import matplotlib.pyplot as pltt np.linspace(0, 10, 1000) y np.sin(t) plt.plot(t, y) plt.xlabel(a/${m_2}$,fontdict{weight: normal, size: 15}) plt.show() 效果: …

微信演进的六点思考:微信生态如何演变?如何在其中掘金?

*头图来源:东方IC来源:虎嗅APP虎嗅注:在微信上下游诞生了无数的生态企业,他们关注着微信的一举一动,以便在其中掘金。6月15日,微盟集团CEO孙涛勇在华映资本WE来大会上,分享了对微信生态商业进化…

Day Two(Beta)

站立式会议 站立式会议内容总结 331 今天:指导队友学会xml布局及简单动画,解决了关于中文链接过滤器不能将iso编码改为utf8的情况(修改servletContainer默认编码) 遇到的问题:无 明天:闹钟简单实现,完善方法待解决442 今天:书籍评…

新技术“红”不过十年,半监督学习为什么是个例外?

来源 | 转载自知乎这一波深度学习的发展,以2006年Hinton发表Deep Belief Networks的论文为起点,到今年已经超过了10年。从过往学术界和产业界对新技术的追捧周期,超过10年的是极少数。从深度学习所属的机器学习领域来看,到底什么样…