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

  1 最近在用Arrays的asList()生成的List时,List元素的个数时而不正确。
  2
  3 Java代码
  4
  5 //经多次测试,只要传递的基本类型的数组,生成List的元素个数均为1
  6 char arrc = {‘a‘,‘b‘};
  7 int  arrint = {1,2,4};
  8 Arrays.asList(arrc).size() ;//  结果为1;
  9 Arrays.asList(arrint ).size() ;//结果为1;
 10
 11 //传递对象数组,元素个数正确。
 12 String arrstr = {"a","b","java","spring","hadoop","lucene"};
 13 Arrays.asList(arrstr ).size() ;//结果为6;
 14 跟源码:
 15
 16 Java代码
 17
 18   public static <T> List<T> asList(T... a) {
 19  return new ArrayList<T>(a);
 20 }
 21 继续跟,Arrays的私有内部类ArrayList  (没搞明白,为什么这里也起名为ArrayList)
 22
 23 private final E[] a;
 24
 25 ArrayList(E[] array) {
 26            if (array==null)
 27                throw new NullPointerException();
 28     a = array;
 29 }
 30
 31 public int size() {
 32     return a.length;
 33 }
 34 发现问题出在java5 的可变参数上。于是写了demo,测试。
 35
 36 public class TestArray {
 37     PrintStream out = System.out;
 38     @Test
 39     public void array() {
 40         char[] arrc = {‘a‘,‘b‘,‘c‘,‘d‘,‘e‘};
 41         out.println("传递char数组:");
 42         print(arrc);
 43         out.println("直接传递:");
 44         print(‘a‘,‘b‘,‘c‘,‘d‘,‘e‘);
 45         out.println("----------------------------");
 46
 47         int[] arri = {1,2,3,4,5,6,7};
 48         out.println("传递int数组:");
 49         print(arri);
 50         out.println("直接传递:");
 51         print(1,2,3,4,5,6,7);
 52         out.println("----------------------------");
 53
 54         Integer[] arrInt = {1,2,3,4,5,6,7};
 55         out.println("传递Integer数组:");
 56         print(arrInt);
 57         out.println("直接传递:");
 58         print(1,2,3,4,5,6,7);
 59         out.println("----------------------------");
 60
 61         String[] arrs = {"a","b","c","d","e"};
 62         out.println("传递String数组:");
 63         print(arrs);
 64         out.println("直接传递:");
 65         print(‘a‘,‘b‘,‘c‘,‘d‘,‘e‘);
 66         out.println("----------------------------");
 67     }
 68
 69     public void print(Object...arr){
 70         out.print("内容:"+Arrays.toString(arr));
 71         out.println("\t\t数组长度:"+arr.length+" ");
 72     }
 73 }
 74 输出结果为:
 75
 76 传递char数组:
 77 内容:[[[email protected]]      数组长度:1
 78 直接传递:
 79 内容:[a, b, c, d, e]      数组长度:5
 80 ----------------------------
 81 传递int数组:
 82 内容:[[[email protected]]      数组长度:1
 83 直接传递:
 84 内容:[1, 2, 3, 4, 5, 6, 7]        数组长度:7
 85 ----------------------------
 86 传递Integer数组:
 87 内容:[1, 2, 3, 4, 5, 6, 7]        数组长度:7
 88 直接传递:
 89 内容:[1, 2, 3, 4, 5, 6, 7]        数组长度:7
 90 ----------------------------
 91 传递String数组:
 92 内容:[a, b, c, d, e]      数组长度:5
 93 直接传递:
 94 内容:[a, b, c, d, e]      数组长度:5
 95 ----------------------------
 96 java 5 可变参数,直接传递值与传递数组处理的机制不太相同。
 97
 98 如果直接传递数组,基本类型数组将被视为一个对象而不会被解析成数组,如果直接传递参数将能正常解析。因此传递基本类型数组时强烈建议转为其封装类对象的数组  int ->Integer ,long->Long …………。(未对其封装)
 99
100
101 这样写就很清楚了吧
102 public static void main(String[] args) {
103   int[] intArray = {1,2,3};
104   List<int[]> myList = Arrays.asList(intArray);
105   System.out.println(myList.size());
106   System.out.println(myList.get(0).length);
107
108 }
109
110 大概明白了:定义:
111
112 public static <T> List<T> asList(T... a) {
113 return new ArrayList<T>(a);
114 }
115
116 这个T必须是对象类型。好比我们不能new ArrayList<int> 只能new ArrayList<Integer>
时间: 2024-11-05 12:18:25

【转载】最近在用Arrays的asList()生成的List时,List元素的个数时而不正确的相关文章

linux 生成动态库时提示relocation R_X86_64_32 against `.rodata&#39; can not be used when making a shared object;

linux生成动态库时遇到了relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC错误. 由于我的系统是AMD64位的,所以需要在编译的时候添加 -fPIC选项 解决方法: 例如: g++ -c -fPIC head.cpp    生成head.o g++ -fpic -shared -o libfun.so head.o linux 生成

关于VS2012 生成或调试时无响应的另一种情况

最近在做一个项目,差不多结尾了. 然后某天发现,生成和调试都会卡好一会(差不多要1分钟吧)才可以正常开始. 然后各种找问题,重装VS,重装系统,什么中文输入法,结果都一样. 最后只能怀疑是项目 问题了,后来想起来主窗口使用了一个自己写的用户控件,这个控件是容器来的,然后里面的控件全部变成空白了,当然之前是正常的,后来不知道为什么变成这样,然后我就自己手动将控件添加回去这个控件内 在Form1.Designer.cs文件内的 this.xxxx.Controls.Add(this.button3)

visual 2008中error PRJ0003 : 生成 cmd.exe 时出错

visual 2008中error PRJ0003 : 生成 cmd.exe 时出错”,   和vs2008 sp1没关系 解决方案:工具—>选项—>项目和解决方案—>VC++目录,在可执行文件栏中加上如下路径: $(SystemRoot)/System32$(SystemRoot) 现在运行成功了,输出内容: ------ 已启动生成: 项目: Game, 配置: Debug Win32 ------ visual 2008中error PRJ0003 : 生成 cmd.exe 时出错

chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]

chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文: 默认情况下如下图 Y轴并不是从0开始,这样折现图的幅度会很大,不是正常的幅度,解决办法如下, 示例代码: window.onload = function () { var ctx = document.getElementById("canvas").getContext("2d"); window.myLine = new Chart(ctx).Line(lineChartDat

【JAVA】使用Eclipse依赖生成jar包时,避免最外层同时生成资源文件的配置。

使用Eclipse依赖生成jar包时,如果做配置,生成的jar包文件会全部生成在外面,这并不是我们需要的,下面我们一起来修改下配置,使生成的jar包符合我们的需求吧. 1.如果不做任何配置生成的jar包如下. 这样最原始的生成方式并不是我们想要的,我们想要的是test.properties和ums.properties文件同时放到message文件夹里面,下面修改一下Eclipse配置. 2.修改Eclipse配置,使test.properties和ums.properties文件同时放到mes

PHP“Cannot use object of type stdClass as array” (php在调用json_decode从字符串对象生成json对象时的报错)

php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误 错误:Cannot use object of type stdClass as array 产生原因: +展开 -PHP $res = json_decode($res); $res['key']; //把 json_decode() 后的对象当作数组使用. 解决方法(2种):1.使用 json_decode($d, true).就是使json_decode 的第二个变量设置为 tru

在生成.psm文件时,提示: CREATE SYMBOL BEGUN.

在生成.psm文件时,提示: CREATE SYMBOL BEGUN.  Symbol is missing a refdes.  Symbol is missing a refdes.  CREATE SYMBOL ABORTED.  Create Symbol Aborted, error = Symbol is missing a refdes. 的解决方法: 选择:LAYOUT-->Label-->RefDes 然后在右边Options的Active Class and Subclas

使用mybatis生成相关文件时java.sql.SQLException: Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password)

问题:使用mybatis生成相关文件时,dos显示java.sql.SQLException: Access denied for user 'root'@'localhost' (using password) 解决方式:1,先检查数据库的配置文件密码是否错误, 2,检查mybatis-generator.xml的密码是否与数据库的密码相等,因为这个文件的密码不会影响到后台的数据,所以最容易被忽略,造成后台数据可以正常读取,而mybatis却不能生成相关的文件. 使用mybatis生成相关文件

py2exe 生成exe文件时提示找不到某模块

如题,打开python,import chardet没问题,但是使用py2exe时总提示chardet找不到... 由于chardet安装是下载的tar.gz文件解压后,python setup.py install 安装的(windows),不得不将解压后的文件夹里的chardet文件夹拷贝到C:\Python27\Lib\site-packages路径下,结果ok了 py2exe 生成exe文件时提示找不到某模块