一、String类的理解和创建对象
String实现了Serializable借口说明String可以串行化(可以在网络传输)
String实现了Comparable借口说明String对象可以比较
1.String细节
- String对象用于保存字符串,也就是一组字符序列
public class String01 {
public static void main(String[] args) {
String name = "jack";
}
}
- 字符串常量对象是用于双引号括起的字符序列。例如“你好”,“12.97”等
- 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
- String类较常用构造方法(其他看手册):
- String s1 = new String();
- String s2 = new String(String original);
- String s3 = new String(char[] a);
- String s4 = new String(char[] , int startindex,int count);
- String s5 = new String(byte[] b);
- String是个final类不能被其他类继承
- String有属性:ptivate final char value[];用于存放字符串内容;value是一个final类型,不可以修改(地址)单个字符内容可以修改
2.两种创建String对象的区别
方式1
直接赋值 String s = “jack”;
先从常量池查看是否有"jack"的数据空间, 如果有,直接指向,如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
方式2
调用构造器 String s2 = new String(“jack”);
先在堆种创建空间,里面维护了value属性,指向常量池的jack空间。如果常量池没有则重新创建,如果有则直接通过value指向。最终指向的是堆中的空间地址
二、String类的常见方法
1.equalsIgnoreCase(String str)
忽略大小写的判断内容是否相等
public class String01 {
public static void main(String[] args) {
String name1 = "jack";
String name2 = "Jack";
System.out.println(name1.equalsIgnoreCase(name2));
}
}
2.length()
返回字符串的长度
public class String01 {
public static void main(String[] args) {
String name1 = "jack";
String name2 = "Jack";
System.out.println(name1.length());
}
}
3.indexOf(String str)
获取字符在字符串对象中第一次出现的索引,索引从0开始如果找不到则返回-1
public class String01 {
public static void main(String[] args) {
String s1 = "sad@qawdas@d";
int index = s1.indexOf('@');
System.out.println(index);
}
}
4.lastIndexOf(String str)
获取字符在字符串对象中最后一次出现的索引,索引从0开始如果找不到则返回-1
public class String01 {
public static void main(String[] args) {
String s1 = "wer@sadqw@aed";
int index = s1.lastIndexOf('@');
System.out.println(index);
}
}
5.substring(int i)
表示从第i个开始索引到最后索引从0开始计算
如果是substring(int i , int n)则表示从第i个开始索引,截取到第n个 字符
public class String01 {
public static void main(String[] args) {
String name = "hello,jack";
System.out.println(name.substring(6));//从索引6开始截取后面的索引内容
System.out.println(name.substring(0,5));//从索引0开始截取5个字符
}
}
6.toUpperCase()
转换为大写
public class String01 {
public static void main(String[] args) {
String s = "hello";
System.out.println(s.toUpperCase());
}
}
7.toLowerCase()
转换为小写
public class String01 {
public static void main(String[] args) {
String s = "HELLO";
System.out.println(s.toLowerCase());
}
}
8.concat(“”)
表示拼接
public class String01 {
public static void main(String[] args) {
String s = "HELLO";
s = s.concat("12").concat("jack");
System.out.println(s);//输出HELLO12jack
}
}
9.replace(String str1,String str2)
表示替换将原先内部str1全部转换为str2
replace不接收对原先值不产生影响
public class String01 {
public static void main(String[] args) {
String s = "HELLO 222 233 44";
System.out.println(s.replace("LL","22"));//HE22O 222 233 44
}
}
10.split(“\\”)
表示按照括号内标准进行分割,如果是特殊字符则需要加入转义符" \ "
public class String01 {
public static void main(String[] args) {
String s = "E:\\aaa\\bbb";
String split[] = s.split("\\\\");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
}
}
10.toCharArray()
转换成字符数组
public class String01 {
public static void main(String[] args) {
String s = "happy";
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.println(ch[i]);
}
}
}
10.compareTo(String str)
比较字符串,1.如果两个字符串长度不同则长度相减2.如果字符串长度相同则比较第一个字符每个的第一个字符相减
public class String01 {
public static void main(String[] args) {
String a = "jchn";
String b = "jack";
System.out.println(a.compareTo(b));
}
}
11.format 格式化字符串
用来格式化,%s ,%d,%c,%.2f都是占位符
public class String01 {
public static void main(String[] args) {
String name = "jack";
int age = 10;
String info =String.format("我的名字是%s我的年龄是%d",name,age);
System.out.println(info);
}
}
三、StringBuffer
1基本介绍
- java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删
- 很多方法和String相同,但是StringBuffer是可变长度的
- StringBuffer是一个容器
StringBuffer的直接父类是AbstractStringBuilder
并且实现了java.io.Serializable, CharSequence接口表示可以串行化
在父类AbstractStringBuilder中有个char[]属性 value,不是final型
该value数组存放字符串内容 因此存放在堆中不再是常量池
StringBuffer是final类不能被继承
2.String vs StringBuffer
- String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率极低
- StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用更新地址,效率更高
3. StringBuffer的构造器
注意最后一个构造器是放入一个字符串然后char数组大小再加16
4. StringBuffer和String的转换
1.String转成StringBuffer
public class StringBuffer01 {
public static void main(String[] args) {
String str = "jack";
//方法一返回才是StringBuffer对象对str本身没有影响
StringBuffer stringBuffer = new StringBuffer(str);
//方法二 使用的是append方法
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1 = stringBuffer1.append(str);
}
}
2.StringBuffer转成String
public class StringBuffer01 {
public static void main(String[] args) {
StringBuffer stringBuffer3 = new StringBuffer("hello");
//方式一
String s1 = stringBuffer3.toString();
//方式二 使用构造器
String s2 = new String(stringBuffer3);
}
}
5. StringBuffer类的常用方法
1.增append()
public class StringBufferMethod {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello");
s.append(',');//都是在后面加
s.append("jack");
}
}
2.删delete(int start , int end)
删除的位置 >= start && < end
public class StringBufferMethod {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello");
s.delete(0,3);
//删除0-3的位置不包含3 >= start && < end
}
}
3.改replace(int start , int end , String str)
索引start到end然后替换为str
public class StringBufferMethod {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello");
s.replace(1,2,"22");//索引start到end然后替换为str
}
}
4.查indexOf(String str)
找到输入的str第一个字符出现的位置
public class StringBufferMethod {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello");
int indexOf = s.indexOf("he");
//找到输入的str第一个字符出现的位置
}
}
5.插入insert(int offset , String str)
在索引为offset的位置插入str原来索引为offset的内容自动后移
public class StringBufferMethod {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello");
s.insert(3,"ross");
//在索引为offset的位置插入str原来索引为offset的内容自动后移
}
}
三、StringBuilder
1基本介绍
方法和StringBuffer一样
没有做互斥的处理 因此在单线程的情况下使用StringBuilder