• Java 常见类型转换


    环境:jdk8

    在常用的方法中添加了下划线。

    Array to List/Set

    Arrays.asList

    List<Integer> list = Arrays.asList(new Integer[]{1, 2, 3});
    // 可简写为
    List<Integer> list = Arrays.asList(1, 2, 3);
    

    注意一:不能写成如下形式,即使用 int[] 作为参数。
    List<Integer> list = Arrays.asList(new int[]{1, 2, 3});
    因为 Arrays.asList 需要传入 T... a(变长参数),即传入对象或对象数组。若传入 int[] 作为参数,返回类型将为 List<int[]>

    注意二:得到的集合实际上是 java.util.Arrays.ArrayList,即 Arrays 的私有静态内部类,而不是 java.util.ArrayListjava.util.Arrays.ArrayList 类具有 set()get()contains() 方法,但是没有 add()remove() 方法。即不能对其进行增删,只能修改和查询。
    同时,对原数组的修改会同时改变获得的 List
    Arrays.asList 的作用更像是将 Array 包装起来使其看起来像一个 List
    若想进一步得到可变集合,可以使用:
    Set set = new HashSet(Arrays.asList(array));
    List list = new ArrayList(Arrays.asList(array));

    Collections.addAll

    List<Integer> list = new ArrayList<>();
    
    Collections.addAll(list, new Integer[]{1, 2, 3});
    // 可简写为
    Collections.addAll(list, 1, 2, 3);
    // 也可以用于 Set,此处略
    

    注意一:同 Arrays.asList 的注意一,即不能传入 int[] 作为参数。
    Collections.addAll(new ArrayList<Integer>(), new int[]{1, 2, 3});

    List/Set to Array

    list.toArray

    此处主要参考廖雪峰的 Java 教程

    list.toArray 有两个重载的方法:

    • Object[] toArray()
    • <T> T[] toArray(T[] a)

    第一种方法会返回 Object[],丢失类型信息,所以实际应用很少。

    第二种方法源码如下:

        public <T> T[] toArray(T[] a) {
            if (a.length < size)
                // Make a new array of a's runtime type, but my contents:
                return (T[]) Arrays.copyOf(elementData, size, a.getClass());
            System.arraycopy(elementData, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
        }
    

    如果传入的数组不够大,那么 List 内部会创建一个新的刚好够大的数组,填充后返回;如果传入的数组比 List 元素还要多,那么填充完元素后,剩下的数组元素一律填充 null

    常见使用方法如下:

    List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
    // 直接传入一个与 list 大小相等的数组
    Integer[] array = list.toArray(new Integer[list.size()]);
    

    List and Set

    addAll

    方法签名为:addAll(Collection<? extends E> c)

    同时 ListSet 都实现了 Collection 接口,所以可以采用如下方法进行转换。

    // List 转 Set
    List<Integer> list = new ArrayList<>();
    Set<Integer> set = new HashSet<>();
    set.addAll(list);
    

    constructor

    ArrayListHashSet 也都提供了 Collection<? extends E> c 作为参数的构造函数。(实际上,底层调用的就是 addAll

    可以直接使用构造函数的形式完成互相转化。

    // Set 转 List
    List<Integer> list = new ArrayList<>(new HashSet<>());
    // List 转 Set
    Set<Integer> set = new HashSet<>(new ArrayList<>());
    

    char[] to String

    constructor

    构造函数签名:String(char value[])

    char[] charArr = {'a', 'b', 'c'};
    String s = new String(charArr);
    

    String.valueOf

    char[] charArr = {'a', 'b', 'c'};
    String s = String.valueOf(charArr);
    

    实际上底层调用的还是 String 的构造函数。

    String to char[]

    s.toCharArray

    String s = "abc";
    char[] charArr = s.toCharArray();
    

    byte[] to String

    constructor

    byte[] bs = {116, 101, 115, 116, 49, 50, 51};
    // 不推荐直接转换,而是应该指定编码格式
    String s = new String(bs);  // test123
    
    // 指定编码格式的方法
    // 方法一:推荐
    new String(bs, StandardCharsets.UTF_8);
    // 方法二:不推荐(需要使用 try/catch 来捕获 UnsupportedEncodingException 异常)
    new String(bs, "utf8");
    /* 以下几种都可以识别成 utf-8
    new String(bs, "UTF-8");
    new String(bs, "uTf8");
    new String(bs, "UtF-8");
    */
    

    String to byte[]

    s.getByte

    String s = "test123";
    // 不推荐直接转换,而是应该指定编码格式
    byte[] bs = s.getBytes();
    
    // 指定编码格式的方法
    // 方法一:推荐
    s.getBytes(StandardCharsets.UTF_8);
    // 方法二:不推荐(需要使用 try/catch 来捕获 UnsupportedEncodingException 异常)
    s.getBytes("utf-8");
    

    int to String

    + ""

    String s = 123 + "";
    

    不推荐。效率低,本质上是新建了 StringBuilder 对象。

    String.valueOf

    String s = String.valueOf(123);
    

    实际上是调用了接下来的 Integer.toString

    Integer.toString

    String s = Integer.toString(123);
    

    String to int

    Integer.parseInt

    int i = Integer.parseInt("123");
    

    转换内容格式错误(如超过整型范围、含有字母、特殊字符等)会抛出 NumberFormatException

    Integer.valueOf

    Integer integer = Integer.valueOf("123");
    int i = integer.intValue();
    // 也可以使用自动拆箱
    int i = Integer.valueOf("123");
    

    实际上在底层调用了 parseInt

    public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
    
  • 相关阅读:
    学习链接
    【转】C#学习路线WinForm学习路线
    WPF 等待动画控件
    wpf 设置窗体在屏幕的初始位置
    WPF 添加右键菜单 自定义透明控件
    记录自己的点滴
    Linux下的mysql默认大小写敏感
    springboot+mybatis遇到BUG:自动注入失败
    springboot在阿里CentOS 7后台永久运行
    阿里云CentOS7 64位安装jdk8和mysql5.6.43及远程连接mysql
  • 原文地址:https://www.cnblogs.com/varc/p/15609741.html
Copyright © 2020-2023  润新知