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));
}
posted @ 2021-11-26 22:01  YL给力啊  阅读(117)  评论(0编辑  收藏  举报