java中的string的运用,java string有哪些方法
这篇文章给大家带来了一些关于java的知识,包括string类的相关问题,包括string的常量池,string的不变性等等。下面就来看看吧,希望对你有帮助。
如何解决写爬虫IP受阻的问题?立即使用。
一、认识String
1.JDK中的String
首先我们来看看JDK的String类的源代码。它实现了很多接口,可以看到String类是用final修饰的,也就是说String类不能继承,String没有子类,所以所有使用JDK的人都用同一个String类。如果允许继承String,每个人都可以扩展String,每个人都使用相同版本的String,两个不同的人使用相同的方法并显示不同的结果,导致代码没有办法开发。
继承和方法重写在带来灵活性的同时,也带来了很多子类的不一致行为。
2.创建字符串的四种方式
方法1:直接分配(常用)
String str= hello word
方法二:通过构造方法生成对象。
String str1=新字符串( hello word );
方法3:通过字符数组生成对象。
char[] data=new char[]{a , b , c };
方法4:通过string的静态方法valueOf(任意数据类型)=转换为String(常用)。
string str 2=string . value of(10);
3.字符串的字面量
字面量:直接写出的值称为字面量。
10int文字
10.1 -双字面量
True -布尔文字
ABC 字符串文字
字符串的字面量实际上是一个string对象。
String str=" hello word
String str2=str
这时,这不仅是一个字符串的字面量,也是字符串的对象。为了方便理解,画个图。这时,为了便于理解,我们暂时认为它存储在堆上,但实际上是存储在方法区。
这时,如果str2=" Hello此时对str的输出没有影响,因为括起来的Hello也是一个string对象,说明此时堆上已经打开了一个新的空间,而str2存储的是新对象的地址空间,对str没有影响。
4.字符串比较相等
比较引用的所有数据类型是否相等时,用equals方法进行比较。JDK的公共类已经覆盖了equals方法,所以您可以直接使用它。
引用数据类型使用==来比较地址。
下图显示了两个引用指向同一个地址空间,这与字符串的常量池有关。
下图生成了两个对象和两个地址空间,使用==将返回false。
equals的比较大小是区分大小写的比较。
equalsIgnoreCase方法是不区分大小写的比较。
二、字符串的常量池
1.什么是字符串常量池
当使用直接赋值方法生成一个字符串对象时,JVM将维护一个字符串常量池。如果堆中不存在该对象,它将生成一个字符串对象,并将其添加到字符串常量池中。当继续使用直接赋值方法生成字符串对象时,JVM发现这个引用所指向的内容已经存在于常量池中。此时,它不是创建新的string对象,而是直接重用已有的对象,这也是上图中三个引用指向同一个地址的原因。
第一次生成对象时,常量池中什么都没有,所以在常量池中生成一个string对象并存储在其中。第二次、第三次生成对象时,JVM发现常量池中已经存在相同的内容,所以不生成新的对象,直接指向与str1相同的地址空间。
所有程序都是从右向左执行的。此时,第一行代码的右侧是一个字符串常量,也是一个字符串对象。所以,首先在常量池中打开一个空间,然后创建一个新的string对象进行存储。然后,程序向左执行。当遇到new关键字时,堆中存储一个新对象,然后str1指向堆中的对象。当指向第二行和第三行代码时,发现该对象已经存在于常量池中。如果遇到new关键字,会发现对象已经存在。
2.手工入池方法
String类提供的intern方法,这是一个本地方法:
调用intern方法会将当前字符串引用所指向的对象保存到字符串常量池中。有两种情况:
1.如果对象已经存在于当前常量池中,则不会生成新的对象,将返回常量池中的字符串对象。
2.如果该对象不存在于当前的常量池中,则将其放入常量池,并返回放入常量池后的地址。
1.看看下面几行代码的输出。
因为intern方法有返回值,此时str1只调用intern方法,不接收返回值,所以str1仍然指向堆中的对象,str2指向常量池中的对象,所以返回false;
只要收到调用实习生方法的返回值,就会返回true;
此时,str1指向的对象将被手动放入池中,并且该对象已经存在于池中,这样str1就可以直接指向该对象。
2.看看下面几行代码的输出。
手动入池时,池内什么都没有,直接移入常量池。
三、字符串的不可变性
1.为什么不可变
注:所谓不可变字符串是指字符串的内容不可变,而不是字符串的引用。
这里的不变性指的是‘hello’,‘world’,‘hello world’,’! ,以及拼接的“helloworld!这些字符串对象已经创建。一旦它们被声明,它们的内容不能被修改,但是引用可以被改变,指向hello,helloworld和hello world!这都是可能的。
字符串只是一个字符数组-char [],字符串实际上保存在字符数组中。为什么字符串的内容不能改变?让我们看看字符串的源代码。
我们可以看到,字符串内部的字符数组是封装的,字符串类外部是无法访问字符数组的,更不用说改变字符串的内容了。
String str= hello
:
2.如何修改字符串内容
1.在运行时通过反射破坏值数组的封装
2.请改用StringBuilder或StringBuffer类——它不再是一种类型。
A.StringBuilder:线程不安全,性能强。
B.StringBuffer:线程安全,性能差
否则,这两个类的用法是完全一样的。
如果需要频繁拼接字符串,使用StringBuilder类的append方法,这里只会生成一个对象,一会变成hello和hello world。
3.StringBuilder类的具体使用
StringBuilder类和String是两个独立的类。创建StringBuilder类是为了解决字符串拼接的问题。
StringBuilder类和String类之间的转换;
1.StringBuilder成为String类并调用String方法。
2.2号。String类转换为StringBuilder类,并使用StringBuilder构造方法或append方法
其他常用方法:
A.字符串的反向操作,由sb提供的reverse();
B.删除指定范围的数据,delete(int start,int end);从头到尾全部删除,左右拉开音程。
C.插入操作,insert(int start,各种数据类型):从起始索引位置插入,插入的初始索引为start。
推荐:《java视频教程》以上是全面掌握java和String的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。