1) String 对象用于保存字符串,也就是一组字符序列
2)字符串常量对象是用双引号括起的字符序列。例如:"你好"、"12.97"、"boy"等
3)字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
4)String类较常用构造方法:
5)String类实现了接口Serializable 【String可以串行化:可以在网络传播】
6)String类实现了接口Comparable 【String对象可以比较大小】
7)String是final类,不能被其他的类继承
8)String有属性private final char value[ ] ; 用于存放字符串内容
9)一定要注意:value是一个final类型,不可以修改。即value不能指向新的地址,但是单个字符内容可以变化
String name = "jack";
name = "tom";
final char[] value = {'a','b','c'};
char[] v2 = {'t','o','m'};
value[0] = 'H';
//value = v2; 不可以修改value地址
>两种创建String对象的区别
方式一:直接赋值 String s ="hsp":
先从常量池查看是否有"hsp"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
方式二:调用构造器 String s2 = new String("hsp");
先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有"hsp”,重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
String a="hsp";//a 指向 常量池的“hsp”
String b =new String("hsp");//b 指向堆中对象
System.out.println(a.equals(b));//T
System.out.println(a==b); //F
//b.intern()方法最终返回的是常量池的地址(对象)
System.out.println(a==b.intern()); //T intern方法自己先查看API
System.out.println(b==b.intern()); //F
>字符串的特性知识点: 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object)方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用
1)String是一个final类,代表不可变的字符序列
2)字符串是不可变得。一个字符串对象一旦被分配,其内容是不可变的。
Q:String a = "hello"+"abc"; 创建了几个对象?
A:1.编译器不傻,做一个优化,判断创建的常量池对象,是否有引用指向
2.String a = "hello”+“abc”; ==>优化等价 String a = "helloabc" ; 所以只创建了一个对象
>String类的常用方法String b = "abc"; //创建b对象
String c = a+b;
Q:创建了几个对象?A:1.先创建一个StringBuilder sb = StringBuilder()
2.执行 sb.append("hello")
3.执行 sb.append("abc")
4.String c = sb.toString()
5.最后其实是c指向堆中的对象(String) value[ ] -> 池中“hellloabc”创建三个对象
6.若加上:String d = "helloabc";
System.out.println(c==d); //F重要规则:String c1 ="ab"+"cd";常量相加,看的是池。
String c1 = a+b; 变量相加,是在堆中。
public class StringMethod01 {
public static void main(String[] args){
//1.equals 区分大小写,判断内容是否相等
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equals(str2)); //F
//2.equalsIgnoreCase 忽略大小写的判断内容是否相等
String username = "john";
if("john".equalsIgnoreCase(username)){
System.out.println("Success!");
}
else {
System.out.println("Failure!");
}
//3. length 获取字符的个数,字符串的长度
System.out.println("仪宝".length());
//4.indexOf 获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1
String s1 = "yibaoa";
int index = s1.indexOf('i');
System.out.println(index);
//5.lastIndexOf 获取字符在字符串中最后1次出现的索引索引从0开始.如找不到.返回-1
String s2 = "yibaoa";
int index2 = s1.lastIndexOf('a');
System.out.println(index2);
//6.substring 截取指定范围的子串
String name = "hello,张三";
//从索引6开始截取后面所有的内容
System.out.println(name.substring(6));
//从索引0开始截取,截取到5-1=4位置 (前者为开始,包括;后者为结束,不包括)
System.out.println(name.substring(0,5));
//7.toUpperCase转换成大写
String s = "heLLo";
System.out.println(s.toUpperCase()); //HELLO
//8.toLowerCase
System.out.println(s.toLowerCase()); //hello
//9.concat拼接字符串
String s3 = "你";
s3 = s3.concat("我").concat("他").concat("together");
System.out.println(s3); //你我他together
//10.replace 替换字符串中的字符
//在s3中,将所有 你 替换成 我
//s3.replace() 方法执行后,返回的结果才是替换后的
//注意 对 s3 没有任何影响
s3 =s3.replace("你","我");
System.out.println(s3);
//11.split 分割字符串 对于某些分割字符,我们需要转义 比如 | \等
String poem = "锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。";
//以,为标准,对poem进行分割,返回一个数组
String[] split = poem.split(",");
poem = "E:\aaa\bbb";
//在对字符串进行分割时,如有特殊字符,需要加入转义符
split = poem.split("\\");
//12.toCharArray 转换成字符数组
String s4 = "happy";
char[] chs = s4.toCharArray();
for(int i =0;i



