10.10-字符串

String类

相当于char[]+操作(方法)

char[]本身就是一串字符,在Java中可以作为字符串来使用

例子

package day10_10;

import java.util.Arrays;

public class StringDemo01 {
	public static void main(String[] args) {
		char[]chs1 = {'中','国'};
		char[]chs2 = {'台','湾','省'};
		//将chs1和chs2拼接在一起
		chs1 = Arrays.copyOf(chs1, chs1.length+3);
		System.arraycopy(chs2, 0, chs1, 2, 3);
		System.out.println(Arrays.toString(chs1));
		
		String s1 = "中国";
		String s2 = "台湾省";
		//将s1与s2拼接在一起
		String s3 = s1.concat(s2);
		System.out.println(s3);
		
	}
}

注意事项

  1. char[]只有数据,没有操作(方法)

  2. 一串字符就是字符串:String/char[]/StringBuilder/StringBuffer

  3. 字符串的字面量都是String类型

  4. String类中的常量均为static final修饰

  5. String类的内部就是一个char[]

    String类有一个原则,对象内容不变,String对象永远不变;这使得String类使用起来与基本类型差不多。

    String字面量相同时,会替换为同一个String对象引用;这是由于常量池拥有常量优化机制,会将相同的字面量优化为同一个

常用方法

  1. String类重写了Object类中的toString/equals/hashCode方法

  2. String字符串中所有的字符都有下标,下标从0开始,到lenght()-1结束

  3. 常用API

    • charAt() 根据给定的下标获取对应的字符

    • indexOf() 根据给定的字符获取对应的下标

    • lastIndexOf() 查看给定字符串在当前字符串中最后一次出现的位置

    • toUpperCase() 将当前字符串中所有的小写字母转为大写

    • toLowerCase() 将当前字符串中所有的大写字母转为小写

    • trim() 去除当前字符串两边的空白

    • startsWith() 判断当前字符串是否以给定的字符串起始

    • endsWith() 判断当前字符串是否以给定的字符串结尾

    • length() 获取当前字符串的长度(字符量)

    • equals() 比较两个字符的内容是否相等

    • equalsIgnoreCase() 忽略英文大小写比较两个字符串内容是否相等

    • substring() 截取字符串

    • toCharArray() 将当前字符串转换为对应的字符数组

    • getBytes() 根据给定的字符集将当前字符串转换为对应的字节序列

例子一

package day10_10;

public class StringDemo02 {
	public static void main(String[] args) {
		String s = "abcdefghij";
		//获取下标为5的字符
		System.out.println(s.charAt(5));//f
		String email = "[email protected]";
		//获取字母o的下标值
		int i = email.indexOf('o');
		System.out.println(i);//4
		String str = "Thinking in java";
		//获取字符串in的下标
		int index = str.indexOf("in");
		System.out.println(index);//2
		//从当前字符串给定位置查找第一次出现的给定字符串位置
		index = str.indexOf("in", 7);
		System.out.println(index);//9
		//从当前字符串给定位置查找第一次出现的给定字符位置
		index = str.indexOf('i', 7);//9
		System.out.println(index);
		//从当前字符串查找最后i一次出现的给定字符位置
		index = str.lastIndexOf('i');
		System.out.println(index);
		//从当地前字符串查找给定字符串最后一次出现的位置
		index = str.lastIndexOf("in");
		System.out.println(index);//9
		//到指定位置截至,查找给定字符串最后一次出现的位置
		index = str.lastIndexOf("in", 7);
		System.out.println(index);//5
	}
}

例子二

package day10_10;

import java.util.Arrays;

public class StringDemo03 {
	public static void main(String[] args) {
		String str ="HelloWorld";
		//小写转大写
		String upper = str.toUpperCase();
		System.out.println(upper);
		//大写转小写
		String lower = str.toLowerCase();
		System.out.println(lower);
		
		String str1 = "   h e  ll o ";
		str1 = str1.trim();
		//trim()只能去除字符串两边的空白
		System.out.println(str1);
		//判断字符串str是否以字符串"Hel"开头
		System.out.println(str.startsWith("Hel"));//true
		//判断字符串str是否以字符串"rold"结尾
		System.out.println(str.endsWith("rold"));//false
		//获取当前字符串长度
		System.out.println(str.length());//10
		//比较两个字符串内容是否相等
		String str2 ="HelloWorld";
		System.out.println(str.equals(str2));//true
		//忽略字符串英文字母大小比较内容是否相等
		String str3 ="HELLOWORLD";
		System.out.println(str.equalsIgnoreCase(str3));//true
		//从指定下标截取往后的字符串
		String str4 =str.substring(1);
		System.out.println(str4);//elloWorld
		//从指定下标1开始截取到下标5的字符串,不包括下标5的字符
		String str5 = str.substring(1, 5);
		System.out.println(str5);//ello
		//将指定字符转换为字符数组
		char[] c1 = str.toCharArray();
		System.out.println(Arrays.toString(c1));
		
	}
}

