数组转换成list集合_字符串转数组js

数组转换成list集合_字符串转数组js==================类型转换==================  在项目中经常会遇到数组转集合、集合转数组、数组之间类型转换等操作1.数组转集合为了实现把一个数组转换成一个ArrayList,很多Java程序员会使用如下的代码:Stringstr[]={“1″,”2″,”3”};List<String>strings=Arrays.asList(str);  Arrays.asList确实会返回一个Arr.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

==================类型转换==================

  在项目中经常会遇到数组转集合、集合转数组、数组之间类型转换等操作

 

1.数组转集合

为了实现把一个数组转换成一个ArrayList,很多Java程序员会使用如下的代码:

        String str[] = {"1","2","3"};
        List<String> strings = Arrays.asList(str);

  Arrays.asList确实会返回一个ArrayList对象,但是该类是Arrays类 中一个私有静态内部类,而不是常见的java.util.ArrayList类。这个java.util.Arrays.ArrayList类具有 set(),get(),contains()等方法,但是不具有任何添加或移除元素的任何方法。因为该类的大小(size)是固定的。如果添加元素是会报错的(但是如果转换后的集合只是用来进行查询不进行增加元素也可以这样转换):

        String str[] = {"1","2","3"};
        List<String> strings = Arrays.asList(str);
        strings.add("eee");

 

报错如下:

Exception in thread “main” java.lang.UnsupportedOperationException

at java.util.AbstractList.add(AbstractList.java:148)

at java.util.AbstractList.add(AbstractList.java:108)

at Test.test1(Test.java:31)

at Test.main(Test.java:24)

 

为了创建出一个真正的ArrayList,代码应该如下所示:(这种方法创建的集合可以进行集合的增加)

        String str[] = {"1","2","3"};
        List<String> strings = new ArrayList<String>(Arrays.asList(str));
        strings.add("4");
        System.out.println(strings);

 

更加高效的代码如下:

        String str[] = {"1","2","3"};
        List<String> strings = new ArrayList<String>(str.length);
        Collections.addAll(strings,str);
        strings.add("4");
        System.out.println(strings);

 

2.集合转数组

(1)错误演示

很多人习惯下面用法:

        List<String> strings = new ArrayList<String>();
        String[] objects = (String[]) strings.toArray();

 

编译通过,运行报错如下:

Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

at Test.test1(Test.java:32)

at Test.main(Test.java:26)

