String 字符串类和编码 以及StringBuilder StringBuffer

发布时间:2024年01月22日

遍历字符串

方式1:通过charAt()方法

方式2:通过字符数组

package com.ztt.Demo01;

public class demo01 {
	public static void main(String[] args) {
		String s1 = "阴天傍晚车窗外";
		
		//遍历字符串
		//方式1:通过charAt()方法
		for(int i = 0;i < s1.length();i++) {
			char c = s1.charAt(i);
			System.out.print(c);
		}
		System.out.println();
		//方式1:通过字符数组
		char[] array = s1.toCharArray();//将字符串转换成char[]字符数组
		for(int i = 0;i < array.length;i++) {
			char c = array[i];
			System.out.print(c);
		}
	}
}

运行结果:

阴天傍晚车窗外
阴天傍晚车窗外

字符串的比较

实现方式: String类implements实现了Comparable接口,重写了compareTo()方法

package com.ztt.Demo01;

public class demo02 {
	
		//字符串的比较
		//实现方式: String类implements实现了Comparable接口,重写了compareTo()方法
		public static void main( String[] args) {
		String s1 = "abbf";
		String s2 = "abf";
		
		System.out.println(s1.compareTo(s2));
		
	}

}

运行结果:

-4

字符串的内容等值比较

实现思路:重写object类的equals()方法

?

package com.ztt.Demo01;

//字符串的内容等值比较
//实现思路:重写object类的equals()方法
public class demo03 {
	public static void main( String[ ] args) {
		//字符串常量池
		String s1 = "just so so" ;
		String s2 = "just so so";
		System.out.println(s1 == s2);//比较内存地址 
		System.out.println(s1.equals(s2)); //比较内容
		
		//在堆区重新分配空间
		String s3 = new String( "just so so" );
		String s4 = new String( "just so so" );
		System.out.println(s3 == s4); //比较内存地址
		System.out.println(s3.equals(s4));//比较内容
	}
}

运行结果:

true
true
false
true

字符串的查找搜索

indexOf()方法:从原字符串中查找目标字符串,返回第一次出现的位置

lastIndexOf()方法:从原字符串中查找目标字符串,返回最后一次出现的位置

contains()方法:判断原字符串中是否存在目标字符串

startwWith()方法:判断原字符串是否以目标字符串开头

endsWith()方法:判断原字符串是否以目标字符串结尾

package com.ztt.Demo01;

public class demo04 {

	public static void main(String[] args) {
		//字符串的查找
		String s="可怜无定河边骨";//原字符串
		String target="河";//目标字符串
		
		//indexOf()方法
		//如果存在:返回该目标字符串的下标(>=0)
		//如果不存在:返回-1
		int index=s.indexOf(target);
		System.out.println(index);

	}

}

运行结果:

4
package com.ztt.Demo01;
//字符串的查找搜索
//indexOf()方法:从原字符串中查找目标字符串,返回第一次出现的位置
//lastIndexOf()方法:从原字符串中查找目标字符串,返回最后一次出现的位置
//contains()方法:判断原字符串中是否存在目标字符串
//startwWith()方法:判断原字符串是否以目标字符串开头
//endsWith()方法:判断原字符串是否以目标字符串结尾

public class demo05 {

	public static void main(String[] args) {
		String s="唧唧复唧唧木兰当户织";
		String target="当户织";
		
		boolean isEnd=s.endsWith(target);
		System.out.println(isEnd);
		
		boolean isStrats=s.startsWith(target);
		System.out.println(isStrats);
		
		//lastIndexOf()方法:
		//如果存在,则返回true
		//如果不存则,则返回false
		boolean isContains = s.contains(target);
		System.out.println( isContains );
		
		//lastIndexOf()方法:
		//如果存在:返回该目标字符串的下标(>=0)
		//如果不存在:返回-1
			
		int index = s.lastIndexOf(target);	
		System.out.println(index ) ;
		
		// indexOf()方法:
		//如果存在:返回该目标字符串的下标(>=0)
		//如果不存在:返回-1
			
		int index1 = s.indexOf(target,2);	
		System.out.println(index1 ) ;	

	}

}

