【伍】一篇让你搞懂Java中的字符串,两种实例化方式的差异以及String常用方法的使用(附示例)

简介: 【伍】一篇让你搞懂Java中的字符串,两种实例化方式的差异以及String常用方法的使用(附示例)

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串


1 String类对象的两种实例化方式


String并不是一个基本数据类型,它本身属于一个类,但是这个类在设计的过程之中加入了一些Java自己的特殊支持所以对于这个类的对象实例化方式就有两种形式:


  • 直接赋值:String 对象=“内容”


  • 构造方法;public String(String s)


//直接赋值法
String str1="Hello";
//构造方法
String str2=new String("World");


2 字符串比较


如果说现在有两个int型的变量,那么要进行相等的判断,则直接使用“==”即可。但如果现在将同样的操作形式用在String上呢?


String stra="hello";
  String strb=new String("hello");
  String strc=strb;   //引用传递
  System.out.println(stra==strb);  //false
  System.out.println(strb==strc);   //true
  System.out.println(stra==strc);    //false


所以发现在程序中如果使用“==”比较的只是两个对象(任意的引用类型)堆内存数值,属于数值内容的比较并不是堆内存中保存内容的比较,那么要想进行String对象内容的比较则可以利用String类中提供的一个方发完成:


  • 字符串比较:public boolean equals(String str)


String stra="hello";
  String strb=new String("hello");
  String strc=strb;   //引用传递
  System.out.println(stra.equals(strb)); //true 
  System.out.println(strb.equals(strc)); //true
  System.out.println(strc.equals(strc)); //true


拓展:请解释在String比较重“==”与“equals()”的区别?

==:是直接比较的两个对象的堆内存地址,如果相等,则说明这两个引用实际是指向同一个对象地址的.

更多内容请参考链接:在java中==和equals()的区别


3 String类匿名对象


字符串的描述在很多语言之中都使用字符数组表示。在Java的设计之初为了解决这样的问题,专门提供了一个String类来进行描述。但是随着发展,为了能够让程序变得更加的,易于开发,所以在Java里面也提供双引号声明的数据,而这些数据,在Java中并不是普通的变量,而是属于String类的匿名对象。


String str="hello";
  System.out.println("hello".equals(str));   //true


现在发现,此时已经可以通过字符串调用equals()方法,那么就证明一点,字符串的确是String类的匿名对象。那么之前的String字符串对象=“字符串”;本质就是为一个字符串的匿名对象起了一个名字。


4 String类对象两种实例化方式比较(重点)


4.1 直接实例化形式分析

开辟一块堆内存空间,并且一个栈内存将直接指向该堆内存空间


String str="hello";   //假设为输入数据
  System.out.println(str);

image.png

String stra="hello";
  String strb="hello";
  String strc="nihao";
  System.out.println(stra==strb);  //true
  System.out.println(stra==strc);   //false
  System.out.println(strb==strc);   //false

image.png


补充:对象池概念(Object Pool)

在Java设计的过程之中为了方便用户的代码编写开发,针对于几个特殊的类使用了共享设计思路,其中String就属于这其中一员。这种设计思路是java自己的支持,而且只针对于直接赋值的情况。


在使用直接赋值实例化String类对象的操作之中,字符串的内容定义之后实际上会自动将其保存在一个对象池之中,后如果现在有其他的字符串对象也采用了直接赋值的形式,并且内容与之前的字符串内容完全相同,那么不会开辟新的堆内存空间,而是通过对象池知道自己有的堆内存空间地址,直接引用即可,所以就会造成若干个字符串直接赋值之后,当内容相同时,地址是完全相同的,所“==”的结果也是相同的,这样的设计就是共享设计模式。


4.2 构造方法实例化对象

通过此时的内存分析可以发现,如果采用了构造方法进行String类对象的实例化操作,那么最终将产生两块堆内存,其中有一块是垃圾空间。


String str=new String("hello");
  System.out.println(str);

image.png


我们刚才有了解过对象池的概念,但是如果使用了构造方法来进行String类对象实例化,那么所产生的的对象不会保存在对象池之中,也就是说此对象无法重用。


image.png


如果用户需要让这个对象入池,只能通过手工的方式来实现:


  • 手工入池:public String Intern()

String stra=new String("hello").intern();   //构造方法
  String strb="hello";   //直接赋值
  System.out.println(stra==strb);  //true


拓展:解释String类两种对象实例化方法的区别

  • 直接赋值:只会开辟一块堆内存空间,并且会自动保存在对象池之中,以供下次重复使用
  • 构造方法:会开辟两块堆内存空间,其中有一块空间将成为垃圾,并且不会自动入池,但是用户可以使用intern()自动入池


参考链接:Java中String类两种实例化的区别


5 字符串修改分析


字符串一旦声明则不可改变,通过“+”可实现字符串改变,下面请看代码和内存分析加深理解。

String str="Hello";
  str+="World";
  str=str+"!!!";
  System.out.println(str);   //HelloWorld!!!


image.png


