<Java>一把王者的时间,带你认识String类

这篇具有很好参考价值的文章主要介绍了<Java>一把王者的时间,带你认识String类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

<Java>一把王者的时间,带你认识String类



前言

String 类在Java中是很常用的类,很重要的类,在后续的学习中经常会用到,是后续学习的基础


一、认识String

1.JDK中的String

首先我们看看JDK中的String类源码,它实现了很多接口,可以看到String类被final修饰了,这就说明String类不可以被继承,String不存在子类,这样所有使用JDK的人,用到的String类都是同一个,如果String允许被继承,每个人都可以对String进行扩展,每个人使用的String都不是同一个版本,两个不同的人使用相同的方法,表现出不同的结果,这就导致代码没办法进行开发了
继承和方法覆写在带来灵活性的同时,也会带来很多子类行为不一致的问题
<Java>一把王者的时间,带你认识String类

2.创建字符串的四种方式

方式一:直接赋值(常用)
String str = " hello word "

方式二:通过构造方法产生对象
String str1 = new String(" hello word ");

方式三:通过字符数组产生对象
char[] data = new char[]{‘a’ , ‘b’ ,‘c’};

方式四:通过String的静态方法valueOf(任意数据类型) = >转为字符串(常用)
String str2 = String.valueOf(10);
<Java>一把王者的时间,带你认识String类

3.字符串的字面量

字面量:直接写出来的数值叫做字面量
10 – > int字面量
10.1 --> double字面量
true --> boolean字面量
" abc " – > String字面量
字符串的字面量其实就是一个字符串对象
String str = “hello word”;
String str2 = str;
此时这既是一个字符串的字面量,也是字符串的对象,为了方便理解,画个图,此时是为了方便理解我们暂时先认为它储存在堆上,其实实在方法区中存放
<Java>一把王者的时间,带你认识String类
若此时让str2 = “Hello”;此时对str的输出并没有影响,因为被" "括起来的Hello也是一个字符串对象,说明此时在堆上新开辟了一块空间,而此时str2保存的就是新对象的地址空间,对str没有影响
<Java>一把王者的时间,带你认识String类

4.字符串比较相等

所有的引用数据类型在比较是否相等时,使用equals方法比较,JDK的常用类,都已经覆写了equals方法,直接使用即可
引用数据类型使用 == 比较的是地址
下图是两个引用指向了同一块地址空间,和字符串的常量池有关
<Java>一把王者的时间,带你认识String类
下图产生了两个对象,两块地址空间,使用==返回的就是false
<Java>一把王者的时间,带你认识String类
equals的比较大小是区分大小写的比较
<Java>一把王者的时间,带你认识String类
equalsIgnoreCase方法是不区分大小写的比较
<Java>一把王者的时间,带你认识String类

二、字符串的常量池

1.什么是字符串常量池

<Java>一把王者的时间,带你认识String类
当使用直接赋值法产生字符串对象的时候,JVM会维护一个字符串的常量池,若该对象在堆中还不存,就产生一个字符串对象加入到字符串常量池中;当继续使用直接赋值法产生字符串对象的时候,JVM发现该引用指向的内容在常量池中已经存在了,此时就不再新建字符串对象,而是直接复用已有的对象,这也是为什么上图的三个引用指向的是同一块地址
<Java>一把王者的时间,带你认识String类
当第一次产生对象的时候,常量池中还什么都没有,就在常量池中产生一个字符串对象存入,当第二第三次产生对象时,JVM发现常量池中已经存在相同的内容,就不再产生新的对象,直接指向和str1相同的地址空间

<Java>一把王者的时间,带你认识String类
程序都是从右向左执行的,此时第一行代码的右边就是一个字符串常量,也是一个字符串对象,所以先在常量池中开辟一块空间,然后新建一个字符串对象存入,程序再往左执行,遇到new关键字,此时新建一个对象存入堆中,然后str1 指向堆中的对象,在指向第二行第三行代码时,发现常量池中已经存在该对象,不再新建,遇到new关键字就新建对象,内存图如下:
<Java>一把王者的时间,带你认识String类

