两个工具类

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. SQL语句创建数据库以及一些查询练习

    --创建 MyCompany数据库 use master execute sp_configure 'show advanced options',1 --开启权限 reconfigure execu ...

  2. bootstrapTable的数据后端分页排序

    数据后端分页排序,其实就是sql语句中oeder by做一些限制. 之前在写sql语句中的order by是写死,既然要写活,就要传参数到后台. 之前讲到bootstrapTable的queryPar ...

  3. 超链接显示网站 A,访问后进入网站 B

    #前端黑魔法# 出一个思考题:如何用最少的字符实现下图效果.即超链接显示网站 A,访问后进入网站 B. 当然这个是上古时代的黑魔法了,稍懂前端的都知道原理.所以这里只问最短的实现~ 一个简单的演示:( ...

  4. 【经验总结】datagrid锁定列后重新加载时出现错位问题的解决

    [问题描述]:有时候datagrid设置了锁定列后,在重新加载datagrid数据时,出现锁定列与非锁定列数据错位的问题,如图: [问题分析]:查看css样式我们发现,锁定的列和非锁定的列属于两个不同 ...

  5. css动画-模拟正余弦曲线

    今天就写一个css3抛物线的动画吧= = 从左到右的抛物线动画,我们就暂且把动作分为匀速向右运动和变速的上下运动. 水平匀速运动我们可以利用 translateX(x):定义 2D 转换,沿着 X 轴 ...

  6. C#添加删除防火墙例外(程序、端口)

    一. 添加 COM 引用 在引用里,选择 COM 页, 找到 NetFwTypeLib , 确定即可 二. 添加允许通过防火墙的例外程序 using System; using System.Coll ...

  7. python 之Requests库学习笔记

    1.    Requests库安装 Windows平台安装说明: 直接以管理员身份打开cmd运行界面,使用pip管理工具进行requests库的安装. 具体安装命令如下: >pip instal ...

  8. TP5.0:的安装与配置

    在网址中输入:localhost/安装TP5的文件夹/public/ 入口文件位置:public/index.php: 最新版本中,新建的文件夹是没有模型和视图的,需要自行添加没有的文件: 添加前: ...

  9. jquery实现简单的验证码倒计时的效果

    HTML: <div class="container"> <form> <div class="form-group"> ...

  10. js 中//<![CDATA[ 意义

    CDATA内部所有东西都会被解析器忽略,加入文本中包含了大量< 和 $符号,就像编程中经常出现的情况一样,那么这个元素就可以被定义为一个CDATA部分 ,CDATA 区段开始于 "&l ...