可以发现整个的操作流程之中,都是String类对象的引用发生着改变,而字符串的内容没有改变,因此,这样的操作会产生垃圾,所以在实际开发中,不要进行频繁的修改操作。


6 String类常用方法


6.1 字符与字符串

image.png


示例1:charAt()方法

String str="hello";
  char c=str.charAt(0);
  System.out.println(c);   //h
//在程序中字符串索引是从0开始的


示例2:将字符串变为字符数组

String str="helloworld";
  char[] data=str.toCharArray();  //将字符串变为字符数组
  for(int x=0;x<data.length;x++){
        System.out.print(data[x]+" ");
  } //h e l l o w o r l d 
//当字符串变为字符数组之后就可以针对于里面的每一个字符进行操作。


示例3:将字符串中的小写字母变为大写字母

String str="helloworld";
  char[] data=str.toCharArray();  //将字符串变为字符数组
  for(int x=0;x<data.length;x++){
      data[x]-=32;    //编码减去32,成大写
  }
  System.out.println(new String(data));
  System.out.println(new String(data,5,5));   //第5个索引,之后取5个长度的内容


6.2 字符串比较

现在至少应该知道了字符串比较有一个equals()方法,但是此方法本身是属于区分大小写的比较,为此在Java里面针对于字符串的比较实际上还有其他方法。


image.png


示例1:equals

String strA="hello";
  String strB="HEllo";
  System.out.println(strA.equals(strB));  //false
  System.out.println(strA.equalsIgnoreCase(strB)); //true


示例2:比较字符串大小

在进行字符串相等的比较操作之中,最为关键的一个方法是:compareTo(),这个方法本身返回一个int型数据,而这个int型数据有三种结果:大于(>0)、小于(<0)、等于(=0)

String strA="A";
  String strB="a";
  System.out.println(strA.compareTo(strB));  //-32
  System.out.println(strA.compareToIgnoreCase(strB));  //0


6.3 字符串查找

image.png


示例1:contains()方法

如果要查找中间的内容,那么现在基本上都使用contains()方法


String str="hello";  //0:h、1:e、2:l、3:l、4:o。
    if(str.contains("l")){  //找到此方法直接返回true或者是false
         System.out.println("已查找到!");
    }


示例2:利用indexOf()方法判断

String str="hello";  //0:h、1:e、2:l、3:l、4:o。
    System.out.println(str.indexOf("l"));  //2,第一个满足的位置
    if(str.indexOf("l")!=-1){   //现在表示索引查找到了
         System.out.println("内容已经查到到!");
    }


示例3:判断开头或结尾

String str="**@@hello##";
  System.out.println(str.startsWith("*"));   //true
  System.out.println(str.startsWith("@@",2));   //true
  System.out.println(str.endsWith("##"));    //true


6.4 字符串截取

image.png


示例1:截取操作

String str="helloworldmldn";
  System.out.println(str.substring(5));  //worldmldn
  System.out.println(str.substring(5,10));  //world
  System.out.println(str.substring(0,5));   //hello


6.5 字符串替换

将一个指定的字符串替换为其他内容,就属于替换功能,在String类中有如下的方法支持替换操作。


image.png


示例:利用替换功能清楚数据中的空格

String str="h e l l o w o rl dm ldn";
  System.out.println(str.replaceAll(" ",""));


6.6 字符串拆分

可以将一个完整的字符串根据指定的内容进行拆分,拆分后的结果就是多个字符串,也就是一个字符串的对象数组,可以使用的操作方法有如下几个:


image.png


6.7 其他常用操作方法

image.png





目录
相关文章
|
4月前
|
存储 缓存 安全
Java 字符串详解
本文介绍了 Java 中的三种字符串类型:String、StringBuffer 和 StringBuilder,详细讲解了它们的区别与使用场景。String 是不可变的字符串常量,线程安全但操作效率较低;StringBuffer 是可变的字符串缓冲区,线程安全但性能稍逊;StringBuilder 同样是可变的字符串缓冲区,但非线程安全,性能更高。文章还列举了三者的常用方法,并总结了它们在不同环境下的适用情况及执行速度对比。
133 17
|
4月前
|
存储 缓存 安全
Java字符串缓冲区
字符串缓冲区是用于处理可变字符串的容器,Java中提供了`StringBuffer`和`StringBuilder`两种实现。由于`String`类不可变,当需要频繁修改字符串时,使用缓冲区更高效。`StringBuffer`是一个线程安全的容器,支持动态扩展、任意类型数据转为字符串存储,并提供多种操作方法(如`append`、`insert`、`delete`等)。通过这些方法,可以方便地对字符串进行添加、插入、删除等操作,最终将结果转换为字符串。示例代码展示了如何创建缓冲区对象并调用相关方法完成字符串操作。
92 13
|
4月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
111 11
|
4月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
107 9
|
8月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
223 83
|
7月前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
120 2
Java 中的 String Pool 简介
|
7月前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
137 1
java 为什么 String 在 java 中是不可变的?
|
8月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
138 26
|
7月前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
144 1
OSZAR »