前言
在java当中,所有带双引号的字符串,都是String类的对象,字符串是不可以改变的,值在创建后不能被更改,但是String的值是可以被共享的。
字符串常量池
在jdk7版本开始,字符串常量池从方法区中移动到了堆内存,当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在,如果存在,就会直接复用,不存在则会创建
package com.entor.practice.designmode.pra1;
public class Test {
public static void main(String[] args) {
String s = "起飞";
String s2 = "起飞";
System.out.println(s == s2);//true
/**
*@Description 在字符串常量池中复用了
**/
String s3 = new String("起飞");
/**
*@Description 实际上这句话创建了两个对象,首先new会在内存中
* 开辟一片空间,而双引号里面又会创建一个Sting对象,但是已经存在了,所以会
* 拿字符串常量池中拿,该字符串的内存空间是指向new出来的空间
**/
System.out.println(s2 == s3);//false
String s4 = "飞";
String s5 = "起" +s4;
System.out.println(s5==s2);//false
/**
*@Description 当字符串之间使用加号连接时,系统会在底层创建一个StringBuilder
* 对象,然后调用append方法完成拼接,之后用toString方法转换成Stirng类型
**/
String s6 = "起" + "飞";
System.out.println(s6==s2);
/**
*@Description java存在常量优化机制,在编译的时候会将"起" + "飞"拼接成"起飞"
* 之后的操作就是和第一个比较一样了
**/
/**
*@Description 使用== 做比较
* 基本数据类型:比较的数据值是否相同
* 引用类型:比较的是地址值是否相同
**/
}
}
equals在object中也是比较内存值的
api中是这样写的
-
-
-
该
equals
类方法Object
实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空的参考值x
和y
,当且仅当x
和y
引用相同的对象(x == y
具有值true
)时,该方法返回true
。请注意,无论何时覆盖该方法,通常需要覆盖
hashCode
方法,以便维护hashCode
方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。
-
-