java中的string的运用,java string有哪些方法

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: