Java中Arrays的asList()方法

2017-03-28 09:27:41

Java中Arrays的asList()方法 可以将 数组转为List 但是,这个数组类型必须是 引用类型的,如果是8中基本数据类型就不可以 原因如下,引用别人的一篇文章:



最近在用Arrays的asList()生成的List时,List元素的个数时而不正确。


Java代码

//经多次测试,只要传递的基本类型的数组,生成List的元素个数均为1  
char arrc = {'a','b'};  
int  arrint = {1,2,4};  
Arrays.asList(arrc).size() ;//  结果为1;  
Arrays.asList(arrint ).size() ;//结果为1;  
   
//传递对象数组,元素个数正确。  
String arrstr = {"a","b","java","spring","hadoop","lucene"};  
Arrays.asList(arrstr ).size() ;//结果为6;  
跟源码:


Java代码  


  public static <T> List<T> asList(T... a) {  
 return new ArrayList<T>(a);  
}  
继续跟,Arrays的私有内部类ArrayList  (没搞明白,为什么这里也起名为ArrayList)


private final E[] a;  
  
ArrayList(E[] array) {  
           if (array==null)  
               throw new NullPointerException();  
    a = array;  
}  
  
public int size() {  
    return a.length;  
}  
发现问题出在java5 的可变参数上。于是写了demo,测试。


public class TestArray {  
    PrintStream out = System.out;  
    @Test  
    public void array() {  
        char[] arrc = {'a','b','c','d','e'};  
        out.println("传递char数组:");  
        print(arrc);  
        out.println("直接传递:");  
        print('a','b','c','d','e');  
        out.println("----------------------------");  
          
        int[] arri = {1,2,3,4,5,6,7};  
        out.println("传递int数组:");  
        print(arri);  
        out.println("直接传递:");  
        print(1,2,3,4,5,6,7);  
        out.println("----------------------------");  
          
        Integer[] arrInt = {1,2,3,4,5,6,7};  
        out.println("传递Integer数组:");  
        print(arrInt);  
        out.println("直接传递:");  
        print(1,2,3,4,5,6,7);  
        out.println("----------------------------");  
          
        String[] arrs = {"a","b","c","d","e"};  
        out.println("传递String数组:");  
        print(arrs);  
        out.println("直接传递:");  
        print('a','b','c','d','e');  
        out.println("----------------------------");  
    }  
      
    public void print(Object...arr){  
        out.print("内容:"+Arrays.toString(arr));  
        out.println("\t\t数组长度:"+arr.length+" ");  
    }  
}  
输出结果为:


传递char数组:  
内容:[[C@defa1a]      数组长度:1   
直接传递:  
内容:[a, b, c, d, e]      数组长度:5   
----------------------------  
传递int数组:  
内容:[[I@f5da06]      数组长度:1   
直接传递:  
内容:[1, 2, 3, 4, 5, 6, 7]        数组长度:7   
----------------------------  
传递Integer数组:  
内容:[1, 2, 3, 4, 5, 6, 7]        数组长度:7   
直接传递:  
内容:[1, 2, 3, 4, 5, 6, 7]        数组长度:7   
----------------------------  
传递String数组:  
内容:[a, b, c, d, e]      数组长度:5   
直接传递:  
内容:[a, b, c, d, e]      数组长度:5   
----------------------------  
java 5 可变参数,直接传递值与传递数组处理的机制不太相同。


如果直接传递数组,基本类型数组将被视为一个对象而不会被解析成数组,如果直接传递参数将能正常解析。因此传递基本类型数组时强烈建议转为其封装类对象的数组  int ->Integer ,long->Long …………。(未对其封装)




这样写就很清楚了吧
public static void main(String[] args) {
  int[] intArray = {1,2,3};
  List<int[]> myList = Arrays.asList(intArray);
  System.out.println(myList.size());
  System.out.println(myList.get(0).length);


}


大概明白了:定义:


public static <T> List<T> asList(T... a) { 
return new ArrayList<T>(a); 
}


这个T必须是对象类型。好比我们不能new ArrayList<int> 只能new ArrayList<Integer>


  • 2020-12-16 22:46:44

    基于coturn项目的stun/turn服务器搭建

    webrtc是google推出的基于浏览器的实时语音-视频通讯架构。其典型的应用场景为:浏览器之间端到端(p2p)实时视频对话,但由于网络环境的复杂性(比如:路由器/交换机/防火墙等),浏览器与浏览器很多时候无法建立p2p连接,只能通过公网上的中继服务器(也就是所谓的turn服务器)中转。示例图如下:

  • 2020-12-16 23:06:05

    Rocket.Chat推送信息

    Rocket.Chat推送消息 Rocket.Chat是一个开源实时通讯平台, 支持Windows, Mac OS, Linux. 支持聊天, 文件上传, 视频通话, 语音通话功能. 向Rocket.Chat推送消息 以下示例可以转为别的语言的版本, 本示例使用Linux平台的curl测试, curl非常强大. 登陆 首先需要登陆Rocket.Chat服务器

  • 2020-12-17 09:01:23

    对BitTorrent Tracker源码分析

    tracker服务器是BT下载中必须的角色。一个BT client 在下载开始以及下载进行的过程中,要不停的与 tracker 服务器进行通信,以报告自己的信息,并获取其它下载client的信息。这种通信是通过 HTTP 协议进行的,又被称为 tracker HTTP 协议,它的过程是这样的: client 向 tracker 发一个HTTP 的GET请求,并把它自己的信息放在GET的参数中;这个请求的大致意思是:我是xxx(一个唯一的id),我想下载yyy文件,我的ip是aaa,我用的端口是bbb。。。

  • 2020-12-17 10:55:48

    html5 video p2p research

    节约带宽,减少缓冲时间,提升服务质量,处理峰值流量, 视频观看的人越多,播放越流畅。

  • 2020-12-17 10:57:34

    使用 MediaSource 搭建流式播放器

    Media Source Extensions(媒体源扩展)大大地扩展了浏览器的媒体播放功能,提供允许JavaScript 生成媒体流。这可以用于自适应流(adaptive streaming,也是我毕设的研究方向)及随时间变化的视频直播流(live streaming)等应用场景。

  • 2020-12-17 11:00:37

    H5流式播放(FMP4转封装与mediaSource)

    W3C上有明确关于mediaSource 扩展接口的文档。mediaSource 扩展文档中是这么定义的, 它允许JS脚本动态构建媒体流用于和,允许JS传送媒体块到H5媒体元素。这种接口的应用可以让h5播放器实现持续添加数据进行播放。做as的朋友都知道as中的appendBytes方法,一种添加二进制数据进行播放的方式。这两种接口在概念上是类似的。只是里面的定义和对媒体文件的要求有所不同。对于mediaSource扩展接口我只介绍我们主要应用的几个。