目录
- String类对象实例化
- 字符串比较
- 字符串常量
- 两种实例化方式比较(共享设计模式的应用)
- 字符串常量池
- 字符串修改分析
- 主方法组成分析
- String类常用方法
- JavaDoc文档介绍
引言:在实际项目开发中,String是一个必须使用的程序类,可以说是项目的核心组成类。在java程序里所有的字符串都要使用"“进行定义,同时也可以利用”+"实现字符串的连接处理,但是对于String类实际上还有其自身的特点,本笔记将通过具体的实例和概念进行String类的特点分析
1.String类对象实例化
返回目录
String实例化对象有两种方式:直接赋值实例化和构造方法实例化
源码分析:
JDK1.8之前String保存的是字符数组:private final char value[];
JDK1.9之后String保存的是字节数组:private final byte[] value;
由JDK1.9之后的版本可以看出:字符串就是对数组的一种特殊包装应用,而对数组而言最大的问题在于长度固定。
构造方法实例化String类对象:
构造方法:public String(String str)
实例化代码:String str=new String(“shmily”);
分析:
利用构造方法实例化String类对象可以采用的对象实例化格式进行处理操作,这种方法更为直观,其最终的结果与直接赋值效果相同。但两者之间还是有本质区别的,下面来逐步分析
2.字符串比较
返回目录
"=="与equals方法的区别:
https://editor.csdn.net/md/?articleId=115827164
这里再补充一点:
@Test
public void test(){
String str="shmily";
String str2=new String("shmily");
String str3="shmily";
String str4=new String("shmily");
System.out.print("直接赋值与构造赋值地址用==相比结果:");
System.out.println(str==str2);
System.out.println("直接赋值与构造赋值地址用equals方法相比结果:"+str.equals(str2));
System.out.println("*****************************************");
System.out.print("直接赋值与直接赋值地址用==相比结果:");
System.out.println(str==str3);
System.out.println("直接赋值与直接赋值地址用equals方法相比结果:"+str.equals(str3));
System.out.println("*****************************************");
System.out.print("构造赋值与构造赋值地址用==相比结果:");
System.out.println(str2==str4);
System.out.println("构造赋值与构造赋值地址用equals方法相比结果:"+str2.equals(str4));
}
运行结果:
对于以上结果再次说明了==只能用于基本数据类型的比较(唯一特殊的就是String直接赋值之间可以使用其进行比较)
所以对String引用数据类型进行比较最好使用equals方法(字符也一样使用equals方法比较)
对比源码还是能发现Object提供的equals方法的底层(这是需要我们覆写的)和String类中的equals方法的底层是不一样的。
3.字符串常量
返回目录
String直接赋值是一个String类的匿名对象的书写方式。
这里就提一个避免空指针异常问题的书写方法(NullPointerException):
容易产生空指针异常的写法:
public class Test{
String str;
@Test
public void test{
System.out.println(“a”.equals(str));//如果str没有初始化赋值就会产生空指针异常,
//根源在equals方法没有得到参数而报的异常,解决方法就是保证equals方法必得参数:
System.out.println(str.equals(“a”));
}
}
4.两种实例化方式比较
返回目录
直接赋值和构造赋值,在初始赋值时会开辟一块内存空间,如果再有相同的赋值,也不会重复开辟新的空间,引用指向之前开辟的空间,该例子字符串比较那里可以看出,下面来介绍该机制
字符串对象池:
实际上,在JVM的底层存在有一个对象池(String只是对象池中保存的一种类型,此外还有多种其他类型)当代码中使用了直接赋值的方式定义了一个String对象时,会将此字符串对象所使用的匿名对象入池保存,如果后续还有其他String类对象也采用了直接赋值的方式,并且设置了同样内容,那么将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。(使用构造方法定义的不会入池)
对象池本质为共享设计模式的一种应用
手动使构造方法实例化的String对象入池:public String intern();
@Test
public void test02(){
String str01=new String("a").intern();
String str02="a";
System.out.println(str01==str02);//true
}
推进直接赋值的方法进行字符串的定义。
5.字符串常量池
返回目录
讲的大致差不多与4相同,就一个区别:
字符串常量池分为:
- 静态常量池
运行前就赋完值,相同内容的字符串地址相同(引用会指向池内)
@Test
public void test02(){
String str01="abc";
String str02="a"+"b"+"c";
System.out.println(str01==str02);//true
}
- 运行时常量池
运行时进行拼接赋值,相同的内容字符串地址不同(引用不会指向池内)
@Test
public void test02(){
String str01="abc";
String str02="b";
String str03="a"+str02+"c";//运行时赋值
System.out.println(str01==str03);//false
}
4和5的对象池是关于==的,构造赋值和equals方法要仔细判别!!!
6.字符串修改分析
返回目录
不断的使用+来拼接字符串,字符串的会不断的产生垃圾空间!!!
尽可能减少字符串的赋值操作是保证大项目运行流畅的保障!!!
7.主方法组成分析
返回目录
在javaSE的笔记中已经分析过了:
https://editor.csdn.net/md/?articleId=118931842
““是用于特殊字符的:例如Hello World因为中间有空格分开,传参会成为是两个字符串,要想使其为一个字符串就得加上””:“Hello World”
8.String类常用方法
返回目录
【1】常用构造方法
【2】常用的所有方法
上述为常用方法就不一一介绍了,相信看文字也看得懂,更多方法请使用JavaDoc文档查询
9、JavaDoc文档介绍
返回目录
API应用手册请联系作者领取