Java自学笔记—String类
构造器
String a = "abc";
String对象a直接指向常量池而不会在堆中创建对象
String x = new String("abc");
先在堆中创建对象,再指向常量池
/**
* @author Lspero
* @version 1.0
*/
public class String02 {
public static void main(String[] args) {
String a = "abc";//a->常量池"abc"
String b = "abc";//b->常量池"abc",同一个地址
System.out.println(a.equals(b));//t
System.out.println(a == b);//t
String x = new String("abc");//x->堆中对象->常量池"abc"
String y = new String("abc");//y->堆中对象->常量池"abc",两个堆的地址不一样
System.out.println(x.equals(y));//t
System.out.println(x == y);//f
//String的intern()方法返回该字符串在常量池中所对应的对象(地址)
System.out.println(a == x.intern());//t
System.out.println(x == x.intern());//f
}
}
对象创建细节
package com.hz.String_;
/**
* @author Lspero
* @version 1.0
*/
public class StringExercise01 {
public static void main(String[] args) {
//在常量池创建两个对象
String s = "hello";
s = "abc";
//编译器会自动优化,等价与String a = "helloabc",只创建了一个对象
String a = "abc" + "def";
String x = "hello";
String y = "adc";
//常量相加看池,变量看堆
/*追源码
1.先创建一个StringBuilder sb = StringBuiler();
2.执行 sb.append("hello")
3.执行 sb.append("abc")
4. 再sb的ToString方法,返回"helloabc"对象给xy,返回一个value数组,ToString是new一个对象
最后xy指向堆中对象(String) value[] = "helloabc"
*/
String xy = x + y;
String xy0 = "helloabc";
System.out.println(xy == xy0);//flase,xy指向堆,xy0指向常量池
}
}
题目
求以下输出
/**
* @author Lspero
* @version 1.0
*/
public class StringTest01 {
//字符串放在常量池中,堆中对象的str属性->String的属性,堆中的value[]->常量池"lspero"
String str = new String("lspero");
//字符数组在堆中,堆中对象的ch属性->堆中"java"
final char[] ch= {'j', 'a', 'v', 'a'};
public void change(String str, char ch[]){
str = "java";
ch[0] = 'l';
}
public static void main(String[] args) {
StringTest01 ex = new StringTest01();
ex.change(ex.str, ex.ch);
//结果 lspero and lava
System.out.print(ex.str+" and ");
System.out.println(ex.ch);
}
}
内存图如下
String常用方法
equals //区分大小写,判断内容是否相等
equalsIgnoreCase //忽略大小写,判断内容是否相等
length //获取字符的个数即字符串的长度
indexOf //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,则返回-1
substring(a, b) //截取指定范围的子串,左闭右开
trim //去前后空格
charAt //获取索引处的字符,注意不能使用Str[index]这种方式,String为一个对象,value是其中一个属性
toUpperCase //转大写
toLowerCase //转小写
concat //拼接字符串
replace //替换字符串中的字符,原来字符串不变,返回新串
split //分割字符串,对于某些分割字符,我们需要转义比如|和\\等,如'\|'代表|
compareTo //比较两个字符串的大小,长度相同则返回不同依次字母之间的差值,不同返回长度差值
toCharAiray //转化成字符数组
format //格式字符串,%s字符串 %c字符 %d整型 %.2f浮点型
总结
String a = "abc";String
对象a直接指向常量池而不会在堆中创建对象String x = new String("abc");
先在堆中创建对象,再指向常量池- String常量相加看池,变量看堆
String a = "abc" + "def"; //编译器会自动优化,等价与String a = "helloabc",只创建了一个对象
String xy = x + y; //利用StringBuilder
- String的value属性指向常量池,char[ ]指向堆