2.手工入池方法

String类提供的intern方法,这是一个本地方法:
<Java>一把王者的时间,带你认识String类
调用intern方法会将当前字符串引用指向的对象保存到字符串常量池中,有两种情况:
1.若当前常量池中已经存在了该对象,则不再产生新的对象,返回常量池中的String对象
2.若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址。

1.看一下下面这几行代码的输出
<Java>一把王者的时间,带你认识String类
因为intern方法是有返回值的,此时str1只是调用了intern方法,并没有接收返回值,所以str1还是指向堆中的对象,str2指向常量池中的对象,所以返回false;
<Java>一把王者的时间,带你认识String类
只要接收一下调用intern方法的返回值,就会返回true;
<Java>一把王者的时间,带你认识String类
此时就将str1指向的对象手动入池了,池中已有该对象,直接让str1指向该对象
<Java>一把王者的时间,带你认识String类
2.再看看下面这几行代码的输出
<Java>一把王者的时间,带你认识String类
手动入池时,池中还没有任何东西,直接移入常量池中
<Java>一把王者的时间,带你认识String类


三、字符串的不可变性

1.为什么不可变

注意:所谓的字符串不可变,指的是字符串的内容不可变,而不是字符串的引用不能变
<Java>一把王者的时间,带你认识String类
这里的不可变指的是" hello " , " world " , " helloworld " , " !!! " , 以及拼接后的"helloworld!!!"这些已经创建好的字符串对象,这些对象一旦声明后就无法修改其内容,但是引用是可以改变的,一会指向hello,一会指向helloworld,一会指向hello world!!!,这都是可以的
<Java>一把王者的时间,带你认识String类
字符串就是就是一个字符数组—> char[],字符串其实在字符数组中保存。字符串的内容为什么不能改变?我们看看字符串的源码就知道了。
<Java>一把王者的时间,带你认识String类
我们可以看到String内部的字符数组是被封装起来的,String类的外部无法访问到这个字符数组,更何谈改变字符串的内容
String str = " hello ";
<Java>一把王者的时间,带你认识String类

2.如何修改字符串内容

1.在运行时通过反射破坏value数组的封装
2.更换使用StringBuilder或者StringBuffer类 - - 已经不是一个类型了
a.StringBuilder:线程不安全,性能较强
b.StringBuffer:线程安全,性能较差
除此之外两个类的用法完全相同

若需要频繁的进行字符串的拼接,使用StringBuilder类的append方法,这里只产生了一个对象,一会变成hello,一会变成hello world
<Java>一把王者的时间,带你认识String类

3.StringBuilder类的具体使用

StringBuilder类和String是两个独立的类,StringBuilder类就是为了解决字符串的拼接问题产生的
StringBuilder类和String类的相互转换:

1.StringBuilder变为String类调用toString方法即可
<Java>一把王者的时间,带你认识String类

2.String类转变为StringBuilder类,使用StringBuilder的构造方法或者append方法
<Java>一把王者的时间,带你认识String类
<Java>一把王者的时间,带你认识String类
其他常用方法:
a.字符串的反转操作,sb提供的reverse();
<Java>一把王者的时间,带你认识String类

b.删除指定范围的数据,delete(int start,int end);删除从start开始,到end之前的所有内容,左闭右开区间
<Java>一把王者的时间,带你认识String类

c.插入操作,insert(int start,各种数据类型):从start索引位置开始插入,插入的起始索引为start
<Java>一把王者的时间,带你认识String类文章来源地址https://www.toymoban.com/news/detail-418277.html

