目录
1.String概述
1、String描述:
1、java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串。
2、java程序中所有的字符文字(列如:"abc")都为此类对象。
String name="小黑"; String schoolName="黑马";
2、String类的特点详解:
1、String其实常被称为不可变字符串类型,它的对象在创建后不能被更改。
3、字符串对象存在哪里?
1、以""方式给出字符串对象,在字符串常量池中存储。
String name="传智";
name +="教育";
name +="中心";
System.out.println(name); //传智教育中心
4、String是什么,可以做什么:
- 字符串类型,可以定义字符串变量指向字符串对象。
5、String是不可变字符串的原因:
- String变量每次的修改其实都是在产生并指向了新的字符串对象。
- 原来的字符串对象都是没有改变的,所以称不可变字符串。
2、String类创建对象的2种方式:
1、直接使用" "定义。(推荐使用)
String name = "传智教育";
2、通过String类的构造器创建对象
构造器: 说明:
public String() 创建一个空白字符串对象,不含任何内容。
public String(String original) 创建传入的字符串内容,来创建字符串对象。
public String(char[ ] chs) 根据字符数组的内容,来创建字符串对象。
public String(byte[ ] chs) 根据字节数组的内容,来创建字符串对象。
//方式一:直接使用双引号得到字符串对象: String name = "我爱你中国"; System.out.println(name); //我爱你中国 //方式二: //1.public String():创建一个空白字符串对象,不含任何内容(几乎不用) String s1 = new String(); //s1=""; System.out.println(s1); //输出啥都没有 //2.public String(String):根据传入的字符串内容,来创建字符串对象(几乎不用) String s2 = new String("我是中国人"); System.out.println(s2); //我是中国人 //3.public String(char[] c):根据字符数组的内容,来创建字符串对象 char[] chars = {'a', 'b', '中', '国'}; String s3 = new String(chars); System.out.println(s3); //ab中国 //4、public String(byte[] b):根据字节数组的内容,来创建字符串对象 byte[] bytes = {97, 98, 99, 65, 66, 67}; String s4 = new String(bytes); System.out.println(s4); //abcABC
3、构造器创建字符串和" "创建字符串区别(面试常考):
- 以" "方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份。
- 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中。
String s1="abc";
String s2="abc";
System.out.println(s1==s2); //true
char[] chs={'a','b','c'};
String s3 = new String(chs);
String s4=new String(chs);
System.out.println(s3==s4); //false
4、字符串对象的特点有那些:
- 双引号创建的字符串对象,在字符串常量池中存储同一个。
- 通过new构造器创建字符串对象,在堆内存中分开存储。
3、String类的常见面试题:
1、String常见面试题:
问题:下列代码运行的结果是?
public class Test1 { public static void main(String[] args) { //创建两个对象,先创建常量池里的abc,再创建堆内存中的abc,指向堆内存的abc String s2=new String("abc"); String s1="abc"; //不创建对象,指向的是s2创建常量池中的abc System.out.println(s1==s2); //flase 地址不一致 } }
public class Test2 { public static void main(String[] args) { String s1 = "abc"; //在常量池中创建abc String s2 = "ab"; //在常量池中创建ab String s3 = s2 + "c"; //在堆内存中链接abc System.out.println(s1 == s3); //flase 地址不一致,s3地址是堆内存,s1常量池 } }
public class Test3 { public static void main(String[] args) { String s1 = "abc"; //在常量池中创建abc //Java存在编译优化机制,程序在编译时:"a"+"b"+"c"会直接转成abc String s2 = "a" + "b" + "c"; System.out.println(s1 == s2); //true } }