例子三

package day10_10;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class StringDemo04 {
	/**
	 * 将字符串转换为对应字节序列的过程,称之为编码
	 * 将字节序列转换为对应字符串的过程称之为解码
	 * 解码和编码使用的字符集应当一致,否则会出现乱码的情况
	 */
	public static void main(String[] args) throws UnsupportedEncodingException {
		String str = "我爱Java";
		/*
		 * 若想将字符串存储到磁盘文件中,
		 * 必须先将字符串转换为对应的字节序列后才可以存入
		 * 所谓的字节序列就是一个byte类型的数组byte[]
		 */
			byte[] gbk=str.getBytes("GBK");
			System.out.println(gbk.length);
			//GBK中汉字占两字节
			System.out.println(Arrays.toString(gbk));
			byte[] utf=str.getBytes("UTF-8");
			//UTF8中汉字占三字节
			System.out.println(utf.length);
			System.out.println(Arrays.toString(utf));
			/*
			 * String的构造器
			 * String(byte[] data,String csn)
			 * 将给定的字节数按照给定字符集转换为对应的字符串
			 */
			String gbkStr = new String(gbk,"GBK");
			System.out.println(gbkStr);
			String utfStr = new String(utf, "UTF-8");
			System.out.println(utfStr);


	}
}

正则表达式

负责字符串的匹配处理,一般用于验证字符串的格式

正则表达式本身也是一个字符串

格式

^正则表达式$

字符集

  • [123456789] 表示123456789其中之一

  • [1-9] 表示1-9的数组(与上一个同义)

  • [^12345] 表示除了12345以外的所有

  • [a-z] 表示a-z之间的字符

  • [0-9a-zA-Z] 表示0-9az-A-Z其中之一

  • {6} 表示出现了6次

  • {8,10} 表示出现了8-10次

  • ……

例子一

定义正则表达式,表示8~15位数字、字母、下划线组成的密码

String regex = "^[0-9a-zA-Z_]{8,15}$"

预定义字符集

  • \d 表示任意数字,等价于[0-9]

  • . 表示任意字符

  • \w 表示单词字符,等价于 [0-9a-zA-Z_]

  • \s 表示匹配空白

  • \D 表示非数字

  • \S 表示非空白

  • \W 表示非单词字符

  • ? 表示出现了0-1次

  • + 表示出现了1次以上

  • * 表示出现了0~n次

  • | 表示或者

  • & 表示并且

例子二

书写一个正则表达式,用于验证邮政编码的格式(6位纯数字)

String postNum = "^\\d{6}$";

例子三

验证三种手机号码

15951618999

+86 15951618999

0086 15951618999

String phoneNum = "^((\\+\\d{2}\\s)|(\\d{4}\\s))?\\d{11}$";

如何验证

使用String类中的matches(String regex)方法

例子四

		/*
		 * 验证当前字符串是否满足给定正则表达式的格式要求
		 * 邮箱正则表达式
		 * \w+@\w+(\.com|\.cn|\.com\.cn)
		 */
		String regex = "^\\w+@\\w+(\\.com|\\.cn|\\.com\\.cn)$";
		String email = "[email protected]";
		/*
		 * matches(String regex)
		 * 使用给定的正则表达式来验证当前字符串是否满足要求,返回 boolean值
		 */
		if(email.matches(regex)) {
			System.out.println("合法");
		}else {
			System.out.println("不合法");
		}

利用正则表达式替换字符串内容

例子五

