zoukankan      html  css  js  c++  java
  • 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));
    }
    
  • 相关阅读:
    UVa 12174 (滑动窗口) Shuffle
    UVa 1607 (二分) Gates
    CodeForces ZeptoLab Code Rush 2015
    HDU 1525 (博弈) Euclid's Game
    HDU 2147 (博弈) kiki's game
    UVa 11093 Just Finish it up
    UVa 10954 (Huffman 优先队列) Add All
    CodeForces Round #298 Div.2
    UVa 12627 (递归 计数 找规律) Erratic Expansion
    UVa 714 (二分) Copying Books
  • 原文地址:https://www.cnblogs.com/varc/p/15609741.html
Copyright © 2011-2022 走看看