1.String类的基本概念
1.String表示字符串类型,属于引用数据类型,不属于基本数据类型。
2.在java中随便使用双引号括起来 的都是String对象。
例如:“abc”,“def”,“hello world!”,这是3个String对象。
3.java中规定,双引号括起来的字符串是不可变的。
4.在JDK当中双引号括起来的字符串,例如:“abc” "bbb"都是直接存储在“字符串常量池”当中的。
5、为什么SUN公司把字符串存储在一个“字符串常量池”当中呢?
因为字符串在实际的开发中使用太频繁。为了执行效率,所以把字符串放到了方法区的字符串常量池当中。
String类创建对象
public class StringDemo1 {
public static void main(String[] args) {
//1.使用直接赋值的方式获取一个字符串对象
String s1 = "aaa";
System.out.println(s1);
//2.使用new的方式获取一个字符串对象
//空参构造,可以获取一个空白的字符串对象
String s2 = new String();
System.out.println("@"+s2+"!");//@!,s2="";
//传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
String s3 = new String("bbb");
System.out.println(s3);
//传递一个字符串数组,根据字符数组的内容再创建一个新的字符串对象
char[] chs ={'a','b','c','d','e','f'};
String s4 = new String(chs);
System.out.println(chs);//abcdef
System.out.println(s4);//abcdef
//System.out.println(s4==chs);//Operator '==' cannot be applied to "java.lang.String", 'char门]'
// 运算符‘==’不能应用于“java.lang.String”,‘char门]’
System.out.println(s4.equals(chs));//false,String的equals比较的是:
//先判断地址是否相等,再判断是否是String类型,是的话进行字符比较,都一样则返回true,否则false
//对象或变量名.getclass().toString(),打印该对象或变量的数据类型
System.out.println(s4.getClass().toString());//class java.lang.String
System.out.println(chs.getClass().toString());//class [C
//System.identityHashCode(对象变量),直接打印出该对象的真实地址
System.out.println(System.identityHashCode(s4));//1163157884
System.out.println(System.identityHashCode(chs));//1956725890
//传递一个字接数组,根据字节数组的内容再创建一个新的字符串对象
//应用场景:网络当中传输的数据都是字节信息,通过ASCII码转换成字符:48->0,65->A,97->a
byte[] bytes = {97,98,99,100};
String s5 = new String(bytes);
System.out.println(s5);//abcd
}
}
2.Java的内存模型
当使用双引号" "直接赋值时,系统会检查该字符串在串池中是否存在。如果存在则会直接复用,否则就会创建一个新的字符串。
只要是new出来的对象,都会在堆内存的串池中开辟一块新的内存空间来存放字符串
3.字符串比较
public class StringDemo2 {
public static void main(String[] args) {
//字符串的比较
//1.==号比较:
// 基本数据类型:比的是数据值
// 引用数据类型:比的是地址值
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2);//false
//比较字符串对象中的内容是否相等:equals()
System.out.println(s1.equals(s2));//true
//比较字符串对象中的内容是否相等,忽略大小写:equalsIgnoreCase()
String s3 = "ABC";
System.out.println(s2.equalsIgnoreCase(s3));//true
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串abc:");
String s4 = sc.next();//abc new出来的
String s5 = "abc";
System.out.println(s4==s5);//false
System.out.println(s4.equals(s5));//true
//结论:只要是比较字符串的内容,就必须要用String里面的方法
}
}
字符串拼接的底层原理:
1.如果没有变量参与,都是字符串相加,编译之后就是拼接之后的结果,会复用堆内存串池中的字符串。
2.如果有变量参与,则会创建新的字符串,浪费内存。
4.StringBuilder类的使用
StringBuilder是一个可变的操作字符串的容器,创建之后里面的内容是可变的,可以提高字符串的操作效率,常用于字符串的拼接和反转。所有要拼接的内容全部放进StringBuilder容器中,不会创建很多无用的空间,浪费内存。
public class StringBuilderDemo1 {
public static void main(String[] args) {
//1.空参构造
StringBuilder sb = new StringBuilder();
System.out.println(sb);//应为StringBuilder是Java已经写好的类,在底层做了特殊处理,打印对象不是地址值而是属性值
StringBuilder sb1 = new StringBuilder("555");
System.out.println(sb1);//555
sb.append(2.2);//添加元素
sb.append('A');
sb.append("ABC");
sb.append(555);
sb.append(123);
sb.append(true);
System.out.println(sb);//2.2AABC555123true
System.out.println(sb.getClass().toString());//数据类型:class java.lang.StringBuilder
System.out.println(System.identityHashCode(sb));//地址值:1163157884
System.out.println(sb.reverse());//字符串反转
System.out.println(sb.length());//获取字符串长度
System.out.println(sb.toString());//变回字符串
System.out.println(sb.substring(5));//字符串截取:从第五位开始后面的全部截取
System.out.println(sb.substring(0,3));//字符串截取:从第0位开始到第3位中间全部截取包括第0位不包括第3位
}
}
运行结果
StringBuilder练习1
用户输入一个字符串判断是否为对称字符串,例如:123321对称,12345不对称。
public class StringBuilderTest1 {
public static void main(String[] args) {
//1.输入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//2.反转输入的字符串
String reslut = new StringBuilder(str).reverse().toString();
//3.比较
if (str.equals(reslut)){
System.out.println(str+"是对称字符串");
}else {
System.out.println(str+"不是对称字符串");
}
}
}
运行结果
StringBuilder练习2
把int数组按指定格式拼接成字符串——int[] arr = {1,2,3}->[1,2,3]
public class StringBuilderTest2 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
int[] arr = {1,2,3,4,5,6,7,8,9};
sb.append("[");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
if(i<arr.length-1){
sb.append(",");
}
}
sb.append("]");
System.out.println(sb.toString());
}
}
运行结果
StringBuilder底层原理
默认创建一个长度为16的字节数组,如果添加的内容长度小于16则直接存,如果添加的内容长度大于16则会扩容(扩大位原来容量的*2+2),如果扩容之后的容量还不够则以实际长度为准。
5.StringJoiner的使用
StringJoiner构造JDK8新增的一个可变的操作字符串的容器,可以高效方便的拼接字符串
StringJoiner练习1
把int数组按指定格式拼接成字符串——int[] arr = {1,2,3}->[1,2,3]
public class StringJoinerDemo1 {
public static void main(String[] args) {
//1.创建一个对象,指定中间的间隔符号delimiter,开始的标记prefix,结束的标记suffix
StringJoiner sj = new StringJoiner(",","[","]");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
//3.打印结果
System.out.println(sj);//[aaa,bbb,ccc]
System.out.println(sj.length());//13
System.out.println(sj.toString());//[aaa,bbb,ccc]
}
}
运行结果