到了这里,关于<Java>一把王者的时间,带你认识String类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JAVA】带你认识java方法|java中的方法&方法中的重载和递归

    作者主页: paper jie的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏

    2024年02月14日
    浏览(29)
  • 一把LOL的时间我入门了Go语言

    前言: Go 语言是由 Google 公司推出的一款新的编程语言,作为谷歌的亲儿子,发展势头迅猛,各个大厂目前都在积极推进 Go 语言的使用。Go 是云计算、云原生、区块链等众多前沿领域的首推语言,目前流行的 Docker、Kubernetes 等开源项目也都是基于 Go 语言的。 Why GO?用 Go 的好

    2023年04月15日
    浏览(21)
  • Java时间转换问题 [Failed to convert property value of type ‘java.lang.String‘ to required type ‘java.

    default message [Failed to convert property value of type ‘java.lang.String’ to required type \\\'java. 遇到java接收前端日期字符串返回到后端Date字段时报错。 通过在报错字段上添加@DateTimeFormat(pattern = “yyyy-MM-dd”)进行解决。 接下来是分析了引用一位博主的博客,我在简单总结一下: @JsonFormat注

    2024年02月13日
    浏览(29)
  • 【C++初阶】string 类的认识与学习

      在学习string类之前,先在这里推荐2个好用的网站,可以用来查阅C++的相关知识 https://cplusplus.com https://en.cppreference.com/w/ 上面的是非官方的,下面的官方的,但是个人感觉还是上面的好用。 简单来说, string 是C++中用来管理字符串的类。 他有很多接口,大致分为: 1.string类

    2024年02月09日
    浏览(39)
  • 【javaSE】 万字带你认识异常

    在生活中,一个人表情痛苦,出于关心,可能会问:你是不是生病了,需要我陪你去看医生吗? 在程序中也是一样,程序猿是一帮办事严谨、追求完美的高科技人才。在日常开发中,绞尽脑汁将代码写的尽善尽美,在程序运行过程中,难免会出现一些奇奇怪怪的问题。 有时

    2024年02月14日
    浏览(24)
  • Outlook邮箱不简单带你重新认识它

    我们都知道微软公司提供的邮箱产品有两个,开放免费使用Outlook和Hotmail,其实还有一个Live邮箱,只不过现在不对外开放了,尽管如此,Outlook和Hotmail也是Live的二级域名。 二级域名说明:是父级的子级,同属一个服务器。   Outlook邮箱有两大特色: 一、Outlook是跨平台化产品

    2024年02月05日
    浏览(42)
  • 大语言模型底层架构丨带你认识Transformer

    本文分享自华为云社区《大语言模型底层架构你了解多少?大语言模型底层架构之一Transfomer的介绍和python代码实现》,作者: 码上开花_Lancer 。 语言模型目标是建模自然语言的概率分布,在自然语言处理研究中具有重要的作用,是自然语言处理基础任务之一。大量的研究从

    2024年02月05日
    浏览(31)
  • 网络扫描,端口扫描,漏洞扫描,带你认识nmap

    nmap是一款用于网络发现和安全评估的开源工具。它可以扫描网络主机,了解主机的开放端口和服务信息,甚至可以对操作系统进行识别。 以下是nmap主要用途: 网络发现:nmap可以扫描网络上的主机,了解主机的IP地址、MAC地址等信息。 端口扫描:nmap可以扫描网络上的主机,

    2024年02月13日
    浏览(31)
  • 一篇文章带你快速认识区块链(必看)

           区块链技术,这一划时代的分布式账本技术,正在全球范围内掀起一场深度的信任与协作模式变革。区块链如同一部由多方共同维护的公开而又安全的大账本,每一笔交易都被打包成一个区块,通过高级密码学手段确保传输和访问安全,并按照时间顺序串联起来,形

    2024年04月25日
    浏览(47)
  • C++ 带你吃透string容器的使用

    接下来我们就要正式进入C++中STL的学习当中了 今天我们介绍的是STL中的string容器 我们对于STL的学习可以借助文档去学习: 我们今天就要通过cplusplus这个网站来介绍string容器 首先我们要了解的是: 什么是string容器? 注意:使用string容器需要包含头文件:string 在了解了string容器之后

    2024年02月05日
    浏览(468)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包