String类:表示一个字符串,是引用数据类型
1.字符串存储格式:字符串用final修饰的char类型数组进行存储的
2.String的不可变性:字符串一旦初始化不可更改,但是可以通过在字符串常量池中重写创建一个字符串,改变引用的指向,进而改变字符串的值
3.String字符串的初始化
(1)直接赋值
(2)通过构造方法初始化
a.public Sting(String str);
b.public String(char[] c);
4.字符串的比较
"==":比较引用数据类型时,比较的是地址
直接赋值是指向字符串常量池(也在堆中),构造方法初始化的指向堆的
equals()方法:在字符串中,使用equals方法比较字符串内容
注:
(1)equals是超类Object中的方法,实质上使用"=="比较对象地址,但是String重写了该方法
(2)字符串的比较尽量不用"==",都是用equals
5.字符串常量拼接问题
1.字符串常量+字符串常量:在常量池中开辟空间
2.如果有字符串变量参与拼接:在堆中开辟空间
6.字符串的常用方法:
(1)equals:用于比较字符串内容
(2)equalsIgnoreCase:忽略大小写比较。ABC123 abc123
(3)startWith
(4)length();返回字符串的长度
(5)charAt();
indexOf(String str)
subString():
(7)toCharArray()
(8)trim
(10)replace
(11)split
public class StringDemo {
public static void main(String[] args) {
String str="hello";//{'h','e','l','l','o'}
str+="world";
String str2="Java";
String str3="Java";
//2.通过构造方法初定义一个字符串
String str4=new String("helloWorld");
System.out.println(str4);
char[] c={'字','符','串'};
String str5=new String(c);
System.out.println(str5);//"字符串"
//字符串的比较
String str6="happy";
String str7="happy";
String str8=new String("happy");
//字符串拼接问题
String str9="helloWorld";//在常量池中开辟空间
String str10="hello"+"World";//先拼接成helloWorld.常量+常量 在常量池中
System.out.println(str6==str7);//true str6和str7指向的同一个空间,说明地址相同
System.out.println(str7==str8);//false str7指向的是字符串常量池的空间,str8指向的是堆中的空间
System.out.println(str7.equals(str8));//true 看内容不看地址
}
}
StringBuffer:
用于对字符串进行存储和操作,可以声明可变字符串,可以用于对字符串频繁的操作
1.StringBuffer的定义
new StringBuffer(String str);
2.常用方法
(1)append(String str)方法:用于字符串的拼接
(2)toString():将字符串转换成String类型
(3)setCharAt(int index,char c);设置指定下标的字符
(4)replace(int start,int end,String str);替换指定下标范围的字符串
(5)reverse();将字符串反转
3.StringBuffer 的比较,转换成String类型来进行比较
4.StringBuffer和StringBuilder的区别:StringBuffer是线程安全的,效率低;因为是用synchronized修饰的
StringBuild线程不安全,效率高
StringBuffer
public class StringBufferDemo {
public static void main(String[] args) {
String str="hello";
StringBuffer buffer = new StringBuffer(str);
//append()方法
buffer.append("World").append("Java").append("Happy");
//toString();方法
String str2=buffer.toString();
//setCharAt(int index,char c);
buffer.setCharAt(0,'H');
System.out.println(buffer);
//replace();
System.out.println(buffer.replace(0, 5, "Happy"));
//reverse();
System.out.println(buffer.reverse());//yppaHavaJdlroWyppaH
//StringBuffer 的比较,转换成String类型来进行比较
StringBuffer buffer1=new StringBuffer("hello");
StringBuffer buffer2=new StringBuffer("hello");
System.out.println(buffer1 == buffer2);//false
System.out.println(buffer1.equals(buffer2));//false
System.out.println(buffer1.toString().equals(buffer2.toString()));//True
//StringBuffer 和 StringBuilder
StringBuilder builder=new StringBuilder("hello");
}
}
字符串String方法
public class StringMethods {
public static void main(String[] args) {
String str="helloWorldhello";//{'h','e','l','l','o','W',''}
//判断字符是否以某子字符串开头
boolean type=str.startsWith("hello");
System.out.println(type);
//length();返回字符串的长度,实质上返回的是存储字符的字符数组的长度
System.out.println(str.length());
//(5)charAt(int index);返回指定下标的字符
System.out.println(str.charAt(1));
//indexOf(String str):返回指定字符串在字符串第一次出现的下标
System.out.println(str.indexOf("hello"));
//lastIndexOf(String str):返回字符串最后一次在字符串中出现的下标
System.out.println(str.lastIndexOf("hello"));
//subString():截取指定下标范围内的字符串
System.out.println(str.substring(5, 10));//截取范围[5,10)
System.out.println(str.substring(1));//截取范围[1,正无穷)
//toCharArray():把字符串转换成字符数组
char[] arr=str.toCharArray();
System.out.println(Arrays.toString(arr));
System.out.println(arr);
//trim:去除字符串首尾空白
String str2=" 1 2 3 ";
System.out.println(str2.trim());
//replace
System.out.println(str2.replace(" ", ""));
//split():把字符串以指定的字符进行分割
String str3="1,2,3,4,5";
String[] strArray=str3.split(",");
System.out.println(Arrays.toString(strArray));
}
}
String和StringBuffer的区别
简单地说,就是一个变量和常量的关系.StringBuffer对象的内容可以修改;而字符串对象一旦产生后就不可以被修改,重新赋值其实是两个对象
StringBuffer的内部实现方式和字符串不同,StringBuffer的在进行字符串处理时,不生成新的对象,在内存使用上要优于串类。
所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入,删除等操作,使用StringBuffer要更加适合一些。