运行结果:

true
false
true
7
7

判断网址格式?

必须以"http"或"https"开头

必须以.com或.cn结尾

package com.ztt.Demo01;

public class demo06 {

	public static void main(String[] args) {
		
		//判断网址格式
		//必须以"http"或"https"开头
		//必须以.com或.cn结尾
		
		String url = "http://www.163.com" ;
		if((url.startsWith("http")||url.startsWith("https"))&&
		(url.endsWith(".com")|| url.endsWith(".cn"))){
		System.out.println("合法网址! ");
		}else {
		System.out.println("不合法网址! ");
		}
		

	}

}

运行结果:

合法网址! 

通过邮箱地址 截取用户名 邮箱服务器?

package com.ztt.Demo01;

public class demo07 {

	public static void main(String[] args) {
		// 邮箱地址
		String email="3418813089@qq.com";
		
		//截取用户名
		int endIndex=email.indexOf("@");
		String userName=email.substring(0,endIndex);
		
		//截取邮箱服务器
		int beginIndex=endIndex+1;
		endIndex=email.indexOf(".");
		String host=email.substring(beginIndex,endIndex);
		
		System.out.println("用户名账号:"+userName);
		System.out.println("邮箱服务器:"+host);

	}

}

运行结果:

用户名账号:3418813089
邮箱服务器:qq

字符串是不可变的每次截取,都会产生一个新的字符对象? 使用substring() 方法

package com.ztt.Demo01;

public class demo08 {

	public static void main(String[] args) {
		//字符串是不可变
		String s ="我本将心向明月";
		
		//每次截取,都会产生一个新的字符对象
		String ret = s.substring(4);
		
		System.out.println(s);
		System.out.println(ret);

	}

}

运行结果:

我本将心向明月
向明月

?去除首位“空白字符” 空白字符:空格 \t \r \n 使用:trim()方法

package com.ztt.Demo01;

public class demo09 {

	public static void main(String[] args) {
		//空白字符:空格 \t \r \n
		String s=" ABC\t\r\n";
		
		//去除首位“空白字符”
		s=s.trim();
		
		System.out.println(s);
		System.out.println(s.length());
		

	}

}

运行结果:

ABC
3

替换字符串

使用:1.replace() 方法?

? ? ? ? ? ?2.replaceAll()方法使用正则表达式进行匹配

? ? ? ? ? ? ? [\\,\\.\\$]匹配一个字符内容

? ? ? ? ? ? ? [\\,\\.\\$]+匹配多个字符内容

?

package com.ztt.Demo01;

public class demo10 {

	public static void main(String[] args) {
		// 替换字符串
		String ip="127.0.0.1";
		
		//字符替换字符
		String ret=ip.replace('.', '#');
		
		//字符串替换字符串
		String ret1=ip.replace(".", "[.]");
		
		System.out.println("原字符串:"+ip);
		System.out.println("替换结果:"+ret);
		

	}

}

运行结果:

原字符串:127.0.0.1
替换结果:127#0#0#1
package com.ztt.Demo01;
//字符串的替换
public class demo11 {

	public static void main(String[] args) {
		String s= "A,B,,C,D.E,G$H.I";
		//replace()方法将“,” “.替换成“#”
		String ret=s.replace(",", "#").replace(".", "#");
		
		//replaceAll()方法使用正则表达式惊醒匹配
		//[\\,\\.\\$]匹配一个字符内容
		//[\\,\\.\\$]+匹配多个字符内容
		String ret1=s.replaceAll("[\\,\\.\\$]+", "#");
		//[A-Z]+ 匹配多个大写字母
		String ret2=s.replaceAll("[A-Z]+", "#");
		
		// "."代表1个正则表达式,匹配任意字符
		//“\\."代表1个普通字符串内容,仅匹配"."
		String ret3 = s.replaceAll("\\.","#");
		
		System.out.println(s);
		System.out.println(ret);
		System.out.println(ret1);
		System.out.println(ret2);
		System.out.println(ret3);

	}

}

运行结果:

