竹笋

首页 » 问答 » 问答 » StringClass字符串类型上半
TUhjnbcbe - 2023/4/5 22:12:00

文章目录

前言什么是字符串?什么是字符?注意问题:创建字符串第一种:直接赋值第二种:调用构造方法进行构造对象(就是去nw‘一个)第三种:了解字符串类型根据上图,我们发现对于字符串来说,有两个属性,一个是char类型的valu数组(此时这个数组,只是一个变量,没有给这个数组,分配内存。也没有nw)。一个是哈希码。注意事项例题一效果图附图例题:将例题中的str,重新赋值会不会影响str的输出结果?在上面两个例题中,我们需要搞懂:字符串常量是不能被改变的下面,我们来更深层次的分析一下为什么字符串不能被修改实例附图结论:实例效果图附图实例效果图附图实例效果图附图实例效果图实例6效果图(很明显答案是fals,一个完整,一个拼接。两者肯定不同)附图(底层分析)实例7实例7(特别版)效果退附图字符串比较quals拓展在Java中,nwString类型数据的时候,是不会存在内存重叠的情况,在Java中,字符串是一个对象,而我们nwString对象时,是产生一个新的对象,如果产生的对象是一样的,那还叫新对象??String类型的数据不可变数组的整体赋值,在Java中,只有一次机会,就是在定义数组的时候。例子例子例子特殊引用字符串拼接附图特殊:String类型的数据,可以通过反射修改

前言

字符串:在C语言里面是没有字符串类型的!但是,在Java和C++里,有字符串类型

什么是字符串?什么是字符?

使用双引号,且双引号中包含任意数量的字符,就是字符串。使用单引号,且单引号中,只包含一个字符,就是字符。

注意问题:

.在Java当中,没有所谓的字符串以‘\0’结尾。.String类,不能继承。

创建字符串

创建方法与创建数组,几乎一样。

第一种:直接赋值

第二种:调用构造方法进行构造对象(就是去nw‘一个)

第三种:

publicclassTst{publicstaticvoidmain(String[]args){char[]chars={a,b,c};Stringstr=nwString(chars);Systm.out.println(str);}}

了解字符串类型

按住Ctrl,点击String,进入String

根据上图,我们发现对于字符串来说,有两个属性,一个是char类型的valu数组(此时这个数组,只是一个变量,没有给这个数组,分配内存。也没有nw)。一个是哈希码。

这里先给大家打个底,后面,我会详细讲解.。我们先来搞懂String的对象(通过创建字符串的第三种方法)String常用的构造方法就是数组

注意事项

“hllo”这样的字符串字面值常量,类型也是String.String也是引用类型.Stringstr=“Hllo”;这样的代码内存布局如下^**

例题一

publicclassTst{publicstaticvoidmain(String[]args){Stringstr="abcf";Stringstr=str;Systm.out.println(str);Systm.out.println(str);}}

效果图

附图

例题:将例题中的str,重新赋值会不会影响str的输出结果?

在上面两个例题中,我们需要搞懂:字符串常量是不能被改变的

例如:Stringstr=“abcd”;通过引用str去将字符串"abcd"修改成“gbcd”.答案是做不到的,因为被双引号引起来的是字面值常量,常量是不能被修改的。例题中,str=“author”;这句代码是将str重新指向一个新的对象(修改str的指向),而不是将原来的字符串对象修改成author。

下面,我们来更深层次的分析一下为什么字符串不能被修改

实例

importjava.util.Arrays;publicclassTst{publicstaticvoidfunc(Strings,char[]array){s="author";array[0]=p;}publicstaticvoidmain(String[]args){Stringstr="abcd";char[]chars={y,o,u};func(str,chars);Systm.out.println(str);Systm.out.println(Arrays.toString(chars));}}

附图

结论:

不是说转引用就能改变实参的值。你要看,到底这个引用干了什么!

实例

publicclassTst{publicstaticvoidmain(String[]args){Stringstr="hllo";Stringstr=nwString("hllo");Systm.out.println(str==str);}}

效果图

附图

实例

importjava.util.Arrays;publicclassTst{publicstaticvoidmain(String[]args){Stringstr="hllo";Stringstr="hllo";Systm.out.println(str==str);}}

效果图

附图

实例

publicclassTst{publicstaticvoidmain(String[]args){Stringstr="hllo";Stringstr="h"+"llo";//注意:此时两个字符串都是常量,且在编译的时候就已经确定了是"hllo"//简单来说像这种直接拿两个字符串常量来拼接的,在编译时,就默认是拼接好了的,或者说默认就是一个完整的字符串常量Systm.out.println(str==str);}}

效果图

附图

找到main部分

实例

publicclassTst{publicstaticvoidmain(String[]args){Stringstr="hllo";Stringstr="h";Stringstr=str+"llo";Systm.out.println(str==str);}}

效果图

实例6

publicclassTst{publicstaticvoidmain(String[]args){Stringstr="";Stringstr=nwString("")+nwString("");Systm.out.println(str==str);}}

效果图(很明显答案是fals,一个完整,一个拼接。两者肯定不同)

附图(底层分析)

实例7

实例7(特别版)

如果我在程序中,在str后面加上一句代码str.intrn();呢?intrn()的作用:将它的调用者,手动入池。

publicclassTst{publicstaticvoidmain(String[]args){Stringstr=nwString("")+nwString("");str.intrn();Stringstr="";Systm.out.println(str==str);}}

效果退

附图

字符串比较

如果是引用类型变量之间的比较,且使用双等号来比较的话,比较的就是引用变量存储的地址。相信大家应该明白,上面的例题就是这样比较的。

quals

语法调用者.quals();如果调用是引用类型的数据,就需要注意,调用者不能空引用/空指针。防止出现空指针异常错误

拓展

在Java中,nwString类型数据的时候,是不会存在内存重叠的情况,在Java中,字符串是一个对象,而我们nwString对象时,是产生一个新的对象,如果产生的对象是一样的,那还叫新对象??

String类型的数据不可变

数组的整体赋值,在Java中,只有一次机会,就是在定义数组的时候。

例子

例子

例子

特殊引用

字符串拼接

;publicclassTst{publicstaticvoidmain(String[]args){Stringstr="hllo";str=str+"world";str+="!!!";Systm.out.println(str);}}

附图

特殊:String类型的数据,可以通过反射修改

还是上一个程序,如果我非要把字符串"abcd"的a改成g呢?可以,前面我们也看到,String类型的数据,是数组的形式存储在对上,既然是数组,那么我们可以通过下标去修改它,但是问题是valu的权限是privat是私有的所以,即使我们拿到了对象,都拿不到valu的但是反射就可以走到,反射的功能异常强大。反射是什么?举一个很形象的例子:我们每次坐地铁,我们所带的行李箱,都需要进过安检,了解过的都知道,安检的机器,会发射一中光谱的曲线,通过反射,就能知道我们的行李箱中装了什么东西。从这里就体现出了“反射”的概念这里是类比一下,通过"反射"。我们能看到类里面存储的一些属性,哪怕是私有的,又或者是上锁了。我都能看到,也就是说:通过反射,我们能获取其中所有信息。其实反射就是最大bug,用得好,那叫一个nic,用的不好,那叫一个难受。

,

1
查看完整版本: StringClass字符串类型上半