两个工具类

java.utils下又两个集合相关_(准确来说其中一个是数组的)_的工具类:Arrays和Collections,其中提供了很多针对集合的操作,其中涵盖了一下几个方面:

  • 拷贝、填充、反转等常用的基本操作
  • 排序、查找等算法相关处理
  • 安全性相关处理
  • 类型转换

下边直接用两个图来说明_(其中三言两语说不清的会标红,并在后边打上标记,在图后有对应说明)_:

Arrays

sort中的多种排序算法

印象中JDK很多地方都是快排和归并,这里也不例外,不过这里用的都是优化的算法,并且根据排序元素类型策略不同:

  • DualPivotQuicksort

    • 所有数值基本类型均用此排序,JDK7中新增
    • 双基准快速排,改进的多路快排算法
  • ComparableTimSort
    • 默认引用类型均用此排序,JDK7中新增
    • 基于TimSort,该算法是优化版本的归并排序,混合使用了归并和插入排序
  • LegacyMergeSort
    • 老版本中的排序算法,JDK7中为兼容仍保留,若想使用可通过-Djava.util.Arrays.useLegacyMergeSort=true
    • 优化的归并排序,但是性能较TimSort差
asList需注意的点

asList是我们经常使用的一个方法,可以将一组值直接转成list,但是看下如下代码:

int[] arr = new int[3]{1,2,3};
List list = Arrays.asList(arr);

相信大部分同学初看起来没什么问题吧(反正我一直没觉得有问题),把数组转成list,然后结果打印list,你会发现其中只有一个元素,这个元素就是arr指向的数组。所以该方法并不能把数组转为list,list的构造函数本身就支持数组,没必要在提供方法

还要注意的一个点是asList返回了一个ArrayList对象,这个对象并不是我们常用的java.utils下的那个,而是Arrays的一个内部类,它是只读的,因此我们要想获得一个不残疾的list,要这样写:

List list = new ArrayListArrays.asList(1,2,3);
hashCode

这个倒没啥好说的,这里直接贴代码吧,主要看下集合的hashCode是怎么计算的。

    public static int hashCode(Object[] var0) {
if(var0 == null) {
return 0;
} else {
int var1 = 1;
Object[] var2 = var0;
int var3 = var0.length;
for(int var4 = 0; var4 < var3; ++var4) {
Object var5 = var2[var4];
var1 = 31 * var1 + (var5 == null?0:var5.hashCode());
}
return var1;
}
}
deepXXX

就如同拷贝分为深拷贝和浅拷贝一样,由于集合可能是多层的,集合内的元素可能还是一个集合,因此对于集合的很多操作默认是只处理一层,如hashCode、equals、toString,这样对于多层的处理就不是我们期望的结果了。因此Arrays还提供了deepXXX的方法,其会递归的逐层处理。

Collections

unmodifiableXXXX、synchronizedXXX、checkedXXXX

这三个方法功能各不相同,unmodifiableXXXX返回一个不可修改的副本,synchronizedXXX范围一个线程安全的副本,checkedXXXX返回的副本会对添加操作进行类型检查(这里说副本并不准确,其实操作的还是原对象),这里之所以要放在一起说,因为他们有很多共同之处:

  • 均使用包装模式实现,将传入对象作为私有属性,然后通过对其操作进行包装实现对应功能
  • 操作的都是原对象,原对象的修改也会体现在包装的对象上
  • 都支持list、set、map

(原图和相关xmind文件见:github)

图学java基础篇之集合工具的更多相关文章

  1. 图学java基础篇之集合

    (本文部分图片引用自其他博客,最后有链接,侵删.由于笔记使用markdown记录,格式可能不是太好看,见谅) 集合结构 红字为java.util包下的,绿字为concurrent包下扩展的与并发相关的 ...

  2. 图学java基础篇之并发

    概述 并发处理本身就是编程开发重点之一,同时内容也很繁杂,从底层指令处理到上层应用开发都要涉及,也是最容易出问题的地方.这块知识也是评价一个开发人员水平的重要指标,本人自认为现在也只是学其皮毛,因此本 ...

  3. 图学java基础篇之IO

    java io体系 如图可以看出,java的io按照包来划分的话可以分为三大块:io.nio.aio,但是从使用角度来看,这三块其实揉杂在一起的,下边我们先来概述下这三块: io:主要包含字符流和字节 ...

  4. Java 基础篇之集合

    List 集合 List 集合中元素有序.可重复,集合中每个元素都有其对应的索引顺序. List 判断两个对象相等,只要通过 equals 方法比较返回 true 即可. 看个例子: public c ...

  5. java基础篇 之 集合概述(List)

    list,有序集合,元素可重复 LinkedList:底层用链表实现,查找慢,增删快.为什么?? ArrayList:底层用数组实现,查找看,增删慢.为什么?? Vector:跟ArrayList一样 ...

  6. 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇

    Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...

  7. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  8. Java基础篇(JVM)——类加载机制

    这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...

  9. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

随机推荐

  1. vue3.0学习笔记(一)

    一.搭建工作环境环境 1.从node.js官网下载相应版本进行安装即可 https://nodejs.org/zh-cn/download/,安装完成后在命令行输入  node -v 如果可以查询到版 ...

  2. rem 适配屏幕大小

    window.onresize=function(){ var html=document.getElementsByTagName("html")[0]; var width=w ...

  3. 2016多校训练3_1007(hdu5758 Explorer Bo)

    #include <functional> #include <algorithm> #include <iostream> #include <iterat ...

  4. 《译》准备做一些 AR/增强现实的 翻译

    中文这方面资料实在少之又少. 准备做一些这方面翻译,关注于Vuforia, Unity3d, Hololens等方面. 如有问题.建议,随时联系.Fell free ton contact me.

  5. Linux下安装maven和nexus

    Linux下安装maven1.首先到Maven官网下载安装文件,目前最新版本为3.0.3,下载文件为apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令: 2.进入下载 ...

  6. Localroast使用总结

    全手打原创,转载请标明出处: https://www.cnblogs.com/dreamsqin/p/10883248.html,多谢~=.= 什么是Localroast 一个根据 JSON 文件快速 ...

  7. COGS 750. 栅格网络流

    ★★☆   输入文件:flowa.in   输出文件:flowa.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] Bob 觉得一般图的最大流问题太难了,他不知道如何解决 ...

  8. php使用GD库实现图片水印和缩略图——封装成类

    学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...

  9. hdu-3549 Flow Problem---最大流模板题(dinic算法模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3549 题目大意: 给有向图,求1-n的最大流 解题思路: 直接套模板,注意有重边 传送门:网络流入门 ...

  10. 【BZOJ4001】[TJOI2015] 概率论(卡特兰数)

    点此看题面 大致题意: 问你一棵\(n\)个节点的有根二叉树叶节点的期望个数. 大致思路 看到期望,比较显然可以想到设\(num_i\)为\(i\)个节点的二叉树个数,\(tot_i\)为所有\(i\ ...