【Java】认识String类

  目录 🥬String是什么? 🥬字符串比较 🥬理解字符串不可变 🥬字符、字节、字符串 💧字符与字…

 

目录

🥬String是什么?

🥬字符串比较

🥬理解字符串不可变

🥬字符、字节、字符串

💧字符与字符串的相互转换

💧字节与字符串

🥬字符串常见操作

💧字符串比较

💧字符串查找

💧字符串替换

💧字符串拆分

💧字符串截取

💧其他操作方法

🥬StringBuffer 和 StringBuilder

🥬小结


 


 

🥬String是什么?

Sring是字符串类型

它是引用数据类型,不是基本数据类型。

用双引号(””)引起来的都是字符串,例如:”a”,”菜”,”abcde”,”123″,这些都是字符串。

字符串是一种不可变对象,它的内容不能改变。

🐬创建字符串三种方法:

举个例子:

运行结果:

🥬字符串比较

注意:

因为String是引用类型,这里的(str1==str2)比较的是他们引用的对象的地址,而不是比较他们的内容。

那么为什么运行结果是这样子的呢?

这时候我们得提到一个概念—>池。

是编程中的一种常见的 , 重要的提升效率的方式 , 我们会在未来的学习中遇到各种 内存池 “, “ 线程池 “, “ 数据库连接池 ” ….

这里主要了解是字符串常量池。那什么是字符串常量池呢?

字符串常量池:主要存放字符串常量,本质上是一个哈希表(String Table)。

 

接下来我们再来看看上面的字符串比较。

String str1=”hello”;
String str2=new String(“hello”);

我们可以看到str1的val和str2的val所存放字符数组是一样的,说明他俩所指向”hello”是同一个。

String str3=”hello”;

String str4=”hello”;

 

String str5=new String(“hello”);

String str6=new String(“hello”);

同上,因为str5new了一个对象,str6又new了一个对象,他们所引用的对象的地址肯定不一样。

以上都是比较的都是地址,那么内容该怎么比较呢?

可以用equals来比较两个字符串的内容是否相等,接下来我们先看看它的源码:

怎么用?举个例子:

需要注意:

equals前面的字符串在这里就是str1不能为null!!!

注意:

🥬理解字符串不可变

看上面代码,一看,欸,str1内容通过拼接改变了欸,其实str1本身是没有改变的,普通的字符串拼接会被优化成StringBuilder对象,str1拼接其实是通过new StringBuilder创建了一个新的对象,这个新的对象里面进行拼接,所以str1本身是没有改变的。

但是如果我们非要改变它,可以用反射,但是这里不过多介绍,后续会再说。

🥬字符、字节、字符串

💧字符与字符串的相互转换

字符数组—>字符串

字符串–>字符/字符数组

💧字节与字符串

🥬字符串常见操作

💧字符串比较

equals(内容比较,区分大小写)

equalsIgnoreCase(不区分大小写的比较)

compareTo:比较两个字符串大小,返回类型为int类型

1. 相等:返回 0.

2. 小于:返回内容小于 0.

3. 大于:返回内容大于 0

 

💧字符串查找

💧字符串替换

💧字符串拆分

将字符串全部拆分

将字符串部分拆分

拆分时,有些特殊字符作为分割符可能无法正确切分,需要加上转义。

注意:

1. 字符 “|”,”*”,”+” 都得加上转义字符,前面加上 “\\”。

2. 如果一个字符串中有多个分隔符,可以用 “|” 作为连字符

例如:


多次拆分:

💧字符串截取

💧其他操作方法

🥬StringBuffer StringBuilder

前面讲到任何的字符串常量都是 String 对象,而且 String 的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指 向而已。 通常来讲 String 的操作比较简单,但是由于 String 的不可更改特性,为了方便字符串的修改,提供 StringBuffer StringBuilder类。 并且StringBuffer StringBuilder 类还有很多String不具有的方法。

StringBuffer StringBuilder 大部分功能是相同的,我们主要介绍 StringBuffer, String中使用”+”来进行字符串连接,但是这个操作在StringBuffer类或者StringBuilder类中需要更改为append()方法。上面理解字符串不可变已经说过了。

接下来我们来看它的使用:

如果这里用的是String的话,在循环里面会创建多个对象,但是StringBuffer不会,所以这种时候用StringBuffer就更节省空间。我们可以看下图StringBuffer的源码,他返回的是对该对象的引用,而String返回的new的新的对象。

 

String StringBuffer 最大的区别在于: String 的内容无法修改,而 StringBuffer 的内容可以修改。频繁修改字符串的 情况考虑使用StingBuffer或者StringBuilder。

StringBuffer和StringBuilder最大的区别在于:StringBuilder是单线程,StringBuffer是多线程,有synchronized修饰,线程安全。

注意: String StringBuffer类/StringBuilder不能直接转换。如果要想互相转换,可以采用如下原则:

String 变为StringBuffer/StringBuilder:利用 StringBuffer/StringBuilder的构造方法或append() 方法 ;

StringBuffer/StringBuilder变为String: 调用 toString() 方法。

例如:

 

小结

有什么问题欢迎大家在评论区留言

 

 

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/7939.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部