开发中经常用到Arrays和Collections这两个工具类. 在数组和列表之间进行切换.非常方便.但是也会遇到一些问题.

看代码:

import java.util.Arrays;
import java.util.List;public class Client {public static void main(String[] args) {int[] data = {1,2,3,4,5};List list = Arrays.asList(data);System.out.println("列表中的元素数量是:" + list.size());}}

运行结果:

列表中的元素数量是:1

为什么不是5? 事实上data确实是一个有5个元素的int类型数组,只是通过asList转换列表之后就只有一个元素了.

看Arrays.asList的方法说明:输入一个变长参数,返回一个固定长度的列表.

 1     /**
 2      * Returns a fixed-size list backed by the specified array.  (Changes to
 3      * the returned list "write through" to the array.)  This method acts
 4      * as bridge between array-based and collection-based APIs, in
 5      * combination with {@link Collection#toArray}.  The returned list is
 6      * serializable and implements {@link RandomAccess}.
 7      *
 8      * <p>This method also provides a convenient way to create a fixed-size
 9      * list initialized to contain several elements:
10      * <pre>
11      *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
12      * </pre>
13      *
14      * @param a the array by which the list will be backed
15      * @return a list view of the specified array
16      */
17     @SafeVarargs
18     public static <T> List<T> asList(T... a) {
19         return new ArrayList<>(a);
20     }

asList方法输入的是一个泛型变长参数,我们知道基本类型是不能泛型化的,也就是说8个基本类型不能作为泛型参数,要想作为泛型参数就必须使用其所对应的包装类型,那前面的例子传递了一个int类型的数组,程序为何没有编译报错?

Java中数组是一个对象,它是可以泛型化的,也就说例子中是把一个int类型的数组作为了T的类型,所以转换后在List中就只有一个类型为int数组的元素了.打印出来...

 1 import java.util.Arrays;
 2 import java.util.List;
 3
 4 public class Client {
 5
 6     public static void main(String[] args) {
 7         int[] data = {1,2,3,4,5};
 8         List list = Arrays.asList(data);
 9         System.out.println("元素类型:" + list.get(0).getClass());
10         System.out.println("前后是否相等:"+data.equals(list.get(0)));
11     }
12
13 }

运行输出:

