图学java基础篇之集合工具
两个工具类
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基础篇之集合工具的更多相关文章
- 图学java基础篇之集合
(本文部分图片引用自其他博客,最后有链接,侵删.由于笔记使用markdown记录,格式可能不是太好看,见谅) 集合结构 红字为java.util包下的,绿字为concurrent包下扩展的与并发相关的 ...
- 图学java基础篇之并发
概述 并发处理本身就是编程开发重点之一,同时内容也很繁杂,从底层指令处理到上层应用开发都要涉及,也是最容易出问题的地方.这块知识也是评价一个开发人员水平的重要指标,本人自认为现在也只是学其皮毛,因此本 ...
- 图学java基础篇之IO
java io体系 如图可以看出,java的io按照包来划分的话可以分为三大块:io.nio.aio,但是从使用角度来看,这三块其实揉杂在一起的,下边我们先来概述下这三块: io:主要包含字符流和字节 ...
- Java 基础篇之集合
List 集合 List 集合中元素有序.可重复,集合中每个元素都有其对应的索引顺序. List 判断两个对象相等,只要通过 equals 方法比较返回 true 即可. 看个例子: public c ...
- java基础篇 之 集合概述(List)
list,有序集合,元素可重复 LinkedList:底层用链表实现,查找慢,增删快.为什么?? ArrayList:底层用数组实现,查找看,增删慢.为什么?? Vector:跟ArrayList一样 ...
- 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇
Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...
- 小白—职场之Java基础篇
java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...
- Java基础篇(JVM)——类加载机制
这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...
- java基础篇---I/O技术
java基础篇---I/O技术 对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...
随机推荐
- Xcode警告忽略
Xcode中 cmd+B 之后总会出现各种各样的警告,对于一个对代码有洁癖的人,这种情况很难忍,接下来我们用些特殊手段强制消除这些警告 一.忽略源文件中的警告 使用编译器宏来操作 #pragma c ...
- jquery jquery中是否加()的问题
自己总结的,慢慢修改再: 1带上()代表立即执行 去掉()代表当有事件发生的时候,我再执行
- ZR18提高5解题报告
不想说啥了,比赛期间智商全程下线 A 设$f[i][j]$表示前$i$个位置,前缀和为$j$的方案数,转移的时候该位置放了什么,以及该位置之前的和是多少. 发现第二维可以前缀和优化. 不用管代码里的f ...
- 【extjs6学习笔记】1.11 初始: config
Ext JS有一个名为config的功能. 该配置允许您使用默认值声明公共属性,这些属性将被其他类成员完全封装. 通过config声明的属性将自动获取get()和set()方法,如果类没有定义这些方法 ...
- python之__init__使用方法
定义类的时候,若是添加__init__方法,那么在创建类的实例的时候,实例会自动调用这个方法,一般用来对实例的属性进行初使化.比如:class testClass: def __init__(self ...
- 更新浏览器,导致编写脚本报错Message: Unable to find a matching set of capabilities
卸载更新浏览器后,所编写的脚本无法运行,报如下的错误:selenium.common.exceptions.WebDriverException: Message: Unable to find a ...
- WebUploader实现采集图片的功能
项目最开始用百度团队的文件上传组件做了个物料照片采集的功能,后来做员工头像采集时竟然不知道怎么使用了. 参照官方Demo: http://fex.baidu.com/webuploader/getti ...
- COGS 1191. [Tyvj Feb11] 猫咪的进化
★ 输入文件:neko.in 输出文件:neko.out 简单对比时间限制:1 s 内存限制:128 MB [背景] 对于一只猫咪来说,它是有九条命的.但是并不是所有的猫咪都是这样,只 ...
- VMware-Ubuntu16.04LTS-安装ssh
1,检查是否安装ssh 2,安装ssh
- 流媒体 8——因特网 tcp/ip
1 因特网 1.1 因特网的结构 组成因特网的子网之间在物理上的相互连接都是通过网关设备实现的.通过网关设备互相连接在一起的不同的网络通常称为子网 (subnetwork),因为它们是大网络之中的网络 ...