字符串为什么不能用等于符号直接比较;有些整数为什么不能直接用等于符号比较

基本数据类型:

基本数据类型都可以当作是关键字的存在

整数型:byte(1) short(2) int(4)  long(8)  数字代表字节大小  一个字节八个二进制数

浮点型:float(4) double(8)  浮点数最多精确到小数点后六位

字符型:char unocode

布尔型:boolean true/false(1)

其中定义变量储存的是值

引用数据类型:类,接口;数组

其中变量储存的是数据堆内存的地址

堆内存和栈内存

栈内存一般存储关键字定义的变量

堆内存储存类;接口;数组等的变量    储存的形式一般是用一个变量储存该段值的编码,该编码指向堆内存当中的一段内存,该内存当中储存着数据

常量池(包含在堆内存当中的一块特殊的区域)

字符串:

String str ="ABC";先在常量池当中寻找这个值:

1 有就返回这个在常量池中的地址

2没有就创建一个该段数据的内容并且储存在常量池当中,返回常量池中的地址

String strc = new String("ABC");
1现在常量池中找,没有就在常量池当中创建一个

2然后再在堆内存当中创建一个对象;最终返回的是堆内存当中的地址

数字:

实例:

​​int c = 10,d=10;//这种数据比较不区分大小
		System.out.println(c==d);
		Integer a1=10,b1=10;//也是返回地址但是是同一个地址;都在常量池当中
		
		Integer a2=128,b2=128;//当这样创建对象的时候(数据偏大)
		System.out.println(a2.equals(b2));
		System.out.println(a2==b2);
		System.out.println(a1==b1);

 依次为true    原因:第一种比较直接比较的是二进制编码

true       equals方法比较后直接正确

false 当比较的范围超出-128到127的时候对象储存不在常量池中;会在堆内存中形成新的对象,地址不在是常量池中内存

true :a1,b1返回的值都是常量池中地址

字符串实例:

public class Charcompare {
	static String str;//前面static的作用
	//堆内存和栈内存;栈内存一般储存的是关键字定义的类型,局部变量,全局变量等
	//当使用引用类型储存值时候一般存在堆内存当中;堆内存中有常量池(方便比较);像关键字一样创建对象(储存在常量池当中;返回常量池地址)
	public static void main(String[] args) {
		String stra = "ABCD";//直接在常量池中创建;返回的是常量池当中的编码
		String strb ="ABCD";
		String strc =new String("ABCD");//先在常量池中创建;后返回堆当中创建;最后返回的值是堆当中的编码
		
		String strd = new String("ABCD");
		
		System.out.println(stra==strb);//第一个正确是因为;因为这种创建方式返回的都是常量池当中的地址
		System.out.println(stra.equals(strc));//注意看equals的源代码
		System.out.println(strc==strd);//不正确因为用引用数据类型创建的数据,它会先在堆内存开辟一块地址;其中字符串变量名储存的是地址的编号
		//其中返回的值最终是堆内存的编码;这种创建都是重新在堆内存当中重新开辟了空间内存;所以编码不同

 

equals源代码分析讲解:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

 比如a.equals(b)

1第一个if判断a和b是不是一个对象(this是不是可以直接指向a)

2判断anObject是不是String的实例:不是则False

3 判断a,b字符串长度是否相等(其中value指的是a这种在点左边的字符串)

String anotherString =(String)anobject 将实例anobject 强转为字符串类型

4依次判断单个字符是否相等

5如果都满足则最终返回值是true

注意boolean返回的值是布尔值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值