/* * java当中的数据类型只有两种:基本类型、引用类型。 * 基本类型8个关键字,不是这八者之一,那么剩下的全都叫引用类型, * 则字符串就是一种引用类型。 * * 注意字符串就是一个对象。 * */ public class Demo01String { public static void main(String[] args) { //动态初始化一个数组,就是创建了一个对象。数组就是一个对象。 int[] array1 = new int[5];//等号右边的为进入堆中赋予内存的 需要进行实例化的对象。 //静态化一个数组,数组{10,20,30},也同样是对象。 int[] array2 = {10,20,30}; //字符串直接写上双引号,就是一个String类型的对象!String就是类名称。 String str = "Hello"; System.out.println(str); //直接使用的字符串常量,也照样是一个字符串的对象。 System.out.println("world"); } } * 既然说字符串就是一个对象,则有两个问题: * * 1.对象肯定有一个类与之对应,那么字符串对应的类————String * * .String这个类,为什么不需要导包就能使用? * * 解释1:所有的类都需要导包才能使用,除了两种情况: * * A.要使用的目标类,和当前类位于同一个包下。 * B.要使用的目标类,位于java.lang包下。(但不包含子包) * * 2.既然字符串是对象,那么为什么可以直接打印出来。 * 打印println方法逻辑: * 1.如果是字符串类型,那么直接显示内容。 * 2.如果不是字符串类型,那么久想办法内部转换成字符串,然后再显示。 * 一般的对象都是使用“类型信息+@+地址值”作为字符串内容。 */ public class Demo02StringQuestion { public static void main(String[] args) { Stringstr = "Hello"; System.out.println(str);//hello } } 字符串对象相应的问题 * 既然说字符串就是一个对象,则有两个问题: * * 1.对象肯定有一个类与之对应,那么字符串对应的类————String * * .String这个类,为什么不需要导包就能使用? * * 解释1:所有的类都需要导包才能使用,除了两种情况: * * A.要使用的目标类,和当前类位于同一个包下。 * B.要使用的目标类,位于java.lang包下。(但不包含子包) * * 2.既然字符串是对象,那么为什么可以直接打印出来。 * 打印println方法逻辑: * 1.如果是字符串类型,那么直接显示内容。 * 2.如果不是字符串类型,那么久想办法内部转换成字符串,然后再显示。 * 一般的对象都是使用“类型信息+@+地址值”作为字符串内容。 字符串创建的常见2+1种方式(两种构造方法,一种直接赋值) * * 常见的两个构造方法: * public String(char[] array),参数是一个字符数组, * 根据字符数组的内容来创建一个字符串。 * * public String(char[] array int offset , intcount): * 根据字符数组的一部分内容老创建字符串。 * 参数 offser 代表一个数组当中的其实索引,从0开始。 * 参数count代表取用多少个字符。 字符串池 * 字符串是最为常用的对象,所以在程序当中往往会出现很多歌重复的字符串。 * 为节省内存,所以引入“字符串池”的设计,可以重复利用字符串。 * * 关于字符串池的几点描述: * 1.字符串池是位于堆(head)内存当中的一小块空间,用来保存若干字符串的地址值。 * 2.字符串池当中绝对不能出现重复的字符串对应的地址,保证字符串不重复。 * 3.凡是直接双引号的字符串默认都在池中,而new出来的字符串默认不在池中。 * * 对于基本类型来说,==是进行数据内容的比较, * 但对于引用类型来说,==是进行地址值的相同比较。 * 如果是两个对象,那么地址值必然不同,如果地址值相同,那么必然是同一个对象。 */ public class Demo04StringPool { public static void main(String[] args) { Stringstr1 = "Hello"; Stringstr2 = "Hello"; System.out.println(str1==str2);/*true 由于是直接“=”号赋值, 字符串的地址值存放于字符串池中,字符串池为了节省内存,省 去相同的字符串地址值,对原有的字符串地址值进行多次利用。*/ char[] array = {'H','e','l','l','o'}; Stringstr3 = new String(array); Stringstr4 = new String(array); System.out.println(str3==str4);//false. System.out.println(str1==str3);//false.
} 图解:
字符串内容创建后不改变 package cn.itcase.day07.demo01; /* * 字符串对象在内存当中一旦被创建,则内容不可改变。 */ public class Demo05StringEnternal { public static void main(String[] args) { Stringstr = "Hello"; System.out.println(str);//输出Hello。 str = "World"; System.out.println(str);//输出World。 /* * 1."Hello"字符串与其地址值没有发生改变。 * 2."World"先创建的常量与地址值进入字符串池 * 又重新赋了一个地址值给str。 */ }
}
|