A,B,,C,D.E,G$H.I
A#B##C#D#E#G$H#I
A#B#C#D#E#G#H#I
#,#,,#,#.#,#$#.#
A,B,,C,D#E,G$H#I

字符串的分割? 使用:split() 方法

package com.ztt.Demo01;

import java.util.Arrays;

//字符串的分割
public class demo12 {

	public static void main(String[] args) {
		String s1 ="北京#上海#南京#苏州#杭州3常州#无锡#深圳#乌鲁木齐";
		String[] ret1 = s1.split("\\#");
		System.out.println(s1);
		System.out.println(Arrays.toString( ret1));
		
		//按照正则表达式的特殊字符进行分割
		String s2 ="北京+上海+南京+苏州+杭州+常州+无锡+深圳+乌鲁木齐";
		String[] ret2 = s2.split("\\+");//+属于正则表达式的特殊符号,必须转义
		System.out.println(s2);
		System.out.println(Arrays.toString(ret2) );
		
		//按照正则表达式进行分割
		String s3 = "北京A上海F南京K苏州w杭州u常州M无锡s深圳w乌鲁木齐";
		String[] ret3 = s3.split("[A-Z]");
		System.out.println(s3);
		System.out.println(Arrays.toString(ret3));
		
		String s4 = "北京0上海2南京7苏州1杭州4常州2无锡8深圳55乌鲁木齐";
		String[] ret4 = s4.split("[0-9]+");
		System.out.println(s4);
		System.out.println(Arrays.toString(ret4));

	}

}

运行结果:

北京#上海#南京#苏州#杭州3常州#无锡#深圳#乌鲁木齐
[北京, 上海, 南京, 苏州, 杭州3常州, 无锡, 深圳, 乌鲁木齐]
北京+上海+南京+苏州+杭州+常州+无锡+深圳+乌鲁木齐
[北京, 上海, 南京, 苏州, 杭州, 常州, 无锡, 深圳, 乌鲁木齐]
北京A上海F南京K苏州w杭州u常州M无锡s深圳w乌鲁木齐
[北京, 上海, 南京, 苏州w杭州u常州, 无锡s深圳w乌鲁木齐]
北京0上海2南京7苏州1杭州4常州2无锡8深圳55乌鲁木齐
[北京, 上海, 南京, 苏州, 杭州, 常州, 无锡, 深圳, 乌鲁木齐]

字符编码

ASCII码:包含A-Z a-z 、符号、占1个字节

Unicode码:包含主流编码集,占2个字节

UTF-8:占3个字节

package com.ztt.Demo01;
import java.util.Arrays;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

//字符编码
//ASCII码:包含A-Z a-z 、符号、占1个字节
//Unicode码:包含主流编码集,占2个字节
//UTF-8:占3个字节

public class demo14 {

	public static void main(String[] args) throws UnsupportedEncodingException {
		
			String s1 = "A";
			String s2 ="中";
			String s3 ="中";
			System.out.println(Charset.defaultCharset());
			
			// 获取字符串的字节数组
			byte[] b1 = s1.getBytes(); // 按照默认Unicode码获取字节值
			byte[] b2 = s2.getBytes("GBK"); // 按照默认Unicode码获取字节值
			byte[] b3 = s3.getBytes("UTF-8"); // 按照UTF-8码获取字节值
			System.out.println("A=" + Arrays.toString(b1));
			System.out.println("中=" + Arrays.toString(b2));
			System.out.println("中=" + Arrays.toString(b3));
		}
	}
		
		

运行结果:

UTF-8
A=[65]
中=[-42, -48]
中=[-28, -72, -83]

频繁的字符串拼接(修改)

应该选择“可变字符串” : StringBuilder或stringBuffer

创建1个可变字符串: 内部的char[]字符数组采用默认容量16

String:不可变字符串

StringBuilder:可变字符串

StringBuffer:可变字符串

相同点:

1.都是可变字符串,都继承自AbstractStringBuilder父类

区别点:

StringBuilder:线程不安全(每个方法没有加synchronized锁),性能好

StringBuffer:线程安全(每个方法没有加synchronized锁),性能差

