1.API概述
Application Programming Interface:应用程序接口;
JAVA API:JDK中提供各种功能的Java类;
2.String
2.1概述
- JAVA程序中,所有的“”字符串,都是String的对象;
- 字符串是常量,他们的值在创建后不能更改;
String name = "张三"; //new方法没有显示,但实际存在,在堆内存中开辟了空间存放数据;
name = "李四"; //也存在new方法,但没显示,实际上在堆内存中开辟了新的空间。“张三”的值没有改变,而是name指向了新的地址;
2.1 String构造方法
方法名 | 说明 |
---|---|
public String() | 创建空白字符串对象,不含任何内容 |
public String(char[] chs) | 根据字符数组的内容,创建字符串对象 |
public String(String original) | 根据传入的字符串内容,创建字符串对象 |
String s = " … " | 直接赋值的方式创建字符串对象,内容就是双引号中的内容 |
//1.
String name = new String();
//2.
char[] ch = {
'a','b','c'};
String name = new String(ch);
//3.
String name = new String("abc");
//4.
String name = "abc";
2.2 String字符串创建的对比
-
使用""方式,给出的字符串,只要字符序列相同(顺序、大小写),无论在程序中出现几次,JVM都只会创建一个String对象,并在字符串常量池中维护;
- 字符串常量池:当使用 “” 创建字符串对象时,系统会检查该字符串是否在字符串常量池中存在;(jdk7之后在堆内存中,之前在方法区中)
- 不存在:创建;
- 存在:不会重新创建,直接复用;
String s1 = "abc"; //创建字符串对象“abc”,系统检查常量池,不存在,创建字符串,生成内存地址,s1指向内存地址; String s2 = "abc";//创建字符串对象“abc",系统检查常量池,存在,s2直接指向内存地址; sout(s1==s2); --> true
- 字符串常量池:当使用 “” 创建字符串对象时,系统会检查该字符串是否在字符串常量池中存在;(jdk7之后在堆内存中,之前在方法区中)
-
使用new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址不同;
char[] chs = { 'a','b'}; //创建数组对象,通过new在堆内存中开辟了内存空间,并将字符放入空间,返回地址值; String s1 = new String(chs); //使用new方法,堆内存中开辟空间,使用了chs数组创建对象,此内存中会记录chs数组的内存地址,内部会将字符转换为字符串;返回内存地址; String s2 = new String(chs);//使用new方法,堆内存中开辟空间,使用了chs数组创建对象,内存中会记录chs数组的内存地址,在内部将字符转换为字符串;返回内存地址; //s1 与 s2 都通过new开辟了新的空间,地址值不同;
-
常见问题
-
String s1 = "abc"; String s2 = "abc"; s1 == s2 --> true
-
String s1 = "abc"; String s2 = new String("abc"); //这一句代码会创建2个对象;注1: s1 == s2 --> false //s1指向字符串常量池中的内存地址,s2指向堆内存的内存地址; //注1:通过new,在堆内存中开辟新的空间,调用构造方法,检查""中的内容是否在常量池中存在,不存在则创建,然后将其地址值复制一份,存放到new开辟的堆内存空间中,堆内存空间存放的是字符串在常量池中的地址值。再将堆内存空间的地址值返回给对象;
-
String s1 = "abc"; //创建对象s1,系统检查常量池,不存在,创建字符串对象;返回地址值; String s2 = "ab"; //创建对象s2,系统检查常量池,不存在,创建字符串对象;放回地址值; String s3 = s2 + "c"; //创建对象s3,检查常量池,"c"不存在,创建字符串对象; //当使用+进行字符串拼接时,JAVA会在堆内存中创建StringBuilder对象,并开辟空间,然后自动调用StringBuilder的append的方法,在空间中完成字符串的拼接;完成后,依旧是StringBuilder类型,需要转换类型。自动调用StringBuilder中的toString方法进行转换,开辟新的空间,将转换好的String类型的数据存放此空间中;返回地址值,s3指向此String类型的地址; s1 == s3
-