Java基础--基本类型与运算

八个基本类型:

  • boolean/1
  • byte/8     -2^7~2^7-1
  • char/16    0~2^16-1
  • short/16   -2^15~2^15-1
  • int/32      -2^31~2^31-1
  • float/32
  • long/64    -2^63~2^63-1
  • double/64

每个基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。

Integer x = 2;     // 装箱 int-->Integer
int y = x;         // 拆箱 Integer-->int

new Integer(num)与Integer.valueOf(num) 的区别在于,new Integer(num)每次都会新建一个对象,而Integer.valueOf(num)可能会使用缓存对象,导致多次使用Integer.valueOf(num)会取得同一个对象的引用。如以下代码所示:

        Integer a = new Integer(127);
        Integer b = new Integer(127);
        Integer c = 127;
        Integer d = 127;
        Integer e = 128;
        Integer g = 128;
        System.out.println(a == b); //false 不同对象,当然不同地址
        System.out.println(a == c); //false 不同存储地方,一个常量池,一个堆,当然不同地址
        System.out.println(c == d); //true  都在常量池,且127在-128~127之间,所以引用已有的对象,无需new
        System.out.println(e == g); //false 128不在-128~127之间,相当于在堆中new两个Integer对象

参照valueOf()源码:先判断值是否在缓存池中,如果在的话就直接使用缓存池的内容。

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

Integer缓存池大小设为-128~127

static final int low = -128;
static final int high;
static final Integer cache[];

static {
    // high value may be configured by property
    int h = 127;
    String integerCacheHighPropValue =
        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
    if (integerCacheHighPropValue != null) {
        try {
            int i = parseInt(integerCacheHighPropValue);
            i = Math.max(i, 127);
            // Maximum array size is Integer.MAX_VALUE
            h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
        } catch( NumberFormatException nfe) {
            // If the property cannot be parsed into an int, ignore it.
        }
    }
    high = h;

    cache = new Integer[(high - low) + 1];
    int j = low;
    for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++);

    // range [-128, 127] must be interned (JLS7 5.1.7)
    assert IntegerCache.high >= 127;
}

因此,当num值在-127~128之间时,创建Integer对象时先查看缓存池中是否存在num值,如果没有就在缓存池中新建,有则直接使用;若num不在-127~128之间时,valueOf使用new Integer(num)方式在堆中新建对象。

Java 还将一些其它基本类型的值放在缓冲池中,包含以下这些:

  • boolean values true and false
  • all byte values
  • short values between -128 and 127
  • int values between -128 and 127
  • char in the range \u0000 to \u007F

因此在使用这些基本类型对应的包装类型时,就可以直接使用缓冲池中的对象。

原文地址:https://www.cnblogs.com/ck-blogs/p/8747028.html

时间: 2024-11-16 02:34:48

Java基础--基本类型与运算的相关文章

黑马程序员--Java基础--基本类型

--Java培训.Android培训.iOS培训..Net培训 期待与您共同交流!-- 变量.JAVA基本类型.运算符和表达式 目录: 1变量 2JAVA基本类型 3运算符和表达式 1. 变量 1.1. 什么是变量 在日常生活中,人们会用到大量的数据,像去ATM机取款,首先,需要插入银行卡,这个过程其实就是ATM机的系统在获取银行卡号这个数据,而后,输入密码,这个过程也是在获取数据,也就是密码.在后续进行的业务处理中,像存钱.取钱.转帐汇款等等,银行卡号和密码会被反复的.频繁的使用, 那就需要一

Java基础东西(按位操作运算)

http://aokunsang.iteye.com/blog/615658 前奏:   昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊,是吧?但是那哥们的回答,让我郁闷半天:"这都不会啊,都是Java基础的东西呀!"我靠,我晕倒,听着老不爽了,so我决定对位移一探究竟,原来也这么随意啊,哈哈.因此,把心得总结如下,欢迎收看. 在这里先感谢一下,JavaEye上的高手们的技术博客指点.TKS very much. 技术总结:

关于java中Double类型的运算精度问题

标题     在Java中实现浮点数的精确计算    AYellow(原作) 修改    关键字     Java 浮点数 精确计算   问题的提出:如果我们编译运行下面这个程序会看到什么?public class Test{    public static void main(String args[]){        System.out.println(0.05+0.01);        System.out.println(1.0-0.42);        System.out.

java 基础 浮点类型

1.浮点类型用于表示小数的数据类型. 2.浮点数原理:也就是二进制科学计数法. 3.Java的浮点类型有float和double两种. 4.Java默认浮点类型计算的结果是double类型,字面量也是double类型. 1.十进制浮点数科学计数法: 219345 = 2.19345*(10^5) 2.二进制浮点数科学计数法: 10111 = 1.0111*(2^100) 1.float类型共32位,1位为符号位, 指数8位, 尾数23位. 2.float的精度是23位(即能精确表达23位的数,超

java 基础 整数类型

1.Java有四种整数类型:byte.short.int和long. 2.Java默认整数计算的结果是int类型. 3.整数的字面量是int类型. 4.若字面量超过int类型的最大值,则字面量是long类型,那么后面要用L(或l)表示该值是long类型. byt b = 5; byt a = b + 5;错误 int a =  b + 5;正确 byt a = 122 + 5;正确 byt a = 123 + 5;错误,超出范围

java 基础 字符类型

1.char类型的字面量可以是一个英文字母.字符或一个汉字,并且由单引号包括. 2.Java底层使用一个16位的整数来处理字符类型,该数值是一个字符的unicode编码值. unicode: 1.unicode编码是全球范围内的编码方法. 2.unicode编码的英文部分与ASCII码兼容(ASCII表示范围0~128), 同时英文字符和数字是连续编码的. 3.Java在处理char类型的数据时,在底层是按unicode码来处理的. 编码是什么? 计算机硬件系统只能用0和1表示数,我们人为地做了

Java基础——基本类型包装类型的引入(1)

基本类型包装类型的引入 1.概述 基本类型就是我们之前所说的类似int.String.float等常用的一些数据类型,这一些是基本的数据类型,为了对基本类型数据进行更多的操作 ,以及更方便的操作,Java针对每一种数据类型提供了相应的类类型,即包装类型. 2.对应关系 byte(Byte).short(Short).int(Integer).long(Long).float(Float).double(Double).char(Character).boolean(Boolean) 3.详解(1

13. Java基础之类型信息(RTTI和反射)

一. 背景 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息). Java是如何让我们在运行时识别对象和类的信息的,主要有两种RTTI的方式,一种是"传统的"RTTI,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 二. RTTI RTTI(Run-Time Type Infomation),运行时

Java基础_自加运算

int a = 4, b = a++; System.out.println("a=" + a); System.out.println("b=" + b);结果为 a=5,b=4 int a = 4, b = ++a; System.out.println("a=" + a); System.out.println("b=" + b);结果为 a=5,b=5 * a:单独使用: 放在操作数的前面和后面效果一样.(这种用法是我