package com.ztt.Demo01;

public class demo15 {

	public static void main(String[] args) {
		// 频繁的字符串拼接(修改)
		// 应该选择“可变字符串” : StringBuilder或stringBuffer
		// 创建1个可变字符串: 内部的char[]字符数组采用默认容量16
		StringBuilder s1 = new StringBuilder();
		// 创建1个可变字符串: 内部的char[]字符数组采用指定容量512
		StringBuilder s2 = new StringBuilder(512);
		// 创建1个可变字符串: 内部的char[]字符数组采用指定字符串的长度+16
		StringBuilder s3 = new StringBuilder("A");System.out.println(s3);
		// 向当前字符串s3的尾部追加
		s3.append("B"); // 第2个字符
		s3.append("C");
		s3 .append("D");
		//...
		s3.append("Z"); // 第18个字符,内部数组容量不足时,数组扩容
		System.out.println(s3);
		// 向当前字符串s3的指定位置插入
		s3.insert(0,"a");
		System.out.println(s3);
		// 删除字符串// s3.delete(0,2);
		// System.out.println(s3);
		// 截取字符串
		String ret = s3.substring(0,2);
		System.out.println(s3);
		System.out.println(ret);
	}
}

运行结果:

A
ABCDZ
aABCDZ
aABCDZ
aA

替换字符串中所有的数字,在原有数字基础上+1

package com.ztt.Demo01;

import java.util.UUID;

public class demo16 {

	public static void main(String[] args) {
		String uuid=UUID.randomUUID().toString();
		System.out.println(uuid);
		
		//替换字符串中所有的数字,在原有数字基础上+1
		StringBuilder sb=new StringBuilder(uuid);
		
		//遍历字符串
		for(int i=0;i<sb.length();i++) {
			//获取每个字符
			char c=sb.charAt(i);
			
			//判断该字符是否是数字
			if(c>='0' && c<='9') {
				//转换成数字后,+1
				int n=Integer.parseInt(String.valueOf(c));
				
				//0-9
				n=n+1>9?0:n+1;
				
				//直接在当前字符串对象的内存中,完成替换
				sb.replace(i, i+1, String.valueOf(n));
			}
		}
		System.out.println(sb);

	}

}

运行结果:

16e9a643-18aa-4e44-928d-0401cc883057
27e0a754-29aa-5e55-039d-1512cc994168

逆序遍历字符串?

package com.ztt.Demo01;

public class demo17 {

	public static void main(String[] args) {
		
		String s1="ABCDEFG";
		
		//方式1:逆序遍历,追加拼接至可变字符串的尾部
		StringBuilder ret1=new StringBuilder();
		for(int i=s1.length()-1;i>=0;i--) {
			char c=s1.charAt(i);
			ret1.append(c);//当前字符串拼接在字符串尾部
		}
		System.out.println(ret1);
		
		//方式2:
		StringBuilder ret2=new StringBuilder();
		ret2.reverse();//逆序
		System.out.println(ret2);
	}

}

运行结果:

GFEDCBA

?将空格替换为 “%20”

package com.ztt.Demo01;

//String:不可变字符串
//StringBuilder:可变字符串
//StringBuffer:可变字符串

public class demo18 {

	public static void main(String[] args) {
		//将空格替换为 “%20”
		String s="just do IT hi chi le mei";
		
		//方式1:
		System.out.println(s);
		String ret1=s.replace(" " , "%20");
		System.out.println(ret1);
		
		//方式2:
		StringBuilder sb=new StringBuilder(s);
		System.out.println(sb);
		
		int index=-1;
		while((index=sb.indexOf(" " ))>=0) {
			System.out.println(index);
			sb.replace(index, index+1, "%20");
		}
		
		System.out.println(sb);
	}

}

运行结果:

just do IT hi chi le mei
just%20do%20IT%20hi%20chi%20le%20mei
just do IT hi chi le mei
4
9
14
19
25
30
just%20do%20IT%20hi%20chi%20le%20mei

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

文章来源:https://blog.csdn.net/m0_68041576/article/details/135755538
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。