• Java系列之原生数据类型


    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请登陆疯狂java培训官网。

    在我看来,java里面里面除了原生类型不是对象,其他的都是对象。但java是面向对象的语言,很多地方还要要操作对象,所以java会自动把原生类型转为对应的包装类型。这个过程叫自动装箱。有装箱就有拆箱,就是包装的对象转换为原生类型。

      java里面一共有8种原生数据类型。

      类型 占字节大小

      boolean ?

      byte 8位有符号的二进制补码整数

      char 单个16 位Unicode 字符

      short 16位有符号的补码整数

      int 32位有符号的补码整数

      float 单精度 32 位 IEEE 754 浮点数

      long 64位有符号的补码整数

      double 单精度 64 位 IEEE 754 浮点数

      自然对应自动装箱后就是Boolean, Byte, Character, Short, Integer, Float, Long, Double。我们可以用包装类来了解一下类型的细节。

      大家是否觉得奇怪,boolean的大小是?,是未确定的。(很多人是以为1位)。以下是网上搜索的定义

      [html]

      <SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif; FONT-SIZE: 12px">使用此数据作为简单标记来跟踪真/假条件。这种数据类型代表一个比特的信息,但它的“大小”没有明确界定。</SPAN>

      使用此数据作为简单标记来跟踪真/假条件。这种数据类型代表一个比特的信息,但它的“大小”没有明确界定。

      下面我们来代码来答应相关的细节。

      [java]

      package cn.xiaowenjie;

      public class BasicTypeDemo

      {

      public static void main(String[] args)

      {

      System.out.println("Boolean:没有size属性");

      System.out.println("Byte: size:" + Byte.SIZE + ", Max:" + Byte.MAX_VALUE + ", Min:" + Byte.MIN_VALUE);

      System.out.println("Character: size:" + Character.SIZE + ", Max:" + Character.MAX_VALUE + ", Min:"

      + Character.MIN_VALUE);

      System.out.println("Short: size:" + Short.SIZE + ", Max:" + Short.MAX_VALUE + ", Min:" + Short.MIN_VALUE);

      System.out.println("Integer: size:" + Integer.SIZE + ", Max:" + Integer.MAX_VALUE + ", Min:"

      + Integer.MIN_VALUE);

      System.out.println("Float: size:" + Float.SIZE + ", Max:" + Float.MAX_VALUE + ", Min:" + Float.MIN_VALUE);

      System.out.println("Long: size:" + Long.SIZE + ", Max:" + Long.MAX_VALUE + ", Min:" + Long.MIN_VALUE);

      System.out.println("Double: size:" + Double.SIZE + ", Max:" + Double.MAX_VALUE + ", Min:" + Double.MIN_VALUE);

      }

      }

      package cn.xiaowenjie;

      public class BasicTypeDemo

      {

      public static void main(String[] args)

      {

      System.out.println("Boolean:没有size属性");

      System.out.println("Byte: size:" + Byte.SIZE + ", Max:" + Byte.MAX_VALUE + ", Min:" + Byte.MIN_VALUE);

      System.out.println("Character: size:" + Character.SIZE + ", Max:" + Character.MAX_VALUE + ", Min:"

      + Character.MIN_VALUE);

      System.out.println("Short: size:" + Short.SIZE + ", Max:" + Short.MAX_VALUE + ", Min:" + Short.MIN_VALUE);

      System.out.println("Integer: size:" + Integer.SIZE + ", Max:" + Integer.MAX_VALUE + ", Min:"

      + Integer.MIN_VALUE);

      System.out.println("Float: size:" + Float.SIZE + ", Max:" + Float.MAX_VALUE + ", Min:" + Float.MIN_VALUE);

      System.out.println("Long: size:" + Long.SIZE + ", Max:" + Long.MAX_VALUE + ", Min:" + Long.MIN_VALUE);

      System.out.println("Double: size:" + Double.SIZE + ", Max:" + Double.MAX_VALUE + ", Min:" + Double.MIN_VALUE);

      }

      }

      输出结果:

      [plain]

      Boolean:没有size属性

      Byte: size:8, Max:127, Min:-128

      Character: size:16, Max:【不可见】, Min:【不可见】

      Short: size:16, Max:32767, Min:-32768

      Integer: size:32, Max:2147483647, Min:-2147483648

      Float: size:32, Max:3.4028235E38, Min:1.4E-45

      Long: size:64, Max:9223372036854775807, Min:-9223372036854775808

      Double: size:64, Max:1.7976931348623157E308, Min:4.9E-324

     Boolean:没有size属性

      Byte: size:8, Max:127, Min:-128

      Character: size:16, Max:【不可见】, Min:【不可见】

      Short: size:16, Max:32767, Min:-32768

      Integer: size:32, Max:2147483647, Min:-2147483648

      Float: size:32, Max:3.4028235E38, Min:1.4E-45

      Long: size:64, Max:9223372036854775807, Min:-9223372036854775808

      Double: size:64, Max:1.7976931348623157E308, Min:4.9E-324

      有几点要注意

      Boolean类型没有size属性,所以说大小是未定的。

      JAVA里面的类型都是带符号的,而且是所有平台都是一样的长度。

      Character类型的最大最小值的定义是

      [java]

      public static final char   MIN_VALUE = 'u0000';

      public static final char   MAX_VALUE = 'uffff';

      public static final char   MIN_VALUE = 'u0000';

      public static final char   MAX_VALUE = 'uffff';所以char类型是可以指定中文的,如

      [java]

      char c1 = 'a';

      char c2 = '我';

      char c1 = 'a';

      char c2 = '我';

      还有一点疑问:为什么Integer和Float都是32位的,float的最大值比int的最大值大这么多?3.4028235E38是科学计数法,远远大于2147483647。答案就是一个是32位有符号的补码整数,一个是32 位 的单精度 IEEE 754 浮点数。但我不知道这有什么区别,烦知道的大拿不吝赐教。这2个东西有什么不一样,内存里面存放是如何的。

      原生类型的特性(优势):

      存放位置是放在栈里面,不需要用到堆,存储比较快。

      不可变,包括包装类都是不可变的(全部是final)。

      不可变的意思是说内存里面的值一旦被设置后就不会改变,如果要改变就会另外开辟一个位置存放新的值,但旧的值还在。如

      [java]

      int i1 = 1;

      int i2 = 1;

      i2 = 2;

      int i1 = 1;

      int i2 = 1;

      i2 = 2;

      第1,2行里面,i1和i2是一样的值,他们实际是指向同一个内存空间(虽然2个变量,实际一个空间),第2行i2修改成其他值的时候,i2就指向了一个新的内存空间,里面是2。

      关于这个结论,不知道方法有没有可以通过代码来验证呢?知道的兄弟在评论里面说一下。

      string类型的内存读写机制和这个一样。

      BigDecimal:

      float和double不能存在精准的浮点数值,如果需要用到小数,可以使用BigDecimal。

      [java]

      float f1 = 0.999999999999f;

      float f2 = 0.000000000001f;

      System.out.println((1.0f - f1) == f2);

      System.out.println((f1 + f2) == 1.0f);

      float f1 = 0.999999999999f;

      float f2 = 0.000000000001f;

      System.out.println((1.0f - f1) == f2);

      System.out.println((f1 + f2) == 1.0f);

      输出第一个为false,第2个为true。具体原因没有深究。(这个例子不知道恰不恰当)

      使用BigDecimal能精确运算浮点数。但使用构造函数需要小心,要使用字符串类型的构造函数。

      [java]

      BigDecimal bd1 = new BigDecimal("0.12345");

      BigDecimal bd2 = new BigDecimal(0.12345);

      System.out.println(bd1);

      System.out.println(bd2);

      BigDecimal bd1 = new BigDecimal("0.12345");

      BigDecimal bd2 = new BigDecimal(0.12345);

      System.out.println(bd1);

      System.out.println(bd2);输出

      [java]

      0.12345

      0.123450000000000004174438572590588591992855072021484375

      0.12345

      0.123450000000000004174438572590588591992855072021484375

      java没有运算符重载,所以使用BigDecimal对象后,加减乘除就要调用对象的方法啦(add,subtract,multiply,divide),还有其他的方法自己查看提示即可。

    数字进制:

      一般使用都是10机制,8进制的是0开头,16进制是0x开头,这个和javascript是一样的。有时候不小心容易出错。如 0100 和 100 就是不一样的值。

      自动拆箱引发的空指针:

      这是个工作上遇到的例子,简单写个样例代码。(不考虑规范和合理性。)

      [java]

      public class NullPointerDemo

      {

      public static void main(String[] args)

      {

      HashMap map = new HashMap();

      int count = getCount(map.keySet()); // 这行报空指针错误

      System.out.println(count);

      }

      private static Integer getCount(Collection keys)

      {

      if (keys == null || keys.isEmpty())

      {

      return null;

      }

      return keys.size();

      }

      }

      public class NullPointerDemo

      {

      public static void main(String[] args)

      {

      HashMap map = new HashMap();

      int count = getCount(map.keySet()); // 这行报空指针错误

      System.out.println(count);

      }

      private static Integer getCount(Collection keys)

      {

      if (keys == null || keys.isEmpty())

      {

      return null;

      }

      return keys.size();

      }

      }运行报空指针错误。在这行

      [java]

      int count = getCount(map.keySet());

      int count = getCount(map.keySet());根据经验,马上是断定map为空,才会抛出空指针,但实际上不是。反编译一看即知道缘由。反编译后,上面这行对应的代码是

      [java]

      int count = getCount(map.keySet()).intValue();

      int count = getCount(map.keySet()).intValue();可见这行跑空指针可能map为空,也可能是getCount函数为空。

      注意点:

      由于原生类型不是对象,在需要使用对象的地方虚拟机会自动装箱成对应的对象,代码上看上去很正常,但实际上是2个东西。所以有些系统间的调用接口,如果参数定义成原生类型,调用会失败。

    如之前在windchill里面做的一个远程调用的例子,方法定义里面是int,远程调用的时候就会失败了。远程调用里面会要输入参数的类型(class),而原生类型不是对象,没有类型,只有装箱后的类型,所以导致错误。

    疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂java培训中心地址:广州天河区车陂沣宏大厦3011。

  • 相关阅读:
    OCP-1Z0-051-V9.02-108题
    以一种访问权限不允许的方式做了一个访问套接字的尝试
    常用的几个官方文档
    OCP-1Z0-053-V12.02-388题
    FusionChart实现奇偶间隔显示
    OCP-1Z0-053-V12.02-138题
    Tcp and Udp NAT 穿越穿透打洞
    flashback database实验(使用lgmnr找出还原时间点)
    flashback table实验(基于undo数据)
    flashback query实验(基于undo数据)
  • 原文地址:https://www.cnblogs.com/gojava/p/3214404.html
Copyright © 2020-2023  润新知