编写高质量代码:改善Java程序的151个建议 --[65~78]

原始类型数组不能作为asList的输入参数,否则会引起程序逻辑混乱。
public class Client65 {
public static void main(String[] args) {
int data [] = {1,2,3,4,5};
List list= Arrays.asList(data);
System.out.println("元素类型是:"+list.get(0).getClass());
System.out.println("前后是否相等:"+data.equals(list.get(0)));
}
}

输出的结果是: 元素类型是:class [I 前后是否相等:true

如果要转换,建议转换为对应的包装类,再使用 List list= Arrays.asList(data)来转换

asList方法产生的List的对象不可更改

添加修改Arrays.asList后的list数据会产生如下错误

频繁插入和删除时使用LinkList

在修改动作上,LinkedList比ArrayList慢很多,特别是要进行大量的修改时,两者完全不在一个数量级上。

LinkedList删除和插入效率高;ArrayList修改元素效率高。

判断集合是否相等时只须关注元素是否相等即可
import java.util.ArrayList;
import java.util.Vector; public class Client69 {
public static void main(String[] args) {
ArrayList<String> strs = new ArrayList<String>();
strs.add("A"); Vector<String> strs2 = new Vector<String>();
strs2.add("A"); System.out.println(strs.equals(strs2));
}
}

AbstractList看下源码:

public boolean equals(Object o) {
if (o == this)
return true;
//是否是列表,注意这里:只要实现List接口即可
if (!(o instanceof List))
return false;
//通过迭代器访问List的所有元素
ListIterator<E> e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
//遍历两个List的元素
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
//只要存在着不相等就退出
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
//长度是否也相等
return !(e1.hasNext() || e2.hasNext());
}
子列表只是原列表的一个视图

SubList类也是AbstractList的子类,其所有的get、set、add、remove等都是在原始列表上的操作,它自身并没有生成一个新的数组或是链表,也就是子列表只是原列表的一个视图(View)而已。所有的修改动作都映射到了原列表上。

实现了compareTo方法就应该覆写equals方法,确保两者同步

indexOf依赖equals方法查找,binarySearch则依赖compareTo方法查找;

equals是判断元素是否相等,compareTo是判断元素在排序中的位置是否相同。

既然一个决定排序位置,一个是决定相等,那我们就应该保证当排序相同时,其equals也相同,否则就会产生逻辑混乱。

集合运算时使用最优雅方式

并集:

public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
list1.add("A");
list1.add("B");
List<String> list2 = new ArrayList<String>();
list2.add("C");
// 并集
list1.addAll(list2);
}

交集:

//交集
list1.retainAll(list2);

差集:

//差集
list1.removeAll(list2);

无重复的并集:

 	   //删除在list1中出现的元素
list2.removeAll(list1);
//把剩余的list2元素加到list1中
list1.addAll(list2);
使用shuffle打乱列表

举个栗子:

public static void main(String[] args) {
int tagCloudNum = 10;
List<String> tagClouds = new ArrayList<String>(tagCloudNum);
// 初始化标签云,一般是从数据库读入,省略
//打乱顺序
Collections.shuffle(tagClouds);
}

shuffle使用场景:

  1. 可用在程序的 "伪装" 上:比如我们例子中的标签云,或者是游侠中的打怪、修行、群殴时宝物的分配策略。
  2. 可用在抽奖程序中:比如年会的抽奖程序,先使用shuffle把员工顺序打乱,每个员工的中奖几率相等,然后就可以抽出第一名、第二名。
  3. 可以用在安全传输方面:比如发送端发送一组数据,先随机打乱顺序,然后加密发送,接收端解密,然后进行排序,即可实现即使是相同的数据源,也会产生不同密文的效果,加强了数据的安全性。

编写高质量代码:改善Java程序的151个建议 --[65~78]的更多相关文章

  1. 博友的 编写高质量代码 改善java程序的151个建议

    编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html

  2. 编写高质量代码改善java程序的151个建议——导航开篇

    2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...

  3. 编写高质量代码改善java程序的151个建议——[1-3]基础?亦是基础

    原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks The reasonable man adapts himse ...

  4. 编写高质量代码:改善Java程序的151个建议 --[117~128]

    编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...

  5. 编写高质量代码:改善Java程序的151个建议 --[106~117]

    编写高质量代码:改善Java程序的151个建议 --[106~117] 动态代理可以使代理模式更加灵活 interface Subject { // 定义一个方法 public void reques ...

  6. 编写高质量代码:改善Java程序的151个建议 --[78~92]

    编写高质量代码:改善Java程序的151个建议 --[78~92] HashMap中的hashCode应避免冲突 多线程使用Vector或HashTable Vector是ArrayList的多线程版 ...

  7. 编写高质量代码:改善Java程序的151个建议 --[52~64]

    编写高质量代码:改善Java程序的151个建议 --[52~64] 推荐使用String直接量赋值 Java为了避免在一个系统中大量产生String对象(为什么会大量产生,因为String字符串是程序 ...

  8. 编写高质量代码:改善Java程序的151个建议 --[36~51]

    编写高质量代码:改善Java程序的151个建议 --[36~51] 工具类不可实例化 工具类的方法和属性都是静态的,不需要生成实例即可访 问,而且JDK也做了很好的处理,由于不希望被初始化,于是就设置 ...

  9. Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议

    在通往"Java技术殿堂"的路上,本书将为你指点迷津!内容全部由Java编码的最佳 实践组成,从语法.程序设计和架构.工具和框架.编码风格和编程思想等五大方面,对 Java程序员遇 ...

随机推荐

  1. text-decoration、text-decoration-color、text-decoration-line、text-decoration-style属性

    text-decoration:over-line  定义上划线 text-decoration:line-through  定义删除线 text-decoration:underline  定义下划 ...

  2. mybatis源码分析(二)------------配置文件的解析

    这篇文章中,我们将讲解配置文件中 properties,typeAliases,settings和environments这些节点的解析过程. 一 properties的解析 private void ...

  3. 打印module查看参数

    module1下的index.js require('./test2') main.js require('./module1')和require('./module2') 打印每个文件的module ...

  4. python之路--类与类之间的关系

    类和类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中. 类和类之间也可以产生相关的关系 1. 依赖关系 执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的关系是最轻 ...

  5. linux pstree命令

    pstree命令可以使进程以tree的形式显示 pstree -ssystemd─┬─UVPHostd───6*[{UVPHostd}] ├─acpid ├─2*[agetty] ├─crond ├─ ...

  6. Vue.js文档

    参考网址:https://vuefe.cn/ 第一  安装 1.下载到本地后使用<script>标签直接引入 2.使用CDN引入 例如:使用CDN引入 <script src=&qu ...

  7. Zend Framework2从入门到精通

    1. 下载安装zf2的web程序 步骤: 第一步,保证得到一个基本的zf2框架 直接从官网下载并解压即可:http://www.zendframework.org.cn/downloads/lates ...

  8. PHPCMS的使用

    1.下载安装phpcms 下载完后解压将install_packages上传到服务器并重命名为phpcms_test: 更改目录文件系统权限: chmod -R 777 phpcms_test 配置n ...

  9. How to remove unwant Explorer Context Menu

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell

  10. B-树 B+树复习总结

    一.B-树的定义 一棵m阶的B-树或为空树,或为具有以下特性的m叉树 1.树中每个结点至多有m棵子树 (m-1个关键字) 2.根结点至少有两棵子树 (至少有一个关键字) 3.除根节点的分支结点至少有f ...