编写高质量代码:改善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. 6s ios9.0平台 微信小程序的fixed定位兼容性问题

    如果不设置top和left的话  就会出现不显示问题

  2. python中的 list (列表)append()方法 与extend()方法的用法 和 区别

    参考: https://www.cnblogs.com/xuchunlin/p/5479119.html

  3. hive数学函数

    round 四舍五入 ceil向上 取整 floor向下取整 hive >  select floor(45.8); ok 45

  4. C# 中那些常用的工具类(Utility Class)(二)

    今天按照这一年来经常用到的那些静态的工具类再来做一次总结,这些小的工具来可以作为自己学习的很好的例子,通过总结这些东西,能够很大程度上梳理自己的知识体系,当然这个是经常用到的,接下来就一个个去分析这些 ...

  5. 如何使用Action.Invoke()触发一个Storyboard

    一般在我们的项目中,最好是将Storyboard放在前台,然后设置Storyboard的x:key值,通过我们的TryFindResource来查找到当前的Storyboard来启动Stroyboar ...

  6. QTP 自动货测试桌面程序-笔记(添加控件仓库并关联到action)

    录制或编写脚本前先添加行为对应的控件仓库: 心得:多个测试action使用的同一个窗体的仓库单独放于一个仓库中,可以在多个action中添加关联使用 将同一个窗体的控件只放于一个仓库中,减少使用时的名 ...

  7. 三、checkedListBoxControl

    一.checkedListBoxControl的使用全选 private void InitDate() { CheckedListBoxItem[] itemArr = { new CheckedL ...

  8. oss命令使用

    下载文件夹 ossutil64 cp oss://folder/ out_folder/ -r --jobs 20

  9. 数据同步到redis中时候需要 需要给关联的表增加id 如果是一对多 则增加list存储id 如果是一个 则增加一个字段 ;目的是便于取值

  10. React Router 4.0 ---- 嵌套路由和动态路由

    嵌套路由,从广义上来说,分为两种情况:一种是每个路由到的组件都有共有的内容,这时把共有的内容抽离成一个组件,变化的内容也是一个组件,两种组件组合嵌套,形成一个新的组件.另一种是子路由,路由到的组件内部 ...