复习
String–最终类、定义完成之后不可改变(底层由一个不可改变的字符数组实现)、String底 层由StringBuilder来实现的拼接(先把字符串底层字符数组的元素复制-一份放到StringBuilder的可变数组中进行扩容(拼接),得到的拼接的结果就是新的可变字符数组,再由这个字符数组转成一一个 新的字符串(就是把这个新的字符数组的元素拷贝-份放到一个新的不可改变数组里) )
所有的常量都是存储在常量池中直接存储的就是真实值,String除外
equals () --String 自己重写的方法(先比较地址值再比较内容)
API
编码:把文字转成具体的数据 码表:转换机规则 西欧码表,(ISO8859-1 一个字节)GB2312(简体中文 2个字节) BIG5(繁体中文 2个字节) 国标码(GBK 2个字节) Unicode编码体系(u8 ( 3个字节) u16 (2个字节) u32等 ) 所有的完整码表都默认兼容西欧码表
重要方法:
getBety()-----可可以根据指定的码表来返回一个字节数组或者不指定码表就按照默认平台码来进行编码返回一个字节数组
new String(byte[]bs,int offeset,int length)-----把部分字节数组可以按照指定的码表进行转换成新的字符串对象,如果不指定就按照默认的平台码来转换
hashCode():返回字符串对象的哈希码值,重写hashCode()方法根据字符串元素的内容及顺序来算的
indexOf()-----返回指定新串在原串中第一次出现的下标值,如果没有出现就返回-1
intern()------把字符串的引用转向常量池中
imEmty()------判断是否是空串
replace()-----把原串中出现的所有指定字符转换成新字符返回一个新的字符串
substring()------按照给定的下标范围进行截取字符串,把这个字符串进行返回
valueOf()------静态方法,可以把所有的数据类型的数据转成新字符串返回
String 提供了大量的返回新串但是不影响原串的方法
public class StringDemo extends Object{
public static void main(String[] args) throws Exception {
String str="字符串";
//没有具体的码表就按默认的系统平台码来编码(GBK)
byte[] s2=str.getBytes("utf-8");
//字节数组转成一个新的字符串对象,不按指定编码就是按照默认的系统平台码来转
String s=new String(s2,"utf-8");
//转换字节数组的部分信息为新的字符串对象
String cs=new String(s2,0,4,"utf-8");
System.out.println(s);
}
}
案例:
public class StringText1 {
public static void main(String[] args) {
String str="字符串";
//给定字符串数
int n=3;
//字符串转成字节数组
byte[]s=str.getBytes();
//按照指定字节数转成新字符串
String s2=new String(s,0,n);
//判断新字符串是否出现
//新串的最后一个字符和原串的对应下标字符
if(s2.charAt(s2.length()-1)!=str.charAt(s2.length()-1)) {
char[]c=s2.toCharArray();
//字符数组最后一个不转
s2=new String(c,0,s2.length()-1);
}
System.out.println(s2);
}
}
案例2:
package cn.tedu.stringxx;
/**
*@author 作者:
*@version 创建时间:2020年10月4日下午1:49:49
*@description 描述:查找字符串中第一个字符出现的所有下标值
*/
public class StrngText2 {
public static void main(String[] args) {
//字符串
String str="sfdsdfghjklkfjh";
char c=str.toCharArray()[0];//charAt(0)
//下标值
int index=0;
while(index!=str.length()) {//下标值等于字符串长度
//返回第一次出现的下标值
index=str.indexOf(c+"",index);
if(index!=-1) {
System.out.println(index);
index++;
}else {
break;
}
}
}
}
String str1=“abc”;
String str2=new String(“abc”);
//把指向堆内存的引用转向到常量池中
str2=str2.intern();
System.out.println(str1==str2);
注意:
String str="";//内存中有空间但是没有元素—空
String str2=null;//内存没有空间开辟
System.out.println(str.isEmpty());
//字符串
String str="qwertyqweri";
//把原串中所有指定的字符替换成新字符返回一个新字符串
System.out.println(str.replace('q', '*'));
System.out.println(str);
String str="wrewQWEwr";
//给定起始下标,从下标开始往后截取成一个新字符串进行返回
System.out.println(str.substring(5));
//从起始下标进行截取,截取结束下标减去起始下标的个数(左包右不包)
System.out.println(str.substring(1, 7));
//全部大写
System.out.println(str.toUpperCase());
//全部小写
System.out.println(str.toLowerCase());
public class StringDemo4 {
public static void main(String[] args) {
//字符串
String str=" eruh\tdv ";
System.out.println(str+"a");
//对字符串的前面或者尾部出现的空格进行删除----掐头去尾
System.out.println(str.trim()+"a");
//把布尔类型转换成新的字符串
String s1=String.valueOf(true);
//把整数类型转换成新的字符串
String s2=String.valueOf(2);
System.out.println(s1);
System.out.println(s2);
//
int[] arr= {2,3,4};
char[] cs= {'2','6','1'};
//输出的是数组的内存地址值,通过底层的valueOf方法转成字符串
System.out.println(arr);
//在底层没有转成字符串直接输出的是数组元素
System.out.println(cs.toString());
}
}
public class PatterDemo2 {
public static void main(String[] args) {
//字符串abc
String str="abc";
//匹配字符串中只有abc
System.out.println(str.matches("abc"));
//匹配abd/cfh/lkn 每一组任取一个组成的字符串
//[]----里面的内容任取一个
String str2="ack";
System.out.println(str2.matches("[abd][cfh][lkn]"));
String str3="1";
//匹配一个数字的字符串
//[]----可以表示范围,任取一个
System.out.println(str3.matches("[0-9]"));
//字符串要转义,正则也要转义
System.out.println(str3.matches("\\d"));
//匹配出x/u/k之外的字符串x
String str4="a";
System.out.println(str4.matches("[^nuk]"));
}
}
public class PatterDemo3 {
public static void main(String[] args) {
//字符串
String str="h";
String str2=".";
String str3="\\";
String str4="\t";
//.任意字符
System.out.println(str.matches("."));
//匹配
//\\.--字符串转义-\.--正则转义--.
//.小数 文件类型
System.out.println(str2.matches("\\."));
//匹配 \\\\ --字符串转义--\\-正则转义---\
System.out.println(str3.matches("\\\\"));
//
System.out.println(str4.matches("\t"));
}
}
public class PatterDemo4 {
public static void main(String[] args) {
//字符串
String str="12wsdfsddsf";
String str2="af3";
//匹配开头是数字,结尾是小写字母,最少3个字符组成的字符串
//+区控制前面的字符出现的次数 最少出现一次 >=1
//System.out.println(str.matches("[0-9].+[a-z]"));
//匹配小写字母开头,数字结尾,最多三个字符组成的字符串
//?去控制前面的字符出现的次数 最多出现一次 <=1
//System.out.println(str2.matches("[a-z].?[0-9]"));
//System.out.println(str2.matches("[a-z].?\\d"));
//匹配以abc中任意一个开头,以数字结尾的字符串
//*去控制前面的字符出现的次数 可以不出现也可以出现多次 >=0
//String str3="ad3";
//System.out.println(str3.matches("[abc].*[0-9]"));
//匹配aaaaa的字符串
//字符{数值}----表明匹配字符串只出现了字符的数值的次数
String str4="aaaaa";
//System.out.println(str4.matches("a{5}"));
//最少出现的次数
//没有最大空间,会取到负数,所以不允许{,5}
//最小区间可以的{n,}
//{n,m}----字符出现的次数是n到m范围之内
System.out.println(str4.matches("a{1,5}"));
}
}
public class PatterDemo5 {
public static void main(String[] args) {
//字符串
String str="ababab";
//匹配字符串中是否出现ab
//System.out.println(str.matches(".*ab.*"));
//匹配字符串中出现了两个ab
//() --- 捕获组
// \\n----n就是捕获组的编号
//System.out.println(str.matches("(ab)\\1\\1"));
//匹配叠字啊啊啊啊啊
String str2="啊啊";
System.out.println(str2.matches("(.)\\1+"));
//AABB 高兴高兴
String str3="高高兴兴";
System.out.println(str3.matches("(.)\\1(.)\\2"));
//ABAB
String str4="溜达溜达";
System.out.println(str4.matches("(.)(.)\\1\\2"));
System.out.println(str4.matches("(..)\\1"));
/**
* 捕获组的编号 ----从( 开始编号
* (a(c(d)e)b)f(g)
* 1 a(c(d)e)b
* 2 c(d)e
* 3 d
* 4 g
*/
}
}
案例:
package cn.tedu.stringxx;
/**
*@author 作者:
*@version 创建时间:2020年10月4日下午7:44:22
*@description 描述:输入一个字符串,匹配是否是小数0.2532 10.25
*/
public class PatterTest1 {
public static void main(String[] args) {
//字符串
String str="103.200";
//
System.out.println(str.matches("[0-9]\\.[0-9]+|[1-9][0-9]+\\.[0-9]+"));
}
}
案例:
package cn.tedu.stringxx;
/**
*@author 作者:
*@version 创建时间:2020年10月4日下午8:34:22
*@description 描述:密码判断
*/
public class PatterTest2 {
public static void main(String[] args) {
//字符串
String str="ac126f";
System.out.println(isPasswd(str));
//判断是否是密码
}
public static boolean isPasswd(String str){
//不正常范围
if(str==null||str=="") {
return false;
}
//判断不在长度和组成范围内,排除掉
if(!str.matches("[0-9a-z_]{6,12}")) {
return false;
}
//统计数
int count=0;
//判断小写英文字母是否出现
if(str.matches(".*[a-z].*")) {
count++;
}
//判断数字是否出现
if(str.matches(".*[0-9].*")){
count++;
}
//判断_
if(str.matches(".*_.*")) {
count++;
}
return count>=2;
}
}
案例:
package cn.tedu.stringxx;
/**
*@author 作者:
*@version 创建时间:2020年10月4日下午8:48:14
*@description 描述:匹配邮箱
*/
public class PatterTest3 {
public static void main(String[] args) {
//
String str="dfsdsfa@fasdfasdf.com.cn";
//
System.out.println(str.matches("[0-9a-z_-]{6,20}@[a-z0-9]{6,12}\\.com|[0-9a-z_-]{6,20}@[a-z0-9]{6,12}(\\.com)?\\.cn"));
}
}
案例:
public class PatterDemo6 {
public static void main(String[] args) {
//字符串
String str="sdad23sdfa233";
//先匹配到具体的内容在进行替换
//System.out.println(str.replaceAll("\\d","*"));
//对字符串中的数字排序
//把非字符数据替换掉
String ss=str.replaceAll("\\D","");
//获取字符串数组
char[]c=ss.toCharArray();
//排序
Arrays.sort(c);
//
System.out.println(Arrays.toString(c));
}
}
案例:
package cn.tedu.stringxx;
/**
*@author 作者:
*@version 创建时间:2020年10月4日下午9:02:12
*@description 描述:计算字符串中各个字符的出现次数
*/
public class PaterTest4 {
public static void main(String[] args) {
//字符串
String str="ewrjvcgiedv";
//操作循环
while(str.length()!=0) {
//原长度
int length=str.length();
//替换重复字符串
//拿到新串中的第一个字符
char c=str.toCharArray()[0];
String s="";
//判断是否特殊字符
if(c=='+') {
//加上转义
s+="\\"+c;
}else
{
s+=c;
}
//把字符替换成空串
str=str.replaceAll(s, "");
//输出
System.out.println(c+":"+(length-str.length()));
}
}
}
public class PatterDemo7 {
public static void main(String[] args) {
//
String str="sd[34x]fas[";
//[]----\\[] \\[\\] [34x]-------\\[|\\]
//System.out.println(str.replaceAll("\\[|\\]", "*"));
//System.out.println();
String str2="tomandjerry";
//输出jerryandtom
//捕获组和使用捕获组不在一个表达式中自能用$n去使用其他的捕获组
//System.out.println(str2.replaceAll("(tom)(.*)(jerry)", "$3$2$1"));
String str3="我我我我我我要要要要学学学学习";
System.out.println(str3.replaceAll("(.)\\1*", "$1"));
}
}
案例:
切割:split
package cn.tedu.stringxx;
import java.util.Arrays;
/**
*@author 作者:
*@version 创建时间:2020年10月4日下午9:28:05
*@description 描述:
*/
public class PatterDemo8 {
public static void main(String[] args) {
//
String str="3sdfas9dsfad4sdf4";
//以匹配到的信息(分隔符)进行分割成一个字符串数组
//分隔符在前面就切除出一个空串,在后面就切掉了
String[] ss=str.split("\\d");
//遍历数组
for (String string : ss) {
System.out.println(string);
}
//System.out.println(Arrays.toString(ss));
}
}