话题一: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 |