Java_String&StringBuilder&StringBuffer类

时间:2021-03-15 18:26:03

一、String类

String为引用数据类型,final的,不可被继承。不可变的Unicode字符序列。本质上为char 字符数组

  • 字符串方法
方法 含义
int length() 获取字符串的长度
int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引
int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引
int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引
int compareTo(Object o) 把这个字符串和另一个对象比较
String intern() 返回字符串对象的规范化表示形式
String trim() 去除字符串前后空格
String toLowerCase() 将字符串全部转换为小写
String toUpperCase() 将字符串全部转换为大写
String substring(int index) 按索引截取字符串
String substring(int begin, int end) 指定索引范围截取字符串
String replace(char old, char new) 将新字符替换旧的字符
String[] split(String regex) 给定正则表达式的匹配拆分此字符串
boolean matches(String regex) 符串是否匹配给定的正则表达式
boolean isEmpty() 判断字符串的长度是否等于0
boolean equals(Object obj) 字符串与指定的对象比较
boolean equalsIgnoreCase(String str) 判断两字符串比较(忽略大小写)
boolean startsWith(String prefix) 字符串是否以指定的前缀开始
boolean endsWith(String suffix) 字符串是否以指定的后缀结束
char[] toCharArray() 字符串转换为一个新的字符数组
static String valueOf(type x) 将指定类型的参数转换为字符串类型
  • 字符串连接

    String str="You and ".concat("Me");

    String str="You and " + "Me" + 'I';

    // 可连接字符串或者数字及其他基本类型数据; concat只接受字符串

    还可以使用StringBuffer或StringBuilder进行连接

  • 格式化输出字符串

    printf() 和 format()

    浮点型为 %f ;整型为 %d ; 字符串为 %s

    例子:String str=String.format("%f %d %s", 1.1, 5, "aa") ;

字符串替换实例:

// 字符串替换的方法
String s = "one dog and two dogs ";
System.out.println(s.replaceFirst("dog","cat"));//第一次匹配的字符替换为指定字符串
System.out.println(s.replaceAll("one|two","three"));// 所有匹配替换为指定字符串
System.out.println(s.replace("do","pi"));// 将目标字符串替换为指定字符串
System.out.println(s.replace('a','A'));// 将旧字符 a 替换为新字符 A

二、"==" 和 “equals”的区别

首先 == 是用来比较两个变量所指向的内存地址是否相同,可以用来两个基本类型的数据或两个引用变量是否相等。

在Object类中: equals方法的实现是 return this==obj , 也就是说equals与 == 是一样的,比较的都是两个对象所指向的内存地址是否相同。但是在String类中重写了父类Obejct中的equls方法,比较的是两个对象的内容是否相同。例子:

 // final String s = "ab";
String s = "ab"; // 栈中存放变量 s , String池中存放常量"ab", 变量s指定常量 "ab";
String a = "abc"; // 在栈中开辟空间存放变量 a,String池中开辟空间存放"abc",变量a指向String中的常量"abc";
String b = "ab" + "c"; // 栈中存放变量 b, 通过编译器优化合并后的常量为 "abc";
String c = "ab".concat("c"); // 如果传入的参数长度为大于0, 则返回一个new String(buf, true)对象,存放在堆中;
String d = s + "c";// 栈中存放变量d , String池中存放常量"c", 运行后才能确定变量d的值(对象),存放在堆中。
// (通过StringBuilder的toString方法返回一个新的对象"adc"), 变量d 指向这个新的对象。 System.out.println(a==b); // true
System.out.println(a==c); // false
System.out.println(a==d); // false 如果变量s 被定义为final对象,则 a==d 结果为 true
System.out.println(b==c); // false
System.out.println(b==d); // false 如果变量s 被定义为final对象,则 b==d 结果为 true
System.out.println(c==d); // false // a,b,c d 三个变量,也就是对象的内容都是"abc",所以都返回true
System.out.println(a.equals(b)); // true
System.out.println(a.equals(c)); // true
System.out.println(a.equals(d)); // true
System.out.println(b.equals(c)); // true

三、StringBuffer和StringBuilder

StringBuffer和StringBuilder:每个字符串缓冲区都有一定的容量(初始容量为 16 个字符)。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。

从源码来看StringBuffer和StringBuilder都是继承抽象类AbstractStringBuilder,调用了父类的方法。StringBuffer调用的父类方法都有修饰符synchronized。

StringBuffer 允许并发操作,线程安全

StringBuilder 不支持并发操作,非线程安全;但速度更优

StringBuffer 类的常用方法:

方法 含义
append(String s) 追加指定的字符串
reverse() 反转字符串
delete(int start, int end) 删除指定index范围的字符,不包含end
insert(int offset, String str) 从指定位置插入字符串
replace(int start, int end, String str) 替换指定范围的字符串
int capacity() 返回容量大小
int length() 返回长度(字符数)
void setLength(int newLen) 设置字符序列的长度
indexOf()/ substring() 与String类一致

实例:

字符串翻转

  • 方法一
  // 使用StringBuffer中自带的reverse方法(调用父类的reverse)
String s = "1234";
StringBuffer sb = new StringBuffer(s);
System.out.println(sb.reverse()); // "4321"
  • 方法二
 // 使用for循环字符追加的方式
String s = "1234",t="";
for(int i=s.length()-1; i>=0 ;i--){
t += s.charAt(i);
}
System.out.println(t); // "4321"

统计字符串中每个字符的个数

  • 方法一
// 使用StringBuilder去重,for遍历统计
String s = "hello word test is";
StringBuilder sb = new StringBuilder();
for(int i=0;i<s.length();i++){
String ss = String.valueOf(s.charAt(i));
if (sb.indexOf(ss)== -1) { //去重
sb.append(ss);
int t=0;
for(int j=0; j<s.length();j++){
if(s.charAt(j)==ss.charAt(0)){
t++;
}
}
System.out.println(ss+":"+t+"个");
}
}
  • 方法二
// 对字符串重新排序,利用索引位置差进行统计
String s = "hello word test is";
char [] chars = s.toCharArray();
Arrays.sort(chars);
String ns = new String(chars); // 排序后的新字符串 deehilloorssttw
for(int i=0;i<s.length();){
String ss = String.valueOf(ns.charAt(i));
int index = ns.lastIndexOf(ss); // 字符最后的索引位置
System.out.println(ss+": "+(index+1-i)+"个");
i=index+1; //下一个字符的索引位置
}
  • 方法三
// 将重复的字符去除,利用字符串的长度统计
String s = "hello word test is";
while(s.length()>0){
String ss = String.valueOf(s.charAt(0));
String ns = s.replaceAll(ss,"");
int t = s.length() - ns.length();
s = ns;
System.out.println(ss + ": " + t + "个");
}
  • 方法四
// 利用Map的key不能重复,进行统计
String s = "hello word test is";
Map<Character, Integer> hm = new HashMap<Character, Integer>();
for(int i=0; i<s.length();i++){
char c = s.charAt(i);
if(hm.containsKey(c)){
hm.put(c,hm.get(c)+1);
}else{
hm.put(c,1);
}
}
for(Entry<Character, Integer> e: hm.entrySet()){
System.out.println(e.getKey()+": "+e.getValue()+ "个");
}