使用String类中的replaceAll()方法

		/*
		 * String replaceAll(String regex,String replacement)
		 * 将当前字符串中满足正则表达式的部分替换为给定字符串
		 */
		String str = "QWE123YUI89HJK456RTY09";
		//将上述字符串中数字部分替换位#NUM#
		String str1 = str.replaceAll("\\d+", "#NUM#");
		System.out.println(str1);

StringUtils类

此类为commons-lang jar包所携带的扩展内容

该jar包是由Apache组织提供的,用于扩展Java中lang包中类的一些功能

例子

package day10_10;

import java.util.Arrays;

import org.apache.commons.lang3.StringUtils;

public class StringUtilsDemo {
	/**
	 * commons-lang 
	 * 该jar包是由Apache组织提供的,
	 * 用于扩展Java中lang包中类的一些功能
	 */
	public static void main(String[] args) {
		/*
		 * String repeat(String str,int repeat)
		 * 将给定的字符串重复次数返回
		 */
		String repeat = StringUtils.repeat("abc", 5);
		System.out.println(repeat);
		String str = "123,456,789";
		//拆分字符串 String类中spilt()方法
		String[] array = str.split(",");
		System.out.println(Arrays.toString(array));
		/*
		 * StringUtils提供的join()方法相当于String类spile()方法的反操作
		 * 将给定的数组中每一项根据给定的字符串链接在一起
		 */
		String join = StringUtils.join(array, ".");
		System.out.println(join);
		/*
		 * StringUtils leftPad(String str, int size, char chs)
		 * 将给定字符串str的左侧添加若干个给定的字符chs,以使字符串的长度达到给定的size
		 */
		String leftPad = StringUtils.leftPad("12345", 10, '*');
		System.out.println(leftPad);
		/*
		 * StringUtils rightPad(String str, int size, char chs)
		 * 将给定字符串str的右侧添加若干个给定的字符chs,以使字符串的长度达到给定的size
		 */
		String rightPad = StringUtils.rightPad("12345", 10, '*');
		System.out.println(rightPad);
	}
}

StringBuilder

StringBuilder是用来修改字符串的类,是一个变长字符序列

StringBuilder JDK1.5 效率较高,线程不安全

StringBuffer JDK1.0 效率较低,线程安全

StringBuilder类中方法

append/delete/replace/instert

字符串的增/删/改/插操作方法

返回值都是StringBuilder对象本身的引用(表明是同一个对象)

例子

package day10_11;

public class StringBuilderDemo02 {
	/**
	 * 字符串修改操作
	 */
	public static void main(String[] args) {
		String str = "好好学习Java";
		StringBuilder builder = new StringBuilder(str);
		/*StringBuilder append(String str)
		 * 向当前字符串末尾追加给定的字符串
		 * "好好学习Java,为了找个女朋友"
		 */
		builder.append(",为了找个女朋友");
		System.out.println(builder);
	
		/*	StringBuilder replace(int start,int end,String)
		 * 将当前字符串中给定范围的字符串替换为给定的字符串
		 * "好好学习Java,为了改变世界"
		 */
		builder.replace(11, 16, "改变世界");
		//前包后不包
		System.out.println(builder);
		/*
		 * StringBuilder delete(int start,int end)
		 * 将当前字符串中给定范围的字符串删除
		 * ",为了改变世界"
		 */
		builder.delete(0, 8);
		System.out.println(builder);
		/*
		 * StringBuilder insert (int offset,String str)
		 * 将给定的字符串插入到给定位置中
		 * "活着,就是为了改变世界"
		 */
		builder.insert(0, "活着");
		builder.insert(3, "就是");
		System.out.println(builder);
		
		
	}
}

reverse

字符串的反转方法

例子

package day10_11;

public class StringBuilderDemo03 {
	public static void main(String[] args) {
		String str = "上海自来水来自海上";
		/*
		 * StringBuilder reverse()
		 * 将当前字符串反转
		 */
		StringBuilder b1 = new StringBuilder(str);
		StringBuilder b2 = new StringBuilder(str);
		b1 = b1.reverse();
		System.out.println(b1);
		System.out.println(b2);
		/*
		 * StringBuild类并没有重写Object类中的equals()
		 * 若要比较两个字符串内容是否相等,需要将字符串转换为String类型后再作比较
		 */
		if (b1.toString().equals(b2.toString())) {
			System.out.println("是回文");
		}else {
			System.out.println("不是回文");
		}
	}
}

最后更新于