Java功底篇系列-04-基本类型/包装类型/Collections/Arrays

话题一:valueOf()与xxxValue()


我们知道JAVA存在自动装箱和拆箱的功能,这个过程是JAVA直接帮助我们做了,很多时候是悄悄的,而且是无处不在的。比如直接将基本数值赋值给包装类型的变量,比如在集合中我们放入的都必须是对象。而这个过程都是调用了什么方法来实现的呢?让我们来看看代码,一探究竟:

以Integer为例,看valueOf()和intValue()的实现方式。

valueOf()是JAVA用于将基本数据类型转化成包装类型所调用的方法,即完成自动装箱的功能。

上面的代码很好懂,也就是说:i在某个区间,则返回一个数组的元素,否则new一个Integer返回!

跟踪代码,可以发现IntegerCache.high其实是127.

那么如果对-128<=I<=127来自动装箱的话,得到的是数组的元素,即指向的是同一块内存空间!

来看一段测试代码:

一个true,一个false,就好理解了。

true,是因为i1,i2指向的都是cache数组里面的同一个东西,而非Integer可以用 == 来进行比较!

Integer也肯定重写了equals()方法来实现值比较:

感悟:

连Integer都利用到了缓存思想!

下面,我们来看看实现自动拆箱功能的intValue()方法:

很简单,返回value,这个value又是什么呢?

这说明Integer一旦设置完毕,就不可改动了!可以发现Integer也没有提供set方法。

话题二:包装类型和基本类型的比较


看一段代码:

在上面的例子中,包装类型和基本类型在比较的时候,是先统一转化成Integer呢?还是int呢?

如果是转成Integer,那么显然应该一个是false,一个是true.

其实最后的运行结果是2个都是true.

这说明,在比较过程中,是优先向基本数据类型转化的!

话题三:Collections


在实际开发中,集合和数组是我们用的比较多的,而Collections/Arrays封装了很多功能供我们调用,而且可以满足我们的大部分开发需求,因此了解他们都有些什么很有必要!

Collections:

sort功能

专门针对LIST进行排序,在实际开发中,我们确实经常需要对一个装有一些对象的LIST进行排序!

min和max

如果,我们想取一个集合中的最小、最大值,如何快速的取到呢?上面的方法将帮我们实现。

反转

如果,我们仅仅需要得到一个LIST的相反顺序!

混排列

通过这个方法,将使得LIST中元素的顺序不可预测,即顺序是随机的,混排的。

这有什么用呢?

比如,在有的业务中,我们希望对外提供的数据是“变化的”,假设电商APP,用户看到的始终是不变的商品,又有什么购买的兴趣呢?利用随机的特点,让用户每次看到的都不一样!

拷贝

复制的操作常有,需要注意的是dest list的长度需要>=src list的长度,拷贝从index=0开始,而且是浅拷贝!

查找目标LIST出现的FIRST/LAST的索引位置

我们可以来看看源码是怎么实现的:

说明:

如果这个功能我们自己来做,会如何做呢?

对于在源list1中查找目标list2,很显然,首先遍历list1,从index=0开始查找每个元素是否和list2对应一致,如果不一致,从index=1开始重复这个过程。

上面的代码,分为普通for版本和iterator版本,思想是一致的。

需要注意的是,内层for循环中的continue并不是想开始下一次内层for循环,而是想导致外层for循环开始下一次,为了达到这个目的,用到了continue lable;

循环移动Rotate

如果,我们想把list中的前几个移动到最后去,或者后几个移动到前面,rotate就可以排上用场了!

他是怎么实现的呢?好像一下子没什么头绪?看看源码是怎么做的:

示意如下:

仅仅几个reverse就实现了,原来如此简单!

感悟:

这说明,一些看似复杂的功能,都是由一些小功能组装实现的!

话题四:Arrays


集合虽然好,但是我们有时候只想对基本类型数据进行操作,那么可能就少不了数组了,而Arrays正好提供了一些功能给我们使用,大致如下:

排序功能sort:

好多排序啊~

对数组的所有元素排序?对数组的一定范围的元素排序?想根据自己制定的排序器来排序?

Arrays.sort都可以满足你!

数组比较功能equals

如果让我们自己来比较2个数组的元素是否相等,那么我们得判断长度,在FOR循环去比较2个数组的对应元素是否相等了,现在Arrays.equals已经将这些逻辑封装好了,一行代码就搞定了~

可以看一眼他的逻辑:

感悟:

是否是同一个对象?NULL检查?长度判断?这些你会在FOR比较前注意吗?

查找数组元素binarySearch

这个是需要有序的数组来实现二分查找的。

全部元素查找?部分元素查找?指定比较器排序后在进行查找?

