Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 488|回复: 0

[Java基础知识]关于Arrays的asList()

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 17:46:20 | 显示全部楼层 |阅读模式
    最近在用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;   
          
         
        //经多次测试,只要传递的基本类型的数组,生成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;[/code]
        跟源码:
        Java代码  
       
          
          
            public static <T> List<T> asList(T... a) {   
           return new ArrayList<T>(a);   
          }   
          
         
              public static <T> List<T> asList(T... a) {
                return new ArrayList<T>(a);
        }[/code]
        继续跟,Arrays的私有内部类ArrayList  (没搞明白,为什么这里也起名为ArrayList)
       
          
          
          private final E[] a;   
             
          ArrayList(E[] array) {   
                     if (array==null)   
                         throw new NullPointerException();   
              a = array;   
          }   
             
          public int size() {   
              return a.length;   
          }   
          
         
                private final E[] a;
            ArrayList(E[] array) {
                if (array==null)
                    throw new NullPointerException();
                a = array;
            }
            public int size() {
                return a.length;
            }[/code]
        发现问题出在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("                数组长度:"+arr.length+" ");   
              }   
          }   
          
         
        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("                数组长度:"+arr.length+" ");
            }
    }[/code]
        输出结果为:
         
          
          传递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   
          ----------------------------   
          
         
        传递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
    ----------------------------
    [/code]
        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>
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 17:28 , Processed in 0.399192 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表