元素类型:class [I
前后是否相等:true

放在列表中的元素是一个int数组,为什么"元素类型"后的class是"[I"?  因为JVM不可能输出Array类型,因为Array是属于java.lang.reflect包的,它是通过反射访问数组元素的工具类.在Java中任何一个数组的类都是"[I"(如果是double对应"[D",float对应的是"[F"),究其原因就是Java中并没有定义数组这个类,它是编译器编译的时候生成的,是一个特殊的类,在JDK的帮助中也没有任何数组类的信息.

修改方案,直接使用包装类即可,代码如下:

import java.util.Arrays;
import java.util.List;public class Client {public static void main(String[] args) {Integer[] data = {1,2,3,4,5};List list = Arrays.asList(data);System.out.println("列表中的元素数量是:" + list.size());}}

运行输出:

列表中的元素数量是:5

仅仅把int变成Integer,即可让输出的元素数量变成5,需要说明的是,不仅仅是int类型的数组有这个问题,其他7个基本类型的数组也都存在相似的问题.

在把基本类型数组转换成列表时,要特别小心asList方法的陷阱,避免出现程序逻辑混乱的情况.

注意:原始类型数组不能作为asList的输入参数,否则会引起程序逻辑混乱.

[改善Java代码]避开基本类型数组转换列表陷阱相关推荐

  1. [改善Java代码]用整数类型处理货币

    建议22:用整数类型处理货币. 1 public class Client { 2 public static void main(String[] args) { 3 System.out.prin ...

  2. [改善Java代码]性能考虑,数组是首选

    建议60:性能考虑,数组是首选 一.分析  数组在实际的系统开发中使用的越来越少,我们通常只有在阅读一些开源项目时才会看到它们的身影,在Java中它确实没有List.Set.Map这些集合使用起来方便 ...

  3. [改善Java代码]不推荐使用binarySearch对列表进行检索

    对一个列表进行检索时,我们使用的最多的是indexOf方法,它简单好用,而且也不会出错,虽然它只能检索到第一个符合条件的值,但是我们可以生成子列表后再检索.这样也就可以查找到所有符合条件的值了. Co ...

  4. 改善Java代码有哪些方法?

    前言 Java是一门优秀的面向对象的编程语言,针对遇到同样的一个问题会有很多中解法哪种实现方法是最好的呢,还需要不断的探究JDK的底层原理.我会例出Java改善的建议哦,希望大家可以在平时开发工作去使 ...

  5. java 数组的长度如何增加,用Java动态增加任意类型数组的长度

    用Java动态增加任意类型数组的长度 如果你需要动态增加数组大小: public  int[]  expandArray(int[]  a,  int  size)  { if  (size  < ...

  6. java数组个数无限_基于Java代码实现数字在数组中出现次数超过一半

    下文通过几种方法给大家介绍java数组数字出现次数,具体内容如下所示: 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散 ...

  7. java 代码解析工具_改善 Java 代码质量的工具与方法

    原标题:改善 Java 代码质量的工具与方法 我们可能见过上面的有关代码质量的图片,究竟如何衡量一段代码好坏? 代码质量是什么?为什么它很重要? 作家通过他的著作来讲述了一个清晰的.令人信服的故事.他 ...

  8. java下字符串和字节数组转换

    原文章地址: java下字符串和字节数组转换 http://blog.sina.com.cn/s/blog_7e8c7d560101lwta.html 1.字节数组转换为字符串 byte[] byBu ...

  9. java数组子类型_[改善Java代码]数组的真实类型必须是泛型类型的子类型

    List接口的toArray方法可以把一个结合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变. toArray(T[] a)虽然返回的是T类型的数组, ...

最新文章

  1. vc+如何添加右键弹出菜单
  2. Java从零开始学六(运算符)
  3. Chrome_调试js出现Uncaught SyntaxError: Unexpected identifier
  4. 用 JavaScript 编写测试脚本
  5. c#分页_使用Kotlin搭配Springboot开发RESTFul接口(二)自定义配置、跨域、分页
  6. 作者:卢祥虎,男,北京金信网银金融信息服务有限公司机器学习算法工程师。...
  7. Selenium2+python自动化75-非input文件上传(SendKeys)
  8. 遇见未来 | 基于软件定义存储的数据加速解决方案:让你的系统加速跑
  9. iOS检测QQ是否安装
  10. oracle索引可以加到in,为什么你加的索引不管用?
  11. Java学习之接口概念
  12. Vue学习笔记之Vue学习前的准备工作
  13. 位运算 取某一位 java_Java 位运算妙用
  14. SAI绘制波浪卷发教程
  15. WBS——工作分解结构
  16. 策略模式探究(二)多个门禁对接使用策略模式
  17. java视频插件,5+最佳javascript视频背景插件
  18. python之迭代器和生成器全解--包含实现原理及应用场景
  19. TCP客户端和服务端的互通信息
  20. QGIS学习资料及地理数据下载

热门文章

  1. 微软:97%电子邮件属于垃圾邮件
  2. DateEdit如果开启Vista模式并显示日期+时间模式
  3. statusStrip 状态条 toolStripStatusLabel 居右显示
  4. 2005年2月9日(星期三) 晚上,熱 - 大年初一,首次創作。
  5. 12月4日云栖精选夜读 | 你不知道的Web前端安全技术
  6. 重绘(repaint)与渲染(reflow)
  7. 详解APNS苹果消息推送通知
  8. 安装rebar时提示Uncaught error in rebar_core
  9. Android:ListView、ListActivity、 setListAdapter
  10. 不知所“云”:小企业对云托管知之甚少