





package com.atguigu.java1;import org.junit.Test;/*** String的使用** @author Dxkstart* @create 2021-05-08 19:01*/public class StringTest1 {/*String:字符串,使用一对“”引起来表示、1.String声明为final的,不可被继承2.String实现了Serializable接口:表示字符串是支持序列化的。3.String内部定义了final char[] value用于存储字符串数据4.String:代表不可变的字符序列。简称:不可变性。体现:1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。5.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。6.字符串常量池中是不会存储相同内容的字符串的。*/@Testpublic void test1() {String s1 = "abc";//字面量的定义方式String s2 = "abc";// s1 = "hello";System.out.println(s1 == s2);//比较s1和s2的地址值System.out.println(s1);System.out.println(s2);System.out.println("*************************");String s3 = "abc";System.out.println(s1 == s3);s3 += "def";System.out.println(s3);//abcdef}/*String实例化方式:方式一:通过字面量定义的方式 -->方法区方式二:通过new + 构造器的方式 -->堆空间*/@Testpublic void test2() {//通过字面量定义的方式:此时的s1和s2的数据声明在方法区中的字符串常量池中。String s1 = "JavaEE";String s2 = "JavaEE";//通过new + 构造器的方式:// 此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。String s3 = new String("JavaEE");String s4 = new String("JavaEE");System.out.println(s1 == s2);//trueSystem.out.println(s1 == s3);//falseSystem.out.println(s1 == s4);//falseSystem.out.println(s3 == s4);//falseSystem.out.println("*********************");}/*结论:1.常量与常量的拼接结果在常量池中。且常量池中不会存在相同内容的常量。2.只要且其中有一个是变量,结果就在堆中、3.如果拼接的结果调用intern()方法,返回值就在常量池中*/@Testpublic void test3(){String s1 = "javaEE";String s2 = "hadoop";String s3 = "javaEEhadoop";String s4 = "javaEE" + "hadoop";String s5 = s1 + "hadoop";String s6 = "javaEE" + s2;String s7 = s1 + s2;System.out.println(s3 == s4);//trueSystem.out.println(s3 == s5);//falseSystem.out.println(s3 == s6);//falseSystem.out.println(s5 == s6);//falseSystem.out.println(s5 == s7);//falseSystem.out.println(s6 == s7);//falseString s8 = s5.intern();//返回得到的s8使用的常量值中已经存在的“javaEEhadoop”System.out.println(s3 == s8);//true}}
一道面试题:
解决口:值传递机制(引用型数据类型、基本数据类型
package com.atguigu.exercise1;/*** 一道面试题** @author Dxkstart* @create 2021-05-09 10:20*/public class StringTest {String str = new String("good");char[] ch = {'t','e','s','t'};public void change(String str,char ch[]){str = "test ok";ch[0] = 'b';}public static void main(String[] args){StringTest ex = new StringTest();ex.change(ex.str,ex.ch);System.out.println(ex.str);//goodSystem.out.println(ex.ch);//best}}