都可以~

填充数组功能fill

数组的toString()功能

要知道,我们有时候调试程序的时候,经常需要打印下数组的元素,不得不写个FOR循环遍历,而Arrays提供便利的toString()返回逗号分隔的元素列表。

数组拷贝功能copyOf/copyOfRange

时间: 2024-10-08 16:25:30

Java功底篇系列-04-基本类型/包装类型/Collections/Arrays的相关文章

Java功底篇系列-01-从==/equals/hashCode开始

前言 自己毕业后做JAVA开发已经2年了,从最初的JAVA WEB开发,到投入到Hadoop大数据开发潮流中,越来越发现自己的JAVA基础,数据结构,多线程等等,是那么的脆弱!还有什么比基础更加重要呢,应该静下心来,去学习它们,就从这一篇博客开始吧~ 话题一:==与equals 让我们首先看看Object类中定义的equals方法的源码: 在Object类中,equals就是利用==实现对象之间的比较的. 我们知道对于基本数据类型,==比较的就是他们的值是否相等,那么对于对象类型的==比较的是什

Java功底篇系列-03-一些位运算符你会如何理解?

话题一:异或 先看一段代码吧: 这段代码是用来实现a,b交换的. 异或是位运算符,0^1为1,其他情况都是0,这是一个加法不进位的功能! 这有什么用呢? 其实通过上面交换的例子,我们已经明白A^B^A将得到B,也就是可以实现数据还原的功能! 话题二:%与& 如果有一堆数据,我们想将这些数据通过HASH的方式,放入到桶中. 我们可以将桶进行编号,比如0号,1号,...N号桶. 给我们一个数据,我们要完成这个数据和桶的序号的映射转化关系,这样放入和查找就可以了. 由于对于任何一个非负数A,进行A%B

Java功底篇系列-02-如何理解实际开发中与“排序”相关的问题

场景一:找出100W数据中TOP10 很自然的想法是排序,可是要知道对100W数据进行排序,不论采用什么样的排序算法吧,最坏情况下,应该是100W*100W的计算量,太大了. 可是,不排序又能怎么做呢?为什么要排序呢?我们仅仅需要的是TOP10. 思考下,找出100W数据中TOP1,你会排序吗? 找TOP1,相信大家和我一样,都不会去排序,应该是搞一个变量max认为它最大,然后遍历一边100W数据,在遍历过程中进行比较替换max就可以了找到TOP1. 依此规律,我们为什么不搞一组变量max1,m

Java总结篇系列:java.lang.Object

从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起. Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为, 是Java语言设计背后的思维体现. Object类位于java.lang包中,java.lang包包

Java总结篇系列:类型转换/造型

Java中,经常可以遇到类型转换的场景,从变量的定义到复制.数值变量的计算到方法的参数传递.基类与派生类间的造型等,随处可见类型转换的身影.Java中的类型转换在Java编码中具有重要的作用.首先,来了解下数据类型的基本理解:数据是用来描述数据的种类,包括其值和基于其值基础上的可进行的操作集合. Java中数据类型主要分为两大类:基本数据类型和引用数据类型.基本数据类型共有8种,分别是:布尔型boolean, 字符型char和数值型byte/short/int/long/float/double

Java总结篇系列:Java多线程(三)

一.一个典型的Java线程安全例子 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 Account account = new Account("123456", 1000); 5 DrawMoneyRunnable drawMoneyRunnable = new DrawMoneyRunnable(account, 700); 6 Thread myThread1 = new Thr

Java基础——基本类型包装类型的引入(1)

基本类型包装类型的引入 1.概述 基本类型就是我们之前所说的类似int.String.float等常用的一些数据类型,这一些是基本的数据类型,为了对基本类型数据进行更多的操作 ,以及更方便的操作,Java针对每一种数据类型提供了相应的类类型,即包装类型. 2.对应关系 byte(Byte).short(Short).int(Integer).long(Long).float(Float).double(Double).char(Character).boolean(Boolean) 3.详解(1

java基础-基础类型包装类型

想要对基本类型数据进行更多的操作,最方便的方式就是将其封装成对象. 为啥呢?因为在对象描述中就可以定义更多的属性和行为对该基本数据类型进行操作. [八种基本数据类型的包装类] byte --Byte short --Short int --Integer long-----Long float-----Float double----Double char----Character boolean---Boolean 基本数据类型变成对象包装类的好处] 1 可以将基本数据和字符串之间进行互相的转

(转)1.21 Java总结篇系列:Java泛型

一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(String[] args) { 4 List list = new ArrayList(); 5 list.add("qqyumidi"); 6 list.add("corn"); 7 list.add(100); 8 9 for (int i = 0; i < lis