学过JVM的应该知道上面的意思是Object数组不能转变为String数组。[代表以为数组,L代表数组的元素是引用类型,后面是具体的元素类型

  对于这个现象我们可以这么解释:Java中允许向上和向下转型,但是这个转型是否成功是根据Java虚拟机中这个对象的类型来实现的。Java虚拟机中保存 了每个对象的类型。而数组也是一个对象。数组的类型是[Ljava.lang.Object。把[Ljava.lang.Object转换成 [Ljava.lang.String是显然不可能的事情,因为这里是一个向下转型,而虚拟机只保存了这是一个Object的数组,不能保证数组中的元素 是String的,所以这个转型不能成功。数组里面的元素只是元素的引用,不是存储的具体元素,所以数组中元素的类型还是保存在Java虚拟机中的。

根据上面的解释,我们可以把这个问题归纳到下面这个模型:

Object objs[]=new Object[10];
String strs[]=(String[])objs;

 

这样子和刚才上面编译错误是一样的。如果我们修改一下这个代码,如下:

String strs[]=new String[10];
Object objs[]=strs;

 

这样子就可以编译通过了。所以这个问题我们可以归结为一个Java转型规则的问题。

 

(2)正确的做法:(延伸一点直接打印数组打印的是数组的)

最菜鸡的做法是:

复制代码

        List<String> list = new ArrayList<String>();
        list.add("1");
        String strings[]=new String[list.size()];
        for(int i=0,j=list.size();i<j;i++){
            strings[i]=list.get(i);
        }

        System.out.println(strings);
        System.out.println(strings.getClass());
        System.out.println(Arrays.toString(strings));

复制代码

结果:

[Ljava.lang.String;@20724356

class [Ljava.lang.String;

[1]

 

比较简便的做法:

复制代码

        List<String> list = new ArrayList<String>();
        list.add("1");
        String[] strings = new String[list.size()];
        list.toArray(strings);

        System.out.println(strings);
        System.out.println(strings.getClass());
        System.out.println(Arrays.toString(strings));

复制代码

结果同上。

 

3.数组转数组–代码用到了commons-beanutils包

最常见的就是字符串数组类型转int、long数组,或者字符串类型转Integer、Long、Integer型转int(也就是包装类型转原始类型)。

最原始的for循环转换赋值在这里就不试了。

 

数组类型的转换:

复制代码

import org.apache.commons.beanutils.ConvertUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        String str[] = { "1", "2", "3" };

       // 字符串数组转long数组
        long[] str2lon = (long[]) ConvertUtils.convert(str, long.class);
        System.out.println(str2lon);
        // 字符串数组转Long数组
        Long[] str2Lon = (Long[]) ConvertUtils.convert(str, Long.class);
        System.out.println(str2Lon);


        // 字符串数组转int数组
        int[] str2int = (int[]) ConvertUtils.convert(str, int.class);
        System.out.println(str2int);
        // 字符串数组转Integer数组
        Integer[] str2Int = (Integer[]) ConvertUtils.convert(str, Integer.class);
        System.out.println(str2Int);

        // int型数组转为String数组
        String int2Str[] = (String[]) ConvertUtils.convert(str2int, String[].class);
        System.out.println(int2Str);
        // Integer型数组转为String数组
        String Int2Str[] = (String[]) ConvertUtils.convert(str2Int, String[].class);
        System.out.println(Int2Str);

        // long型数组转为String数组
        String lon2str[] = (String[]) ConvertUtils.convert(str2lon, String[].class);
        System.out.println(lon2str);
        String Lon2str[] = (String[]) ConvertUtils.convert(str2Lon, String[].class);
        System.out.println(Lon2str);
    }
}

复制代码

[J@15a6d5e1

[Ljava.lang.Long;@7c23b1e1

[I@b736a73

[Ljava.lang.Integer;@4651a9e4

[Ljava.lang.String;@1b68dbcd

[Ljava.lang.String;@1367dca

[Ljava.lang.String;@207c5965

[Ljava.lang.String;@43d1068c

 

关于包装类型转原始类,可以用commons-lang包的ArrayUtils操作,参考:https://www.cnblogs.com/qlqwjy/p/9467178.html

 

 补充:补充一点JVM相关知识

在Java中,任何类型都有class,包括基本数据类型与void。在Java中 [   代表数组,  [[  代表二维数组。依次类推。

其他的描述标识符如下:

B—基本数据类型byte

C—基本数据类型char

D—基本数据类型double

F—基本数据类型float

I—基本数据类型int

J—基本数据类型long

S—基本数据类型short

Z—基本数据类型boolean

V—特殊类型void

L—对象类型(也就是引用类型)。例如 Ljava/lang/Object.

 

需要注意的是八种基本数据类型也有  calss,而且其对应包装类型有一个TYPE成员变量就是其基本数据类型。特殊类型void也有class。基本类型的数组与引用类型数组也都有class

public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");

 

例如:

复制代码

        System.out.println(int.class);
        System.out.println(Integer.class);
        System.out.println(Integer.TYPE);

        System.out.println(Integer[].class);
        System.out.println(int[].class);
        System.out.println(void.class);

复制代码

结果:

int
class java.lang.Integer
int
class [Ljava.lang.Integer;
class [I
void

 

注意int不是对象,所以没有getClass方法。只有int.class

 

 

==================数组与集合排序==================

  JDK自带的排序方法可以满足大部分要求。我们知道要在集合中排序,需要使用可以排序的集合或者自己手动排序。使用可排序的集合如TreeMap,TreeSet。如果手动排序就是用Collections.sort传入一个比较器即可。

 

 1.数组排序

  在使用Arrays.sort()对int、double、long等基本类型的数组进行排序时,只有正序排序的方法。要实现倒序排序,只有使用Integer、Double、Long等代替。

  包装类型比较的时候可以传入比较器,如下:

复制代码

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

public class PlainTest {

    public static void main(String[] args) {
        // 基本数据类型Arrays.sort正序
        char[] chars = { 'a', 'b', 'd', 'e', 'c', 'e', 'd', 'a' };
        Arrays.sort(chars);
        System.out.println(chars);

        // 原生数组正序
        Character[] characters = { 'a', 'b', 'd', 'e', 'c', 'e', 'd', 'a' };
        Arrays.sort(characters);
        System.out.println(Arrays.toString(characters));

        // 原生数组逆序
        Arrays.sort(characters, Collections.reverseOrder());
        System.out.println(Arrays.toString(characters));

        // 自己实现逆序号排序
        Arrays.sort(characters, new Comparator<Character>() {
            @Override
            public int compare(Character o1, Character o2) {
                if (o1 > o2) {
                    return -1;
                } else if (o1 < o2) {
                    return 1;
                }
                return 0;
            }
        });
        System.out.println(Arrays.toString(characters));
    }

}

复制代码

结果:

aabcddee
[a, a, b, c, d, d, e, e]
[e, e, d, d, c, b, a, a]
[e, e, d, d, c, b, a, a]

 

查看源码:(逆序是通过反转compare来实现的)

复制代码

    public static <T> Comparator<T> reverseOrder() {
        return (Comparator<T>) ReverseComparator.REVERSE_ORDER;
    }

    private static class ReverseComparator
        implements Comparator<Comparable<Object>>, Serializable {

        private static final long serialVersionUID = 7207038068494060240L;

        static final ReverseComparator REVERSE_ORDER
            = new ReverseComparator();

        public int compare(Comparable<Object> c1, Comparable<Object> c2) {
            return c2.compareTo(c1);
        }

        private Object readResolve() { return reverseOrder(); }
    }

复制代码

 

2.集合排序

  集合排序与数组类似。

复制代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class PlainTest {

    public static void main(String[] args) {
        Character[] characters = { 'a', 'b', 'd', 'e', 'c', 'e', 'd', 'a' };
        List<Character> list = new ArrayList<Character>(Arrays.asList(characters));
        System.out.println(list);

        // 集合正序
        Collections.sort(list);
        System.out.println(list);

        // 集合逆序
        Collections.sort(list, Collections.reverseOrder());
        System.out.println(list);

        // 自己实现逆序号排序
        Collections.sort(list, new Comparator<Character>() {
            @Override
            public int compare(Character o1, Character o2) {
                if (o1 > o2) {
                    return -1;
                } else if (o1 < o2) {
                    return 1;
                }
                return 0;
            }
        });
        System.out.println(list);
    }

}

复制代码

结果:

[a, b, d, e, c, e, d, a]
[a, a, b, c, d, d, e, e]
[e, e, d, d, c, b, a, a]
[e, e, d, d, c, b, a, a]

 

转自:https://www.cnblogs.com/qlqwjy/p/10010205.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193540.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 常见音频编码格式解析

    常见音频编码格式解析常见音频编码格式解析常见音频编码格式解析MP3编码格式1MP3概述2MPEG音频压缩基础3MPEGLayer3编解码的基本原理4整个MP3文件结构41ID3V242音频数据帧43ID3v1AAC编码格式1AAC概述2AAC扩展名3AAC规格4AAC特点5AAC音频格式解析51AAC音频格式有ADIFADTSLATM52ADIF和ADTS的header53ADIF和

  • linux安装telnet服务「建议收藏」

    linux安装telnet服务「建议收藏」文章目录前言一、telnet是什么?二、使用步骤1.安装telent2、重新启动守护进程3、测试总结前言最新公司需要迁移项目需要用到telnet命令,趁此机会做个总结归纳提示:以下是本篇文章正文内容,下面案例可供参考一、telnet是什么?telnet是一种简单的基于文本的网络协议,用于通过“TCP/IP”网络访问远程计算机和终端;telnet为用户提供了一个双向的交互式文本通信系统,该系统使用超过8字节的虚拟终端连接。二、使用步骤1.安装telent步骤如下:tep1、rpm.

    2022年10月28日
  • 12个最好的JavaScript动画框架

    12个最好的JavaScript动画框架1.Scripty2scripty2是一个用于基于HTML的高级用户界面的开源JavaScript框架。或者简单地说,scripty2帮助你构建一个更美味的网络:视觉效果,UI组件和CSS实用程序。scripty2是script.aculo.us的完全重写和重新实现,具有模块化结构,旨在简化高度自定义的用户界面效果和行为的开发。2.JSAnimjsAnim

  • Linux 设置oracle1521端口[通俗易懂]

    Linux 设置oracle1521端口[通俗易懂]centos5安装oracle实现其他机器连接,oracleserver与其他机器可以ping通,但由于linux防火墙默认是不开启1521端口的,应此需设置iptables;开始用命令设置:iptables-AINPUT-ptcp–dport1521-jACCEPTiptables-AOUTPUT-ptcp–sport1521-jACCEPT

  • clion 激活码【2021免费激活】

    (clion 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~9A…

  • tree命令安装

    tree命令安装linux下文件系统是目录树的形式存在,可以通过tree命令显示查看目录树结构。但是在linux系统上并没有tree这个命令,这里进行tree命令安装的讲述。安装tree命令:[root@lijinbutree-1.7.0]#tree-bash:tree:commandnotfound这表示tree命令没有安装。下载最新的tree命令源码压缩包:ftp://mama.inds

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号