Java · 认识 String 类(下)· 字符串相关方法介绍 · StringBuffer · StringBuilder

一、字符串常见操作

1.1 字符串比较

String 类提供的 equals( ) 方法,该方法本身是可以进行区分大小写的相等判断。除了这个方法之外,String 类还提供有如下的比较操作:

普通方法:public boolean equals(Object anObject)
区别大小写的比较

普通方法:public boolean equalsIgnoreCase(String anotherString)
不区分大小写的比较

普通方法:public int compareTo(String anotherString)
比较两个字符串大小关系

代码示例 :不区分大小写比较

String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true

在 String 类中 compareTo( ) 方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内容:

  1. 相等:返回0.
  2. 小于:返回内容小于0.
  3. 大于:返回内容大于0.

观察 compareTo()比较

System.out.println("A".compareTo("a")); // -32
System.out.println("a".compareTo("A")); // 32
System.out.println("A".compareTo("A")); // 0
System.out.println("AB".compareTo("AC")); // -1
System.out.println("刘".compareTo("杨"));

compareTo( ) 是一个可以区分大小关系的方法,是 String 方法里是一个非常重要的方法。

字符串的比较大小规则,总结成三个字 "字典序" 相当于判定两个字符串在一本词典的前面还是后面。
先比较第一个字符的大小(根据 unicode 的值来判定),如果不分胜负,就依次比较后面的内容。

1.2 字符串查找

从一个完整的字符串之中可以判断指定内容是否存在,对于查找方法有如下定义:

均是普通方法

public boolean contains(CharSequence s)
判断一个子字符串是否存在

public int indexOf(String str)
从头开始查找指定字符串的位置,查到数据返回该位置的索引,查不到返回 -1

public int indexOf(String str, int fromIndex)
从指定位置开始查找子字符串位置

public int lastIndexOf(String str)
有后向前查找子字符串位置

public int lastIndexOf(String str, int fromIndex)
从指定位置有后向前查找

public boolean startsWith(String prefix)
判断是否以指定字符串开头

public boolean startsWith(String prefix, int toffset)
从指定位置开始判断是否以指定字符串开头

public boolean endsWith(String suffix)
判断是否以指定字符串结尾

代码示例 :字符串查找,最好用 contains( )

String str = "helloworld";
System.out.println(str.contains("world"));

该判断形式是从 JDK1.5 之后开始追加的,在 JDK1.5 以前要想实现与之类似的功能,就必须借助、indexOf( ) 方法完成。


代码示例 :使用 indexOf( ) 方法进行位置查找

String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w开始的索引
System.out.println(str.indexOf("bit")); // -1,没有查到
if (str.indexOf("hello") != -1) {
	System.out.println("可以查到指定字符串!");
}

在基本都是用 contains( ) 方法完成。
使用 indexOf( ) 需要注意的是,如果内容重复,它只能返回查找的第一个位置。


代码示例 :使用 indexOf( ) 的注意点

String str = "helloworld" ;
System.out.println(str.indexOf("l")); 		// 2
System.out.println(str.indexOf("l",5));	 	// 8
System.out.println(str.lastIndexOf("l")); 	// 8

在进行查找的时候,往往会判断开头或者结尾。


代码示例 :判断开头或者结尾

String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endsWith("!!")); // true

1.3 字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:

public String replaceAll(String regex, String replacement)
替换所有的指定内容

public String replaceFirst(String regex, String replacement)
替换首个内容

代码示例
字符串的替换处理

String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));

注意事项
由于字符串是不可变对象,替换不修改当前字符串,而是产生一个新的字符串。


1.4 字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下:

public String[] split(String regex)
将字符串全部拆分

public String[] split(String regex, int limit)
将字符串部分拆分,该数组长度就是 limit 极限

代码示例 :实现字符串的拆分处理

String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
	System.out.println(s);
}

代码示例 :字符串的部分拆分

String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
	System.out.println(s);
}

代码示例 :拆分 IP 地址

String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
for(String s: result) {
	System.out.println(s);
}

注意事项

  1. 字符 “ | ”,“ * ”,“ + ” 都得加上转义字符,前面加上 “ \ ”
  2. 而如果是“ ”,那么就要写成 “\ ”
  3. 如果一个字符串中有多个分隔符,可以用 “ | ”作为连字符

代码示例 :多次拆分

String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++) {
	String[] temp = result[i].split("=") ;
	System.out.println(temp[0]+" = "+temp[1]);
}

这种代码在以后的开发中经常会出现。


1.5 字符串截取

从一个完整的字符串之中截取出部分内容。可用方法如下:

public String substring(int beginIndex)
从指定索引截取到结尾

public String substring(int beginIndex, int endIndex)
截取部分内容

代码示例 :观察字符串截取

String str = "helloworld";
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));

注意事项

  1. 索引从 0 开始
  2. 前闭后开区间的写法,substring(0, 5) 表示包含 0 号下标的字符,不包含 5 号下标

