前面我们在String类(一)中介绍了有关String字符串底层的相关知识,并分析了其内存布局,接下来我们在本节中就学习一下字符串的具体使用问题。
目录
3.StringBuffer 和 StringBuilder
1.字符、字节和字符串
1.1字符与字符串
1.1.1将字符数组内容变为字符串
public static void main(String[] args) {
char[] val = {'a','b','c'};
String str = new String(val);
System.out.println(str);
}
1.1.2将部分字符数组内容变为字符串
public static void main(String[] args) {
char[] val = {'a','b','c','d','e'};
//1代表从1位置开始,4代表取4个字符
String str = new String(val,1,4);
System.out.println(str);
System.out.println("====================");
String str2 = "hello";
char ch = str2.charAt(2);//获取2下标的字符
System.out.println(ch);
char[] chars = str2.toCharArray();//把str2指向的字符串对象变成字符数组
System.out.println(Arrays.toString(chars));
}
1.1.3判断一个字符串是否全部由数字组成
//直接调用方法
public static void main(String[] args) {
String str = "12345a67";
System.out.println(isNumberChar(str));
}
//自己实现函数的生成
public static boolean isNumberChar(String s){
for (int i = 0;i < s.length();i++){
char c = s.charAt(i);
//判断一个字符是不是数字
boolean flg = Character.isDigit(c);
if(flg == false){
return false;
}
/* if(c < '0'||c > '9'){
return false;
}*/
}
return true;
}
1.2字节与字符串
1.2.1字节数组转变为字符串
public static void main(String[] args) {
byte[] bytes = {97,98,99,100};
//将字节数组变成字符串
String str = new String(bytes);
System.out.println(str);
}
1.2.2将部分字节数组转变为字符串
public static void main(String[] args) {
byte[] bytes = {97,98,99,100};
//将字节数组变成字符串
String str = new String(bytes,1,3);
System.out.println(str);
1.2.3字符串转变字符数组
方法一:
String str2 = "abcd";
//将字符串变成字节数组
byte[] bytes1 = str2.getBytes();
System.out.println(Arrays.toString(bytes1));
方法二:
public static void main(String[] args) throws UnsupportedEncodingException {
String str2 = "abcd";
//将字符串变成字节数组方法2
byte[] bytes1 = str2.getBytes("utf-8");
System.out.println(Arrays.toString(bytes1));
byte[] bytes2 = str2.getBytes("GBK");
System.out.println(Arrays.toString(bytes2));
System.out.println("==============");
String str3 = "航航";//一个中文是2个字节
byte[] bytes3 = str3.getBytes("utf-8");
System.out.println(Arrays.toString(bytes3));
byte[] bytes4 = str3.getBytes("GBK");
System.out.println(Arrays.toString(bytes4));
}
当字符串是中文时,我们使用utf-8和GBK结果是不同的
小结之使用byte[ ]和char[ ]的时候:
byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
char[] 是把 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.
2.1字符串常见操作
2.1.1比较两个字符串内容
public static void main(String[] args) {
//区分大小写的比较
String str1 = "abcdef";
String str2 = "hello";
System.out.println(str1.equals(str2));
}
public static void main(String[] args) {
String str1 = "abcdef";
String str2 = "Abcdef";
//忽略大小写的情况下比较字符串大小,比如填写验证码
System.out.println(str1.equalsIgnoreCase(str2));
}
2.1.2比较两个字符串大小关系
public static void main9(String[] args) {
String str1 = "abcdef";
String str2 = "Abcdef";
//返回两个字母的差
int ret = str1.compareTo(str2);
System.out.println(ret);
}
使用compareTo的结果: //1. 相等:返回0.
//2. 小于:返回内容小于0.
//3. 大于:返回内容大于0
2.2字符串查找
2.2.1判断子字符串是否存在
public static void main(String[] args) {
String str = "ababccdef";
String tmp = "abc";
boolean flg = str.contains(tmp);
System.out.println(flg);
System.out.println("===================");
//indexof作用是找到主串str中子串tmp的位置,并返回字串
int index = str.indexOf(tmp);
int index2 = str.indexOf(tmp,3);//从3位置开始找
System.out.println(index);
System.out.println(str.lastIndexOf(tmp,5));//从后往前找
//判断str是否是以c为开头的,4表示偏移量
System.out.println(str.startsWith("c",4));
//表示是否以f为结尾
System.out.println(str.endsWith("f"));
}
2.3字符串替换
2.4字符串拆分
2.5字符串截取
2.6去除左右边的空格
2.7字符串转大写
如果转小写则使用toLowercase( )
2.8字符串拼接
3.StringBuffer 和 StringBuilder
在String类中有些我们想使用但没有的方法,我们就可以使用StringBuffer 和 StringBuilder
3.1StringBuilder的使用
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("abcdef");
//append就是把abcdef放到StringBuilder里面
//sb.append("abcdef");
//StringBuilder每次返回的都是当前的对象,不是新的对象
System.out.println(sb.toString());
}
3.2字符串的拼接
如果我们在一个循环里面有字符串拼接,并且我们不想产生更多的对象,我们就可以使用StringBuilder中的append方法:
3.3字符串的逆置
小结:如果我们面试被问到String、StringBuffer、StringBuilder的区别
String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
StringBuffer与StringBuilder大部分功能是相似的
StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作