精华内容
下载资源
问答
  • java包装类
    2021-03-10 07:39:11

    大纲:

    包装类简介

    创建包装类

    自动装箱、拆箱

    判断相等

    默认值

    其他

    一、包装类简介

    Java中共有八种基本类型,byte, short, int, long, float, double, char, boolean。

    分别对应八种包装类,Byte, Short, Integer, Long,Float, Double, Character, Boolean。

    相较于基础数据类型,包装类有许多方法和成员变量供我们使用。

    每个包装类型都有一个名为value的成员变量,用来存储它自己基本类型的值。

    Integer a = new Integer(1);//包装类

    int b = 1;//基础类型

    二、创建包装类型

    以Integer为例子,其他包装类类似

    //通过基本类型创建

    new Integer(1);

    Integer.valueOf(1);//通过字符串创建

    new Integer("1"); //调用parseInt

    Integer.valueOf("1"); //调用parseInt

    Integer.parseInt("1");

    几种常见创建方式,其他包装类也有类似的创建方法。

    值得注意的是valueOf方法

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

    }

    可以发现使用了缓存,看下这个IntegerCache,它是Integer的嵌套类

    private static classIntegerCache {static final int low = -128;static final int high = 127;//默认127,可配置

    static finalInteger cache[];static{//将-128至127的包装类缓存到cache中

    }

    }

    也就是说使用valueOf()来创建值为-128至127的包装类时,会使用已经创建好的缓存。我们创建包装类尽量使用这个方法避免重复创建对象。

    还有一点需要注意的是,有2个包装类(Float, Double)是不使用缓存的

    三、自动装箱、拆箱

    Integer a = 1; //自动装箱,反编译后发现使用Integer.valueOf(1)方法

    int b = a; //自动拆箱,反编译后发现使用a.intValue()方法

    java1.5以后,编译器会帮助我们完成自动装箱拆箱、不需要我们手动转换。

    四、判断相等

    //基础类型判断相等直接用==判断即可//包装类型判断相等用equals,通过源码可知,比较的是两个包装类的基础类型的value值。//基础类型和包装类型比较

    int a = 1;

    Integer b= 1;

    System.out.println(a==b);//true,这里b会被自动拆箱//包装类用==比较

    Integer c = 1;

    Integer d= 1;

    System.out.println(c==d); //true,包装类自动装箱使用的是valueOf()方法,使用的是缓存

    Integer e= 200;

    Integer f= 200;

    System.out.println(c==d); //false,这里由于200>127没有使用缓存,使用的都是new Integer()

    五、默认值

    包装类没有默认值,基础数据类型有初始化默认值。

    private static inta;private staticInteger b;public static voidmain(String[] args) {

    System.out.println(a);//0

    System.out.println(b);//null

    }

    使用的时候需要注意与数据库打交道的po对象尽量使用包装类,因为数据库查询结果为null时,使用基础数据类型会被赋上默认值。

    六、其他

    泛型只能使用包装类。

    计算的时候避免基础类型与包装类直接运算(Long+long 一个包装类与基础类型直接加法运算),会导致自动拆装箱,影响性能。

    更多相关内容
  • 最近在业务中碰到了 Integer 默认值的判空 导致的业务逻辑问题,引起了兴趣,针对基本数据类型和其包装类有什么区别?测试过程中应该注意哪些问题呢? 回答这些问题前,我们先来看看java中基本数据类型和包装类有...
    • 一、Java中基本数据类型的包装类
    • 二、Java中8种基本数据类型及其默认值
    • 三、基本数据类型比包装类性能好?
    • 四、基本数据类型和包装类的区别
    • 五、测试中注意什么?
    • 六、附录



    最近在业务中碰到了 Integer 默认值的判空 导致的业务逻辑问题,引起了兴趣,针对基本数据类型和其包装类有什么区别?测试过程中应该注意哪些问题呢?

    回答这些问题前,我们先来看看java中基本数据类型和包装类有哪些

     

     

    一、Java中基本数据类型的包装类

     

            Java是面向对象的编程语言,但它也包含了8种基本数据类型以及对它的包装类,主要是为了照顾程序员传统的习惯。同时,也带来了一些方便。例如,在java中,泛型类的定义,使用的参数必须是对象(包装类),无法直接使用基本数据类型;另外,从性能方面来考虑,使用对象进行逻辑处理也会引起额外的开销,对于逻辑多的程序来说,这些开销可能会引起性能的下降,从而影响到服务能力。

           Java的基本数据类型分成boolean类型和数值类型。数值类型又可以分成整型和浮点型。包含:byte、short、int、long、char、float、double、boolean




    下面来看一个程序示例

    程序示例

    1 Integer i = 100;

    2 Integer j = 100;

    3 System.out.print(i == j); //true


    Integer i = 128;

    Integer j = 128;

    6 System.out.print(i == j); //false


           对于第4行,java编译的时候,会先翻译成 Integer i = Integer.valueOf(128)返回一个int值(自动装箱)。而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。


     

    二、Java中8种基本数据类型及其默认值

     包装类对应的初始值是null

    Java中8种基本数据类型总结

     

     

     

     

     

    序号

    数据类型

    大小/位

    封装类

    默认值

    可表示数据范围

    1

    byte(位)

    8

    Byte

    0

    -128~127

    2

    short(短整数)

    16

    Short

    0

    -32768~32767

    3

    int(整数)

    32

    Integer

    0

    -2147483648~2147483647

    4

    long(长整数)

    64

    Long

    0

    -9223372036854775808~9223372036854775807

    5

    float(单精度)

    32

    Float

    0.0

    1.4E-45~3.4028235E38

    6

    double(双精度)

    64

    Double

    0.0

    4.9E-324~1.7976931348623157E308

    7

    char(字符)

    16

    Character

    0~65535

    8

    boolean

    8

    Boolean

    flase

    true或false

     【摘自<https://blog.csdn.net/fysuccess/article/details/40656761>】

     

    三、基本数据类型比包装类性能好?

     

     我们先来看看基本数据类型和包装类在内存中的存储位置

    Java中的基本数据类型是直接存储在堆栈中,能高效读取;包装类是通过引用指向具体实例,实例存储在堆(heap)中,指向实例的引用则存储在堆栈(Stack)中。

     

     

    【以下摘自 thinking in java 第二章】

    Java中,有六个地方都可以保存数据:

    (1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。

    (2) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。

    (3) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!

    (4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。

    (5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。

    (6) 非RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。

     

    通过这段话可以看出,就速度而言,寄存器>堆栈>堆>其他;因此,基本数据类型的性能优于包装类

     

     

    四、基本数据类型和包装类的区别


    1 定义不同。包装类属于对象,基本数据类型不是

    2 声明和使用方式不同。包装类使用new初始化,有些集合类的定义不能使用基本数据类型,例如 ArrayList<Integer>

    3 初始值不同。包装类默认值为null,基本数据类型则不同的类型不一样(具体见上表)

    4 存储方式和位置不同,从而性能不同。基本数据类型存储在 堆栈(stack)中,包装类则分成 引用和实例,引用在堆栈(stack),具体实例在堆(heap)中

     

    五、测试中注意什么?

           回归到测试,在测试中,需要注意什么?

    1 包装类的默认值需要注意。业务逻辑实现中,包装类和基本数据类型默认值是不同的,使用包装类时,如果不注意默认值,当做基本数据类型做兜底策略判空时,可能会引起异常错误

    2 性能不同。因此在 计算密集型的程序设计中,需要注意使用性能问题,也许使用基本数据类型可以有效提高性能呢。

     

     

    六 附录

    为了证明基本数据类型确实比包装类更高效,做一个简单的实验

    实验平台:戴尔笔记本 E5440 

    操作系统:Windows7

    处理器:Intel(R) Core(TM) i5-4300U CPU @ 1.90GHz 2.50GHz

    RAM:8GB

    磁盘:LITEONIT LCS-256M6S 2.5


    程序示例

    public class wrapperTest {
        public static void main(String[] args){
     int[] intArray=new int[10000000];
     int[] intArrayb=new int[10000000];
     Integer[] inteArray=new Integer[10000000];
     //初始化
     for(int i =1;i<=10000000;i++)
            {
                intArray[i-1]=i;
     intArrayb[i-1]=i;
     inteArray[i-1]=i;
     }
     int sum=0;
    
     //int time test
     long startTime=System.currentTimeMillis();
     for(int i =1;i<=10000000;i++)
            {
                sum +=intArray[i-1];
     }
            long endTime=System.currentTimeMillis();
     System.out.println("int 消耗时间:"+(endTime-startTime));
    
     //int time test
     startTime=System.currentTimeMillis();
     for(int j =1;j<=10000000;j++)
            {
                sum +=intArrayb[j-1];
     }
            endTime=System.currentTimeMillis();
     System.out.println("int 消耗时间:"+(endTime-startTime));
    
     //Integer time test
     sum=0;
     startTime=System.currentTimeMillis();
     for(int i =1;i<=10000000;i++)
            {
                sum +=inteArray[i-1];
     }
            endTime=System.currentTimeMillis();
     System.out.println("Integer 消耗时间:"+(endTime-startTime));
     }
    }


    输出结果

    int 消耗时间:10
    int 消耗时间:10
    Integer 消耗时间:21


    这里并不是要做定量分析,更多的是定性结果分析,从简单实验来看,一百万次的数值相加操作,int耗时10ms,Integer耗时 21ms,由此可见基本数据类型的性能更好一些

    展开全文
  • 代码 /** * @author Lux Sun * @... null String[]: null Object: null boolean[]: null Boolean[]: null 总结 所有对象、数组、包装类默认值:null 只需记住基本数据类型默认值即可,特殊了解的已经在代码里标注 

    代码 

    /**
     * @author Lux Sun
     * @date 2021/9/13
     */
    public class DefaultValueDemo {
    
        private byte byteValue;
    
        private short shortValue;
    
        private int intValue;
    
        private long longValue;
    
        private float floatValue;
    
        private double doubleValue;
    
        private char charValue;
    
        private char[] charArrayValue;
    
        private boolean booleanValue;
    
        private boolean[] booleanArrayValue;
    
        private Byte byteVal;
    
        private Short shortVal;
    
        private Integer integerVal;
    
        private Long longVal;
    
        private Float floatVal;
    
        private Double doubleVal;
    
        private Character characterVal;
    
        private Boolean booleanVal;
    
        private Boolean[] booleanArrayVal;
    
        private String stringVal;
    
        private String[] stringArrayVal;
    
        private Object objectVal;
    
        public static void main(String[] args) {
            DefaultValueDemo demo = new DefaultValueDemo();
            System.out.println("byte: " + demo.byteValue); // (byte)0
            System.out.println("short: " + demo.shortValue); // (short)0
            System.out.println("int: " + demo.intValue);
            System.out.println("long: " + demo.longValue); // 0L
            System.out.println("float: " + demo.floatValue); // 0.0f
            System.out.println("double: " + demo.doubleValue); // 0.0d
            System.out.println("char: " + demo.charValue); // '\u0000' 什么也不输出, 不要认为输出是空格
            System.out.println("char[]: " + demo.charArrayValue);
            System.out.println("boolean: " + demo.booleanValue);
            System.out.println("Byte: " + demo.byteVal);
            System.out.println("Short: " + demo.shortVal);
            System.out.println("Integer: " + demo.integerVal);
            System.out.println("Long: " + demo.longVal);
            System.out.println("Float: " + demo.floatVal);
            System.out.println("Double: " + demo.doubleVal);
            System.out.println("Character: " + demo.characterVal);
            System.out.println("Boolean: " + demo.booleanVal);
            System.out.println("String: " + demo.stringVal);
            System.out.println("String[]: " + demo.stringArrayVal);
            System.out.println("Object: " + demo.objectVal);
            System.out.println("boolean[]: " + demo.booleanArrayValue);
            System.out.println("Boolean[]: " + demo.booleanArrayVal);
        }
    }

    输出 

    byte: 0
    short: 0
    int: 0
    long: 0
    float: 0.0
    double: 0.0
    char:  
    char[]: null
    boolean: false
    Byte: null
    Short: null
    Integer: null
    Long: null
    Float: null
    Double: null
    Character: null
    Boolean: null
    String: null
    String[]: null
    Object: null
    boolean[]: null
    Boolean[]: null

    总结

    • 所有对象、数组、包装类默认值:null

    • 只需记住基本数据类型默认值即可,特殊了解的已经在代码里标注 

    展开全文
  • package java_wrapper; public class Cat { String name; int month; double weight; } package java_wrapper; public class CatTest { public static void main(String[] args) { Cat one = new Cat(); ...

    在前面章节中,已经知道基本数据类型的初始值是这样的:

    package java_wrapper;
    
    public class Cat {
        String name;
        int month;
        double weight;
    }
    
    package java_wrapper;
    
    public class CatTest {
        public static void main(String[] args) {
            Cat one = new Cat();
            System.out.println("小猫的昵称:"+one.name);
            System.out.println("小猫的年龄:"+one.month);
            System.out.println("小猫的体重:"+one.weight);
        }
    }
    

    输出:

    小猫的昵称:null
    小猫的年龄:0
    小猫的体重:0.0
    

    若将基本数据类型改为其对应的包装类:

    package java_wrapper;
    
    public class Cat {
        String name;
        Integer month;
        Integer weight;
    }
    

    包装类初始值的输出结果如下:

    小猫的昵称:null
    小猫的年龄:null
    小猫的体重:null
    
    展开全文
  • 主要适用于,对象中使用了包装类,但是不能给null需要有默认值的情况 /** * 处理对象中包装类,因为快捷签没有用包装类 * * @param object 对象 */ public static void handleParamDefault(Object ...
  • 事件:包装类型为静态变量,与基本类型进行==比较过程中,报空指针异常 Exception in thread "main" java.lang.NullPointerException at com.lei.java8.TestCharaterNull.main(TestCharaterNull.java:9)
  • 八大基本数据类型、数组和包装类默认值 1.八大基本数据类型 Java八种基本数据类型总结 序号 数据类型 大小/字节 封装类 默认值 可表示数据范围 1 byte 1 Byte 0 -128~127 2 short 2 Short 0 -32768...
  • ----------------java中自动装箱、拆箱和包装类默认值问题-------------装箱:基本数据类型转换成包装类就是装箱(jdk1.5以后的特性,自动完成)。拆箱:把包装类转换成基本数据类型就是拆箱(jdk1.5以后的特性,自动...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • java给对象中的包装类设置默认值

    千次阅读 2019-07-27 11:52:28
    主要适用于,对象中使用了包装类,但是不能给null需要有默认值的情况 /** * 处理对象中包装类,因为快捷签没有用包装类 * * @param object 对象 */ public static void handleParamDefault(Object object) { ...
  • 在开发中,1.Java model层定义基本数据类型都用其包装类。不用基本数据类型是因为他们会有默认值,在初始化化类时就要给他们赋值,不然数据库得到的值就不是我们所希望的。2.可以在类中给字段赋值。例如public class...
  • 包装类默认值是null

    千次阅读 2019-08-05 19:41:09
    问题描述:今天写代码过,没有给包装类的成员变量赋值,本以为它会有默认值,结果发现包装类的成员变量值为null,网上差了差,才知道包装类默认值为null。 1. 先放结论 包装类默认值都是null。 2. 示例 public...
  • 我试图定义一个抽象的Range,它将作为一些范围的基本实现.预期用途与这个问题无关,但到目前为止我有:/*** Abstract generic utility class for handling ranges*/public abstract class Range {// Variables to ...
  • Java包装类的应用场景介绍 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。今天讲一下 Java 包装类的的由来,及自动装箱、拆箱的概念和原理。什么是包装类型Java 设计当初就提供了 8 种 基本数据...
  • 当变量作为作为成员使用时,java才确保给定其初始值,防止程序运行时错误 数据类型初始值 byte 0 short 0 int 0 long 0L char 'u0000' float 0.0f double 0 ...
  • 包装类概念 因为Java是一个完全的面向对象的语言,几乎所有的方法都可以直接通过对象.方法()调用,然而8种基本数据类型的存在就很鸡肋,不能直接用int. char. double.来调用想用的功能,也没有继承封装等面向对象...
  • Java包装类

    2022-03-24 10:39:29
    主要是包装类的使用、自动装箱和拆箱、主要是Integer与int值的“==“”的比较
  • java包装类

    2019-12-16 17:22:29
    包装类的意义 包装类 每个基本数据类型都有对应的包装类 基本数据类型和包装之间的关系: 装箱: 拆箱: 例程: 1.one == two 【false】 对象vs对象 判断【两个引用】(地址)是否一致 ,one和two都是100,但...
  • int和Integer的默认值

    千次阅读 2021-02-12 22:06:21
    因为Integer是int的封装,编译器能够识别,但是它所调用的方法又是另一个,所以运行时 找不到那个方法所以报了一个空指针,代码如下: public static voidmain(String[] args) { doem01 doem01= newdoem01();...
  • 基本数据类型的包装类都属于引用类型 所以包装类的初始化值都为null public class baozhuangClass { Integer a; Byte b; Short c; Long d; Float e; Double f; Boolean g; Character h; @Override public...
  • java基本类型的默认值

    千次阅读 2017-01-31 04:58:12
    刚工作几年的时候经常又新人问int boolean变量的默认值是多少 这个也是经常看到的一个东西 接下来看测试结果 import org.junit.Test; public class TestBoolean { public boolean b; public int i; public ...
  • Java包装类

    2021-09-11 11:55:57
    Java包装类 一.什么是包装类 包装类继承结构图 二.包装类应用场景 1、集合类泛型只能是包装类; // 编译报错 List<int> list1 = new ArrayList<>(); // 正常 List<Integer> list2 = new ...
  • Spring @Value 设置默认值的实现

    千次阅读 2021-02-27 10:40:14
    1.概览Spring 的 @Vaule 注解提供了一种便捷的方法可以让属性值注入到组件中,当属性值不存在的时候提供一个默认值也是非常好用的这就是我们这篇文章所专注的,如何给 @Vaule 注解指定一个默认值。对于更多的关于 @...
  • Java 包装类【Boolean】

    2020-07-21 16:10:24
    1、布尔类型的包装类:Boolean类用于分装boolean类型数据。 构造方法: Boolean(boolean value); Boolean(String str); 2、Boolean提供的方法: Boolean.FALSE; //false Boolean.TRUE; //true //使用构造方法创建...
  • import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder;...import java.util.List; /** * @a.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,533
精华内容 18,213
关键字:

java包装类默认值

java 订阅