1.6 其它操作方法

public String trim()
去掉字符串中的左右空格,保留中间空格

public String toUpperCase()
字符串大写

public String toLowerCase()
字符串小写

public native String intern()
字符串入池操作

public String concat(String str)
字符串连接,等同于 “+” ,不入池

public int length()
取得字符串长度

public boolean isEmpty()
判断是否为空字符串,不是 null,而是长度为 0

代码示例 :观察 trim( ) 方法的使用

String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");

trim 会去掉字符串开头和结尾的空白字符(空格,换行,制表符等)。


代码示例 :大小写转换

String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());

这两个函数只转换字母。


代码示例 :字符串 length( )

String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.length());

注意:数组长度使用数组名称.length属性,而String中使用的是length()方法。


代码示例 :观察 isEmpty( ) 方法

System.out.println("hello".isEmpty());
System.out.println("".isEmpty());
System.out.println(new String().isEmpty());

String类并没有提供首字母大写操作,需要自己实现.


代码示例 :首字母大写

public static void main(String[] args) {
	System.out.println(fistUpper("yuisama"));
	System.out.println(fistUpper(""));
	System.out.println(fistUpper("a"));
}

public static String fistUpper(String str) {
	if ("".equals(str)||str==null) {
		return str ;
	}
	if (str.length()>1) {
		return str.substring(0, 1).toUpperCase()+str.substring(1) ;
	}
	return str.toUpperCase() ;
}


二、StringBuffer 和 StringBuilder

首先来回顾下String类的特点:

如何字符串常量都是 String 对象,而且 String 的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已

通常来讲 String 的操作比较简单,但是由于 String 的不可更改特性,为了方便字符串的修改提供 StringBuffer 和 StringBuilder 类

StringBuffer 和 StringBuilder 大部分功能是相同的,我们主要介绍 StringBuffer。

在 String 中使用 “ + ” 来进行字符串连接,但是这个操作在 StringBuffer 类中需要更改为 append( ) 方法:

public synchronized StringBuffer append(各种数据类型 b)

范例:观察StringBuffer使用

public class Test{
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
		sb.append("Hello").append("World");
		fun(sb);
		System.out.println(sb);
	}
	public static void fun(StringBuffer temp) {
		temp.append("\n").append("www.bit.com.cn");
	}
}

可以通过参数传递过去修改.


String 和 StringBuffer 最大的区别
String 的内容无法修改,而 StringBuffer 的内容可以修改。
频繁修改字符串的情况考虑使用 StringBuffer。


为了更好理解 String 和 StringBuffer,我们来看这两个类的继承结构:

String 类

public final class String implements
java.io.Serializable, Comparable<String>, CharSequence

StringBuffer 类

public final class StringBuffer extends
AbstractStringBuilder implements java.io.Serializable, CharSequence

可以发现两个类都是 “CharSequence” 接口的子类,这个接口描述的是一系列的字符集。
所以字符串是字符集的子类,如果以后看见 CharSequence,最简单的联想就是字符串。

注意
String 和 StringBuffer 类不能直接转换,需要采用一些方法:

  • String 转 StringBuffer:利用 StringBuffer 的构造方法或 append( ) 方法。
  • StringBuffer 转 String:调用 toString( ) 方法。
String str1 = "hello";
//StringBuffer sb = new StringBuffer(str1);
StringBuffer sb1 = new StringBuffer();
sb1.append(str1);
StringBuffer sb = new StringBuffer("hello");
String str = sb.toString();

除了 append() 方法外,StringBuffer 也有一些 String 类没有的方法:

字符串反转

public synchronized StringBuffer reverse();
StringBuffer sb = new StringBuffer("hello");
System.out.println(sb.reverse());

删除指定范围的数据

public synchronized StringBuffer delete(int start, int end)
StringBuffer sb = new StringBuffer("hello123");
System.out.println(sb.delete(5, 8));

插入数据

public synchronized StringBuffer insert(int offset, 各种数据类型 b)
StringBuffer sb = new StringBuffer("hello");
System.out.println(sb.insert(5, "world"));

面试题
请解释 String、StringBuffer、StringBuilder 的区别

  • String 的内容不能修改,StringBuffer 和 StringBuilder 的内容可以修改.
  • StringBuffer 和 StringBuilder 大部分功能是相似的.
  • StringBuffer 采用同步处理,属于线程安全操作;StringBuiler 未采用同步处理,属于线程不安全操作。

三、小结

字符串操作是我们以后工作中非常常用的操作。
使用起来都非常简单方便,一定要使用熟练。

值得注意的点

  1. 字符串的比较,==、equals、compareTo 之间的区别.
  2. 了解字符串常量池,体会 “池” 的思想.
  3. 理解字符串不可变.
  4. split 的应用场景.
  5. StringBuffer 和 StringBuilder 的功能.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值