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

简介:

话题一:valueOf()与xxxValue()

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


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


wKiom1XhgCuzHLECAACAuNo87NQ546.jpg

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


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


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


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


来看一段测试代码:


wKiom1Xhg33BDFa8AAB3MhKqYCE168.jpg


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


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


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


wKioL1XhhvnS96sSAAByypGX7Do835.jpg


感悟:


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


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


wKioL1XhiG_gtfzUAAAleeuTZpI405.jpg


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


wKioL1XhiJLBkSS4AAAfabitUX0809.jpg

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




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

看一段代码:

wKioL1XiUKfglgRSAABupEi9UIc677.jpg


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


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


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


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



话题三:Collections

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


Collections:


sort功能


wKioL1XiU9nQw94oAABfBlxRhtk546.jpg


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



min和max


wKiom1XiUm3zU86CAACqBCF1SC0341.jpg


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



反转


wKiom1XiU7uBm0qtAAAe_F_9gEU814.jpg


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



混排列


wKiom1XiVsuCetCoAAAbtHoA7jM320.jpg


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


这有什么用呢?


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



拷贝


wKiom1XiWO_zMkcTAAA1TnibLUw385.jpg


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



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


wKioL1XiX_miK-FHAAA7e7d0IHQ838.jpg


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


wKiom1XiXxTz3lMtAAM5zd0ZPR8371.jpg


说明:


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


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


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


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



循环移动Rotate


wKiom1XiYwKzFhFFAAA9rSzFQXo492.jpg


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


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


wKiom1XiambxxWrhAADB3iMXAHU358.jpg

示意如下:

wKiom1XiayfBbevFAACPvpCuG-0267.jpg


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


感悟:


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




话题四:Arrays


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


排序功能sort:


wKioL1XicRXwXuNaAAD9mnPui6k863.jpg


好多排序啊~


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


Arrays.sort都可以满足你!



数组比较功能equals


wKioL1XiclbTdvU1AADFk6R7J_I735.jpg


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


可以看一眼他的逻辑:


wKiom1XicXazi0MNAADH87u01q8470.jpg


感悟:


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



查找数组元素binarySearch


wKioL1XidCqTq1sDAAEMmE5O_DQ468.jpg


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


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


都可以~



填充数组功能fill



数组的toString()功能


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



本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1689732,如需转载请自行联系原作者

目录
打赏
0
0
0
0
69
分享
相关文章
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
56 4
java变量与数据类型:整型、浮点型与字符类型
### Java数据类型全景表简介 本文详细介绍了Java的基本数据类型和引用数据类型,涵盖每种类型的存储空间、默认值、取值范围及使用场景。特别强调了`byte`、`int`、`long`、`float`、`double`等基本类型在不同应用场景中的选择与优化,如文件流处理、金融计算等。引用数据类型部分则解析了`String`、数组、类对象、接口和枚举的内存分配机制。
31 14
|
2天前
|
课时11:Java数据类型划分(浮点类型)
课时11介绍了Java中的浮点数据类型。主要内容包括:1. 定义小数,默认使用Double类型;2. 定义Float变量,需在数值后加&quot;F&quot;或&quot;f&quot;进行强制转换;3. 观察不同类型计算结果,如Int型除法会丢失精度,需至少包含一个Double或Float类型以确保准确性。总结指出,在复杂计算中推荐使用Double类型以避免精度损失。
|
2天前
|
课时10:Java数据类型划分(整型类型)
本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。
|
4月前
|
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
125 17
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
120 2
Java泛型类型擦除以及类型擦除带来的问题
泛型擦除是指Java编译器在编译期间会移除所有泛型信息,使所有泛型类型在运行时都变为原始类型。例如,`List&lt;String&gt;` 和 `List&lt;Integer&gt;` 在JVM中都视为 `List`。因此,通过 `getClass()` 比较两个不同泛型类型的 `ArrayList` 实例会返回 `true`。此外,通过反射调用 `add` 方法可以向 `ArrayList&lt;Integer&gt;` 中添加字符串,进一步证明了泛型信息在运行时被擦除。
91 2
Java扑克牌(洗牌Collections.shuffle)
Java扑克牌(洗牌Collections.shuffle)
263 0
Java扑克牌(洗牌Collections.shuffle)
|
9天前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
122 60
【Java并发】【线程池】带你从0-1入门线程池

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等