大数据必学Java基础(五十):String类和StringBuilder类的讲解
String类和StringBuilder类的讲解
一、String类
【1】直接使用,无需导包:
【2】形象说一下字符串:
【3】 "abc"就是String类下的一个具体的对象
String str = “abc”;
【4】字符串是不可变的
【5】这个String类不可以被继承,不能有子类
【6】String底层是一个char类型的数组
验证:
1、常用方法
【1】构造器:底层就是给对象底层的value数组进行赋值操作。
//通过构造器来创建对象:
String s1 = new String();
String s2 = new String("abc");
String s3 = new String(new char[]{'a','b','c'});
【3】常用方法
String s4 = "abc";
System.out.println("字符串的长度为:"+s4.length());
String s5 = new SZtring("abc");
System.out.println("字符串是否为空:"+s5.isEmpty());
System.out.println("获取字符串的下标对应的字符为:"+s5.charAt(1));
【4】equals
String s6 = new String("abc");
String s7 = new String("abc");
System.out.println(s6.equals(s7));
【5】String类实现了Comparable,里面有一个抽象方法叫compareTo,所以String中一定要对这个方法进行重写:4
String s8 = new String("abc");
String s9 = new String("abc");
System.out.println(s8.compareTo(s9));
【6】常用方法:
//字符串的截取:
String s10 = "abcdefhijk";
System.out.println(s10.substring(3));
System.out.println(s10.substring(3, 6));//[3,6)
//字符串的合并/拼接操作:
System.out.println(s10.concat("pppp"));
//字符串中的字符的替换:
String s11 = "abcdeahija";
System.out.println(s11.replace('a', 'u'));
//按照指定的字符串进行分裂为数组的形式:
String s12 = "a-b-c-d-e-f";
String[] strs = s12.split("-");
System.out.println(Arrays.toString(strs));
//转大小写的方法:
String s13 = "abc";
System.out.println(s13.toUpperCase());
System.out.println(s13.toUpperCase().toLowerC
//去除收尾空格:
String s14 = " a b c ";
System.out.println(s14.trim());
//toString()
String s15 = "abc";
System.out.println(s15.toStr
//转换为String类型:
System.out.println(String.valueOf(false));
2、String的内存分析
【1】字符串拼接:
public class Test02 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
String s1 = "a"+"b"+"c";
String s2 = "ab"+"c";
String s3 = "a"+"bc";
String s4 = "abc";
String s5 = "abc"+"";
}
}
上面的字符串,会进行编译器优化,直接合并成为完整的字符串,我们可以反编译验证:
然后在常量池中,常量池的特点是第一次如果没有这个字符串,就放进去,如果有这个字符串,就直接从常量池中取:
内存:
【2】new关键字创建对象:
String s6 = new String("abc");
内存:开辟两个空间(1.字符串常量池中的字符串 2.堆中的开辟的空间)
【3】有变量参与的字符串拼接:
public class Test03 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
String a = "abc";
String b = a + "def";
System.out.println(b);
}
}
a变量在编译的时候不知道a是“abc”字符串,所以不会进行编译期优化,不会直接合并为“abcdef”
反汇编过程:为了更好的帮我分析字节码文件是如何进行解析的:
利用IDEA中的控制台:
二、StringBuilder类
【1】字符串的分类
(1)不可变字符串:String
(2)可变字符串:StringBuilder,StringBuffer
疑问:
(1)可变不可变??
(2)本节课重点:StringBuilder -----》√
(3)StringBuilder和StringBuffer区别 ??
【2】StringBuilder底层
非常重要的两个属性:
【3】对应内存分析:
package com.lanson.test05;
/**
* @Auther: lanson
*/
public class Test01 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//创建StringBuilder的对象:
StringBuilder sb3 = new StringBuilder();
//表面上调用StringBuilder的空构造器,实际底层是对value数组进行初始化,长度为16
StringBuilder sb2 = new StringBuilder(3);
//表面上调用StringBuilder的有参构造器,传入一个int类型的数,实际底层就是对value数组进行初始化,长度为你传入的数字
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb.append("def").append("aaaaaaaa").append("bbb").append("ooooooo").toString());;//链式调用方式:return this
}
}
1、解释可变和不可变字符串
【1】String---》不可变
【2】StringBuilder---》可变
可变,在StringBuilder这个对象的地址不变的情况下,想把“abc”变成“abcdef”是可能的,直接追加即可
public class Test02 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println(sb.append("abc")==sb.append("def"));//true
}
}
2、常用方法
【1】StringBuilder常用方法:
package com.lanson.test05;
/**
* @Auther: lanson
*/
public class Test03 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
StringBuilder sb=new StringBuilder("nihaojavawodeshijie");
//增
sb.append("这是梦想");
System.out.println(sb);//nihaojavawodeshijie这是梦想
//删
sb.delete(3, 6);//删除位置在[3,6)上的字符
System.out.println(sb);//nihavawodeshijie这是梦想
sb.deleteCharAt(16);//删除位置在16上的字符
System.out.println(sb);//nihavawodeshijie是梦想
//改-->插入
StringBuilder sb1=new StringBuilder("$23445980947");
sb1.insert(3, ",");//在下标为3的位置上插入 ,
System.out.println(sb1);
StringBuilder sb2=new StringBuilder("$2你好吗5980947");
//改-->替换
sb2.replace(3, 5, "我好累");//在下标[3,5)位置上插入字符串
System.out.println(sb2);
sb.setCharAt(3, '!');
System.out.println(sb);
//查
StringBuilder sb3=new StringBuilder("asdfa");
for (int i = 0; i < sb3.length(); i++) {
System.out.print(sb3.charAt(i)+"\t");
}
System.out.println();
//截取
String str=sb3.substring(2,4);//截取[2,4)返回的是一个新的String,对StringBuilder没有影响
System.out.println(str);
System.out.println(sb3);
}
}
【2】StringBuffer常用方法:
package com.lanson.test05;
/**
* @Auther: lanson
*/
public class Test03 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
StringBuffer sb=new StringBuffer("nihaojavawodeshijie");
//增
sb.append("这是梦想");
System.out.println(sb);//nihaojavawodeshijie这是梦想
//删
sb.delete(3, 6);//删除位置在[3,6)上的字符
System.out.println(sb);//nihavawodeshijie这是梦想
sb.deleteCharAt(16);//删除位置在16上的字符
System.out.println(sb);//nihavawodeshijie是梦想
//改-->插入
StringBuilder sb1=new StringBuilder("$23445980947");
sb1.insert(3, ",");//在下标为3的位置上插入 ,
System.out.println(sb1);
StringBuilder sb2=new StringBuilder("$2你好吗5980947");
//改-->替换
sb2.replace(3, 5, "我好累");//在下标[3,5)位置上插入字符串
System.out.println(sb2);
sb.setCharAt(3, '!');
System.out.println(sb);
//查
StringBuilder sb3=new StringBuilder("asdfa");
for (int i = 0; i < sb3.length(); i++) {
System.out.print(sb3.charAt(i)+"\t");
}
System.out.println();
//截取
String str=sb3.substring(2,4);//截取[2,4)返回的是一个新的String,对StringBuilder没有影响
System.out.println(str);
System.out.println(sb3);
}
}
三、String,StringBuilder,StringBuffer区别和联系
- String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。
- StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String
- JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder
StringBuilder:JDK1.5开始 效率高 线程不安全
StringBuffer:JDK1.0开始 效率低 线程安全
- 点赞
- 收藏
- 关注作者
评论(0)