zoukankan      html  css  js  c++  java
  • 数据类型的转换

    一、类型转换原则

    1. 基础数据类型转换规则

    基础数据类型转换主要在在 赋值、方法调用、算术运算 三种情况下发生。

    (1) 赋值和方法调用规则

    从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类型转换:

    • 布尔型和其它基本数据类型之间不能相互转换; 
    • byte型可以转换为short、int、、long、float和double; 
    • short可转换为int、long、float和double; 
    • char可转换为int、long、float和double; 
    • int可转换为long、float和double; 
    • long可转换为float和double; 
    • float可转换为double; 

    另外还有是直接数的赋值:先通过直接数判断其类型,然后基本原则和上面谈到的赋值原则基本一致;只是直接数是整数时特殊一点,当在可表示范围内时,可以直接赋值给 byte short char三种类型;

    (2) 算术运算规则

    a. 基本就是先转换为高位数据类型,再参加运算,结果也是最高位的数据类型;

    b. byte short char运算会转换为Int;

    • 如操作数之一为double,则另一个操作数先被转化为double,再参与算术运算。 
    • 如两操作数均不为double,当操作数之一为float,则另一操作数先被转换为float,再参与运算。 
    • 如两操作数均不为double或float,当操作数之一为long,、则另一操作数先被转换为long,再参与算术运算。 
    • 如两操作数均不为double、float或long,则两操作数先被转换为int,再参与运算。

    特殊情况:

    • 如采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换为目标变量的类型。
    • 当运算符为自动递增运算符(++)或自动递减运算符(--)时,如果操作数为byte,short或char类型不发生改变;
    2. 引用类型转换规则
    • 基本类型 与 对应包装类 可自动转换,这是自动装箱和折箱的原理;
    • 两个引用类型间转换:
      • 子类能直接转换为父类 或 接口类型;
      • 父类转换为子类要 强制类型转换;且在运行时若实际不是对应的对象,会抛出ClassCastException运行时异常;

    二、数组与List的互换

    1. 数组转java.util.ArrayList

    调用Arrays的asList方法。此方法返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元素的数组。否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。

    注:对数组的修改会反映到list中,而且Arrays.asList()返回的不是java.util.ArrayList,而是Arrays的内部类java.util.Arrays.ArrayList,不支持add和remove的操作。想要创建一个真正的 ArrayList类,可以这样做new ArrayList<String>(Arrays.asList(arr));

    2. java.util.ArrayList转数组

    调用ArrayList的toArray方法。此方法返回一个受指定数组支持的固定大小的列表。(对列表的修改不会返回到数组中)。

    java.util.List list = new java.util.ArrayList();
    list.add("1");
    list.add("2");
    /**
     * 错误转换: 这样写编译没有什么问题,但是运行时会报ClassCastException,
     * 这是因为Java中允许向上和向下转型,但是这个转型是否成功是根据Java虚拟机中这个对象的
     * 类型来实现的。Java虚拟机中保存了每个对象的类型。而数组也是一个对象。
     * 数组的类型是java.lang.Object。把java.lang.Object转换成java.lang.String是显然不可能的事情,
     * 因为这里是一个向下转型,而虚拟机只保存了这是一个Object的数组,不能保证数组中的元素是String
     * 的,所以这个转型不能成功。数组里面的元素只是元素的引用,不是存储的具体元素,
     * 所以数组中元素的类
     */
    //String[] arr = (String[])list.toArray();
    //正确转换, 而且需要预先申请好数组空间
    String[] arr = (String[])list.toArray(new String[list.size()]);

    数组转为Set也是一样的。

    三、List 和 Set互转

    因为List和Set都实现了Collection接口,且addAll(Collection<? extends E> c);方法,因此可以采用addAll()方法将List和Set互相转换;另外,List和Set也提供了Collection<? extends E> c作为参数的构造函数,因此通常采用构造函数的形式完成互相转化。

    //List转Set
    Set<String> set = new HashSet<>(list);
    System.out.println("set: " + set);
    //Set转List
    List<String> list_1 = new ArrayList<>(set);
    System.out.println("list_1: " + list_1);

    和toArray()一样,被转换的List(Set)的修改不会对被转化后的Set(List)造成影响。

  • 相关阅读:
    maven 利用 profile 进行多环境配置
    基于 TrueLicense 的项目证书验证
    SpringMVC 自定义参数解析器.
    Spring MVC -- 基于注解的控制器
    Spring MVC -- Spring MVC入门
    Spring MVC -- MVC设计模式(演示4个基于MVC框架的案例)
    Spring MVC -- Spring框架入门(IoC、DI以及XML配置文件)
    Servlet2.5版本和Servlet3.0版本
    Java基础 -- 深入理解泛型
    Java基础 -- 深入理解Java类型信息(Class对象)与反射机制
  • 原文地址:https://www.cnblogs.com/myitnews/p/12316159.html
Copyright © 2011-2022 走看看