String类及常用方法
文章目录
- String类及常用方法
- 一、对于String常见的面试题?
- 二、String常用的方法
- 1. length():专门用于获取字符串长度(个数)
- 2. trim():去除当前字符两边的空白字符
- 3. toUpper()/toLowerCase():将当前的字符串中的英文部分转换为全部 大/小写
- 4. startsWith()/endswith():判断当前字符串是否是以给定的字符串(s)开始/结束的
- 5. charAt():返回当前字符串指定位置(index)上的字符----根据下标位置找字符
- 6. ndexOf():检索给定字符串(s)在当前字符串中第一次/最后一次出现的位置
- 7. substring():截取当前字符串中指定范围内的字符串
- 8. static String valueOf():是一个静态方法,将其他数据类型转换为string类型
- 9. boolean contains() 方法用于判断字符串中是否包含指定的字符或字符串。chars -- 要判断的字符或字符串。如果包含指定的字符或字符串返回 true,否则返回 false。
- 三、正则表达式:
- 四、StringBuilder:
- 五、补充
一、对于String常见的面试题?
String s = new String(“hello”);创建了几个对象?
/**
* String s = new String("hello");创建了几个对象
* 答:两个
* 在string池中创建”hello“字面量对象(在双引号中会创建对象),并存储在常量池
* 遇到new在内存上创建String对象”hello“
* 局部变量指向new String
*/
String s1 = "111";//当jvm看到"Hello",在string池创建string对象存储它,并将他的引用返回给s
String s2 = new String("hello");//复用常量池中创建的hello字面量对象
System.out.println(s1 == s2);//false,两个引用地址指向不同的地址
/** 在实际应用中,String比较相等一般是比较字符串内容是否相等
* 因此我们需要使用eyuals()方法来比较俩个字符串的内容是否相同 */
String s3 = "hello";
System.out.println(s3.equals(s2));//true
二、String常用的方法
1. length():专门用于获取字符串长度(个数)
/**
* int length() 方法:专门用于获取字符串长度(个数)
*/
String str = "我爱Java!";
System.out.println(str.length());//6
2. trim():去除当前字符两边的空白字符
/**
* String trim():
* 去除当前字符两边的空白字符
* 字符串str是不变的,str.trim()是重新创建了一个不含空格的新对象,并返回新对象
* 应用场景:注册表单输入
*/
String str = " hello world ";
System.out.println(str);// hello world
str = str.trim();//去除str两边的空白字符,并将去除之后的新对象存储到str中
System.out.println(str);//hello world
3. toUpper()/toLowerCase():将当前的字符串中的英文部分转换为全部 大/小写
/**
* String toUpperCase():
* 将当前的字符串中的英文部分转换为全部 大写
*
* String toLowerCase()
* 将当前的字符串中的英文部分转换为全部 小写
*
* 应用场景:验证码随机生成,将输入的字符串统一转为符合开发要求的 大/小写
*/
String str = "我爱Java";
String upper = str.toUpperCase();//将str中的英文部分转换为大写,并存入upper
String lower = str.toLowerCase();//将str中的英文部分转换为小写,并存入lower
System.out.println(upper);//我爱JAVA
System.out.println(lower);//我爱java
4. startsWith()/endswith():判断当前字符串是否是以给定的字符串(s)开始/结束的
/**
* boolan startsWith(String s)
* 判断当前字符串是否是以给定的字符串(s)开始的
*
* boolean endsWith(String s)
* 判断当前字符串是否是以给定的字符串(s)开始的
* 应用场景:判断照片格式是否正确
*/
String str = "think in java";//编程思想(经典书籍)
boolean starts = str.startsWith("think");
System.out.println(starts);//true
boolean ends = str.endsWith(".png");//判断石头人是否以.png结尾的
System.out.println(ends);//false
5. charAt():返回当前字符串指定位置(index)上的字符----根据下标位置找字符
/**
* char charAt(int index)
* 返回当前字符串指定位置(index)上的字符----根据下标位置找字符
* 应用场景:从一个字符串中随机选取n个字符
*/
String str = "think in java";
char c = str.charAt(9);
char c1 = str.charAt(3);
System.out.println(c);//j
System.out.println(c1);//n
6. ndexOf():检索给定字符串(s)在当前字符串中第一次/最后一次出现的位置
/**
* int indexOf(String s):
* 检索给定字符串(s)在当前字符串中第一次出现的位置
*
* int lastIndexOf(String s):
* 检索给定字符串(s)在当前字符串中最后一次出现的位置
*
* 应用场景:经常和subString()一起用
*/
String str = "thinking in java";
int index = str.indexOf("java");//从头(下标为0的位置)开始检索java在str中第一次出现的位置
int index2 = str.indexOf("in" , 3);//从下标为3的位置开始检索in第一次出现的位置
int index3 = str.indexOf("abc");//如果在字符串str中找不到的情况下 ,输出 -1
System.out.println(index);//12
System.out.println(index2);//5
System.out.println(index3);
int last = str.lastIndexOf("in");
System.out.println(last);//9
7. substring():截取当前字符串中指定范围内的字符串
/**
* String substring(int start , int end):
* 截取当前字符串中指定范围内的字符串(含头不含尾:包含start位置但不包含end位置的字符)
*
* 适用场景:
*/
String str = "www.tedu.cn";
String name = str.substring(4 , 8);//tedu
System.out.println(name);
int start = str.indexOf(".") + 1;//获取第一个点之后的下标4
int end = str.lastIndexOf(".");//获取最后一个点的下标8
String name2 = str.substring(start , end);//截取下标4-7之间的字符
System.out.println(name2);//tedu
//重载用法
String name3 = str.substring(4);//截取从下表4开始一致到最后的字符
System.out.println(name3);//tedu.cn
8. static String valueOf():是一个静态方法,将其他数据类型转换为string类型
/**
* static String valueOf(数据类型:a):
* 是一个静态方法,将其他数据类型转换为string类型
*
* 应用场景:数组转化为字符串常用
*/
int a = 123;
double b = 123.445;
char[] arr = {'1' , 'a' , '3'};
String str = String.valueOf(a); //将int型的变量a转换为string类型并复制给str
String str2 = String.valueOf(b); //将double型的变量b转换为string类型并复制给str2
String str3 = 123.1 + "";
String str4 = String.valueOf(arr); //将数组型的变量arr转换为string类型并复制给str4
System.out.println(str);//123--字符串类型
System.out.println(str2);//123.445--字符串类型
System.out.println(str3);//123.1--字符串类型
System.out.println(str4);//1a3--字符串类型
9. boolean contains() 方法用于判断字符串中是否包含指定的字符或字符串。chars – 要判断的字符或字符串。如果包含指定的字符或字符串返回 true,否则返回 false。
三、正则表达式:
1. 用于描述字符串的内容格式,使用他通常用于匹配一个字符是否符合格式要求
2. 正则表达式的语法:
1.[]:表示一个字符,该字符可以是[]中指定的内容
例如:
[abc]:这个字符可以是a或b或c
[a-z]:表示任意一个小写字母
[a-zA-Z]:表示任意一个字母
[a-zA-Z0-9]:表示任意一个字母数字
[a-zA-Z0-9_]:表示任意一个数字字母下划线
[^abc]:该字符只要不是a或b或c
2.预定义字符:
.:表示任意一个字符,没有范围限制
\d:表示任意一个数字,等同于[0-9]
\w:表示任意一个单词字符,等同于[a-zA-Z0-9_]----单词字符指字母、数字和_
\s:表示任意一个空白字符
\D:不是数字
\W:不是单词字符
\S:不是空白字符
3.量词:
?:表示前面的内容出现0-1次
例如: [abc]? 可以匹配:a 或 b 或 c 或什么也不写
但是不能匹配:m或aaa
+:表示前面的内容最少出现1次
例如: [abc]+ 可以匹配:b或aaaaaaaaaa...或abcabcbabcbabcba....
但是不能匹配:什么都不写 或 abcfdfsbbaqbb34bbwer...
*:表示前面的内容出现任意次(0-多次)---匹配内容与+一致,只是可以一次都不写
例如: [abc]* 可以匹配:b或aaaaaaaaaa...或abcabcba....或什么都不写
但是不能匹配:abcfdfsbbaqbb34bbwer...
{n}:表示前面的内容出现n次
例如: [abc]{3} 可以匹配:aaa 或 bbb 或 aab 或abc 或bbc
但是不能匹配: aaaa 或 aad
{n,m}:表示前面的内容出现最少n次最多m次
例如: [abc]{3,5} 可以匹配:aaa 或 abcab 或者 abcc
但是不能匹配:aaaaaa 或 aabbd
{n,}:表示前面的内容出现n次以上(含n次)
例如: [abc]{3,} 可以匹配:aaa 或 aaaaa.... 或 abcbabbcbabcba....
但是不能匹配:aa 或 abbdaw...
4.()用于分组,是将小括号里面的内容看做是一个整体
例如: (abc){3} 表示abc整体出现3次. 可以匹配abcabcabc
但是不能匹配aaa 或abcabc
(abc|def){3}表示abc或def整体出现3次.
可以匹配: abcabcabc 或 defdefdef 或 abcdefabc
但是不能匹配abcdef 或 abcdfbdef
3.String支持的正则表达式的相关方法
1.boolean matches():
/**
* boolean matches(String string) 匹配
* 使用给定的正则表达式验证当前字符串的格式是否符合要求,若符合则返回true,否则返回false
* 邮箱正则表达式:[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+
* 注意:\.中的\时正则表达式中的转义符,
* \\.中的第一个\,是Java的转义符,是转移正则表达式中的\
*/
String email = "wangkj@tedu.cn";
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
boolean match = email.matches(regex);
if (match){
System.out.println("邮箱格式正确");
}else{
System.out.println("邮箱格式错误");
}
2.String replaceAll():
/**
* String replaceAll(String regex , String s):替换
* 将当前字符串中满足正则表达式(regex)的部分给替换为给定的字符串(s)
* 引用场景:不文明用于替换
*/
String line = "ufb544364uiwefuBIUHUbuki";
line = line.replaceAll("[0-9]+" , "*");
System.out.println(line);//ufb*uiwefuBIUHUbuki
3.String split() :
/**
*String[] split(String regex)
* 当前字符按照满足正则表达式(regex)的部分进行拆分,将拆分除的以String数组(String[])的形式返回
*/
String str = "ab.c123.def.g345h.uo";
String[] data = str.split("[0-9]+");//按照数字拆分
String[] data1 = str.split("\\.");//按照.拆分
String[] data2 = str.split("[0-9]");//与data相比无+号比较
System.out.println(Arrays.toString(data));//[ab.c, .def.g, h.uo]
System.out.println(Arrays.toString(data2));//[ab.c, , , .def.g, , , h.uo]
System.out.println(Arrays.toString(data1));//[ab, c123, def, g345h, uo]
//最开始就是可拆分项(.),那么数组的第一个元素为空字符串("")
//如果连续两个(两个以上)可拆分项,那么中间也会拆除一个空字符串("")
//如果末尾连续多个可拆分想,那么拆除的空字符串被忽略
String str2 = ".1111.4535.....2332......";
String[] data3 = str2.split("\\.");
System.out.println(Arrays.toString(data3));//[, 1111, 4535, , , , , 2332]
四、StringBuilder:
- StringBuffer和StringBuilder用法基本一致,不详细说;
- 由于string是不变对象 ,每次修改内容都会创建新的对象,执行的效率会很低;因此string不适合频繁修改操作,为解决这个问题,java提供了StringBuilder类
- StringBuilder是专门 用于修改字符串的一个类,内部维护一个可变的char数组,所作操作总都是在这个数组基础之上纪念性的,修改速度、性能优秀,并且提供了修改字符串的常见方法(增删改查)
/**
* String不适合频繁的修改内容(效率第)--------for循环下的 string+i;string是不变对象 ,每次修改内容都会不断的创建新的对象,执行的效率会很低
*/
//StringBuilder的创建方式:
StringBuilder builder1 = new StringBuilder();//创建一个空的字符串("")
StringBuilder builder2 = new StringBuilder("abc");//创建一个abc串("abc")
String str = "abc";
//创建一个abc串("abc")/或者所将String类型转换为StringBuilder类型/或者是将str的内容复制到builder3中
StringBuilder builder3 = new StringBuilder(str);
String str2 = builder3.toString();//将StringBuilder类型转换为String类
StringBuilder常用方法:
- append():增加内容,在末尾追加
- delete():删除内容,替换部分内容(含头不含为)
- replace():替换内容
- insert():插入内容
String str = "好好学习Java";
StringBuilder builder = new StringBuilder(str);
//append():追加内容---在末尾追加
builder.append(",为了找个好工作");
System.out.println(builder);//好好学习Java,为了找个好工作
//replace():替换部分内容(含头不含尾)
//将下标为9-16的内容替换为---就是为了改变世界
builder.replace(9 , 16 , "就是为了改变世界");
System.out.println(builder);//好好学习Java,就是为了改变世界
builder.replace(9 , 12 , "哈哈哈哈哈哈哈");
System.out.println(builder);//好好学习Java,哈哈哈哈哈哈哈了改变世界
//delete():删除部分内容,含头不含尾
builder.delete(0,8);//删除下标0-7的字符
System.out.println(builder);//,不是为了做慈善而是为了改变世界
//insert():插入内容
builder.insert(0 , "活着");
System.out.println(builder);//活着,不是为了做慈善而是为了改变世界
五、补充
- 数组是length属性,字符串是length()方法
- 字符串内容若需要查看,那建议 用String---------实际应用中一般都是查看字符串;若需要频发修改,那建议用StringBuilder
- StringBuffer和StringBuilder的区别:
- StingBuilder:非线程安全的,并发处理的,性能稍快 ------一般使用StringBuilder
- StringBuffer:线程安全的,同步处理的,性能稍慢
- getter和setter数据私有,设计getter和setter的原因:
- 很多框架都是基于getter/setter来配置获取数据的,是一种行为标准
- getter/setter时可以堆数据进行控制,而public权限无法对数据进行控制(如,当满足条件是对变量进行赋值)
- 超类和派生类中竟太快和构造方法的执行顺序:
- 先走超类的静态快、
- 再走派生类静态块、
- 再走超类构造方法、
- 再走派生类构造方法