Java中的long类型和Long类型比较大小

Java中Long和long的区别
Java的数据类型分为两种:
**1、基本类型:
byte(8),short(16),int(32),long(64),float(32),double(64),char(16),boolean(1)
2、对象类型:
Byte,Short,Integer,Long,Float,Double,Character,Boolean

上面的对象类型分别是基本类型的包装类,例如Byte是byte的包装类.

Long数据的大小的比较
对于Long类型的数据,这个数据是一个对象,所以对象不可以直接通过“>”,“==”,“<”的比较,如果要比较两个对象的是否相等的话,我们可以用Long对象的.equals()方法:

Long l1 = new Long(100);  
Long l2 = new Long(200);  
System.out.println(l1.equals(l2)); 

如果要进行“>”,“<”的比较的话,可以通过Long对象的.longValue()方法:

Long l1 = new Long(100);  
Long l2 = new Long(200);  
System.out.println(l1.longValue()<l2.longValue());

long数据的大小的比较
对于long类型的数据,这个数据是一个基本数据类型,不属于对象,所以可以直接通过“>”,“==”,“<”作比较

long l3 = 300;  
long l4 = 400;  
System.out.println(l3>l4);  
System.out.println(l3<l4);  
System.out.println(l3==l4); 

Java为每个原始类型提供了封装类

为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每 一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

原始类型: boolean,char,byte,short,int,long,float,double
**封装类类型(对象类型):**Boolean,Character,Byte,Short,Integer,Long,Float,Double

Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)

对于包装类说,这些类的用途主要包含两种:
作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。

包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法

自动装箱:将基本数据类型重新转化为对象

public class Test {
    public static void main(String[] args) {
 
        List<Integer>list=new ArrayList();
        //自动把1装箱成Integer包装类
        list.add(1);
    }
}

自动拆箱:将对象重新转化为基本数据类型

public class Test {
    public static void main(String[] args) {
        //声明一个Integer对象
        Integer num = 9;
 
        //进行计算时隐含的有自动拆箱
        System.out.print(--num);
    }
}

因为对象时不能直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除。

对比:

/装箱
Integer num = 10;

//拆箱
int num1 = num;

深入解析

情况描述

public class Test {
    public static void main(String[] args) {
 
        // 在-128~127 之内的数
        Integer i = 127;
        Integer j = 127;
        System.out.println( i==j );   //true
 
        // 在-128~127 之外的数
        Integer m = 128;
        Integer n = 128;
        System.out.println( m==n );   //false
 
        // 直接在堆中new一个对象
        Integer k = new Integer(100);
    }
}

java在编译Integer x = yyy ;时,会翻译成为Integer x = Integer.valueOf(yyy)。而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。如果超过128就会重新new一个新对象

解析原因: 归结于java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)。

1.加大对简单数字的重利用,Java定义在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。

2.而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。

img

img

上图也可以从代码断点看出 i 和 j 的地址相同。

同理, Long 与long, Float 与float,double与Double 等也存在类似的情况。

Float:

    public static void main(String[] args) {

        Float m = Float.valueOf(8280.0f);
        Float k = new Float(8280.0f);
        float n = 8280.0f;
        System.out.println(m==n); //true
        System.out.println(k==n); //true
        System.out.println(m==k); //false

    }

Long:

public static void main(String[] args) {

    Long m = new Long(1280);
    Long n = new Long(1280);
    System.out.println(m==n); //false

}

Double:

public static void main(String[] args) {

        Double m = new Double(128);
        Double n = new Double(128);
        System.out.println(m==n); //false

    }

Boolean:

  public static void main(String[] args) {

        Boolean m = new Boolean(true);
        Boolean n = new Boolean(true);

        System.out.println(m==n); //false

    }

Byte是java.lang中的一个类,目的是为基本数据类型byte进行封装。封装有几种好处,比如:1. Byte可以将对象的引用传递,使得多个function共同操作一个byte类型的数据,而byte基本数据类型是赋值之后要在stack(栈区域)进行存储的;2. 定义了和String之间互相转化的方法。Byte的大小是8个字节。因为Byte是需要通过关键字new来申请对象,而此部分申请出来的对象放在内存的heap(堆区域)。

Byte:

   public static void main(String[] args) {

        Byte by1 = new Byte("123");
        Byte by2 = new Byte("123");
        int length = by1.SIZE;
        int max = by2.MAX_VALUE;
        int min = by2.MIN_VALUE;
        System.out.println(by1 == by2); //false
        by1.equals(by2);    //true
        Byte by3 = by1;
        System.out.println(by3 == by1);  //true
        System.out.println("The length is "+length); //The length is 8
        System.out.println("MAX:"+max+" MIN"+min); //MAX:127 MIN-128
        byte temp = (byte)241; // 241的二进制表示为11110001(补码),其中第一位为符号位,那么剩余的计算结果为15,最终结果为-15
        System.out.println(temp); //-15
    }

Short:

 public static void main(String[] args) {

       Short m =128;
       Short n =128;
       System.out.println(m==n); //false

       Short a =127;
       Short b =127;
       System.out.println(a==b); //true

       short m1=128;
       short a1=127;
       //包装类与值类型比较时,自动拆箱,与范围无关
       System.out.println(m==m1); //true
       System.out.println(a==a1); //true

    }

以上堆,栈,常量池等在java中的概念,可以到 java堆、栈、堆栈,常量池的区别,史上最全总结 学习更多知识。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值