14.String相关,转换,StringBuilder,StringJoiner,String.join()

参考来自廖雪峰官方网站

https://www.liaoxuefeng.com/wiki/1252599548343744/1260469698963456

自己进行对自己理解有帮助的加工,提取,注记

1.String

String s1 = "Hello!";与String s2 = new String(new char[] {'H', 'e', 'l', 'l', 'o', '!'});等价

Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[]字段,以及没有任何修改char[]的方法实现的。

==比较地址(地址与new有关,否则从常量池找)

equals比较内容

equalsIgnoreCase()忽略大小写比较内容

注意到contains()方法的参数是CharSequence而不是String,因为CharSequence是String的父类。是否包含

toLowerCase();//变小写,联想变大写

"Hello".indexOf("l"); // 2

"Hello".lastIndexOf("l"); // 3

"Hello".startsWith("He"); // true

"Hello".endsWith("lo"); // true

"Hello".substring(2); // "llo"子串

" \tHello\r\n ".trim(); // "Hello"移除字符串首尾空白字符。空白字符包括空格,\t,\r,\n

strip()方法也可以移除字符串首尾空白字符。它和trim()不同的是,类似中文的空格字符\u3000也会被移除:

"\u3000Hello\u3000".strip(); // "Hello"

" Hello ".stripLeading(); // "Hello "

" Hello ".stripTrailing(); // " Hello"

isEmpty()和isBlank()来判断字符串是否为空和空白字符串:

"".isEmpty(); // true,因为字符串长度为0

" ".isEmpty(); // false,因为字符串长度不为0

" \n".isBlank(); // true,因为只包含空白字符

" Hello ".isBlank(); // false,因为包含非空白字符

一种是根据字符或字符串替换:

String s = "hello";

s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w'

s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替换为"~~"

通过正则表达式替换:

String s = "A,,B;C ,D";

s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D"

分割字符串

String s = "A,B,C,D";

String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}

拼接字符串

String[] arr = {"A", "B", "C"};

String s = String.join("***", arr); // "A***B***C"

格式化字符串

字符串提供了formatted()方法和format()静态方法,可以传入其他参数,替换占位符,然后生成新的字符串:

// String


public class Main {

public static void main(String[] args) {

String s = "Hi %s, your score is %d!";

System.out.println(s.formatted("Alice", 80));

System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5));

}

}

String.format有时候等价于printf

2.类型转换

占位符有:

  • %s:显示字符串;
  • %d:显示整数;
  • %x:显示十六进制整数;
  • %f:显示浮点数。

例如%.2f表示显示两位小数

任意基本类型或引用类型转换为字符串---重载方法

String.valueOf(123); // "123"

String.valueOf(45.67); // "45.67"

String.valueOf(true); // "true"

String.valueOf(new Object()); // 类似java.lang.Object@636be97c

还有+拼接也是字符串

String str=78+"hh";

字符串转换为其他类型(调用基本数据类型封装类)

int n1 = Integer.parseInt("123"); // 123

int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255

boolean b1 = Boolean.parseBoolean("true"); // true

boolean b2 = Boolean.parseBoolean("FALSE"); // false

进制转换参考:

https://blog.csdn.net/computer408/article/details/122623630

转换为char[]

String和char[]类型可以互相转换,方法是:

char[] cs = "Hello".toCharArray(); // String -> char[]

String s = new String(cs); // char[] -> String

前面还有字符串转字符串数组split

3.编码

字符串转换成其他编码

byte[] b1 = "Hello".getBytes(); // 按系统默认编码转换,不推荐

byte[] b2 = "Hello".getBytes("UTF-8"); // 按UTF-8编码转换

byte[] b2 = "Hello".getBytes("GBK"); // 按GBK编码转换

byte[] b3 = "Hello".getBytes(StandardCharsets.UTF_8); // 按UTF-8编码转换

注意:转换编码后,就不再是char类型,而是byte类型表示的数组。

如果要把已知编码的byte[]转换为String,可以这样做:

byte[] b = ...

String s1 = new String(b, "GBK"); // 按GBK转换

String s2 = new String(b, StandardCharsets.UTF_8); // 按UTF-8转换

始终牢记:Java的String和char在内存中总是以Unicode编码表示。

虽然ASCII存储更小的内存---8bit,但不是它。

小结

  • Java字符串String是不可变对象;
  • 字符串操作不改变原字符串内容,而是返回新字符串;
  • 常用的字符串操作:提取子串、查找、替换、大小写转换等;
  • Java使用Unicode编码表示String和char;
  • 转换编码就是将String和byte[]转换,需要指定编码;
  • 转换为byte[]时,始终优先考虑UTF-8编码。

4.StringBuilder,StringBuffer,StringJoiner,String.join()

str.append("Mr ")//尾部插入

.insert(index, "Hello, ");//按索引插入

省略str,称为链式操作

package test;

import java.util.StringJoiner;

/**
* @Title
* @Author Eastlin
* @Description:
*/
public class StringTest {
public static void main(String[] args) {

String[] names = {"Bob", "Alice", "Grace"};
//StringJoiner--指定“开头”和“结尾”
StringJoiner sj=new StringJoiner("*");//分隔符(前后都有字符才叫分隔符)
StringJoiner sj1=new StringJoiner(", ", "Hello ", "!");//分,前缀,后缀
for (String name : names) {
sj.add(name);
}
System.out.println(sj.toString());
for (String name : names) {
sj1.add(name);
}
System.out.println(sj1.toString());
//String.join()
String str=String.join("!", names);
System.out.println(str);

//StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("Hello ");
for (String name : names) {
sb.append(name).append("#");
}
System.out.println(sb);
// 注意去掉最后的", ":
sb.delete(sb.length() - 1, sb.length());
sb.append("!");
System.out.println(sb);
}


}

操作字符串的类有:String、StringBuffer、StringBuilder。

  String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

  StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

StringBuffer、StringBuilder方法什么的都一样

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值