当前位置: 首页 > news >正文

JAVASE(十三)常用类(二)包装类、工具类Arrays类

目录

一、包装类

1.定义

2.使用

3.装箱和拆箱

(1)装箱

(2)拆箱

(3)自动装箱和自动拆箱

(4)自动装箱细节问题

二、Arrays类

1.定义

2.使用

(1)比较方法equals

(2)排序方法sort

(3)输出方法toString

(4)二分查找方法binarySearch

(5)复制扩容方法copyOf


一、包装类

1.定义

之前学过的基本数据类型都是使用关键字进行定义的,这不符合java的面向语言思维方式。所以在设计的时候,每个基本数据类型都设计了一个对应的类。这些类统称为包装类。

其中int对应Integer,char对应Character,其余只是数据类型和类的首字母大小写不同,如long对应Long。

2.使用

每个包装类除了包含对应的基本数据类型的属性之外,还包括最大值,最小值等属性以及相关操作。

以Integer类为例,挑选一些方法作总结:

(1)构造方法

Integer(int a);           直接将a的值赋给Integer类中的属性value。
Integer(String a);      该方法的参数传入的字符串只能包含数字字符(0-9)或可选的正负符号(+/-),不能有空格或其他非法字符。因为该构造方法内部调用 Integer.parseInt(String s) 方法,用来将字符串转换为整数。如:

运行结果:

(2)比较方法

public int compareTo(Integer a);   将当前对象的内容和参数对象的内容进行比较,大于返回1,等于返回0,小于返回-1。如图:

运行结果: 

(3)转换方法

int intValue();返回包装类型的原始基本值。

static int parseInt(String s);将传进来一个字符串将其变成int型。

valueof(int a);或valueof(String s);将传进来的参数转换为Integer包装类。

3.装箱和拆箱

(1)装箱

将基本数据类型转换为包装类即为装箱。手动装箱有两种方式:

1.直接使用构造方法 。     Integer a=new Integer(String/int   a);

2.通过valueof方法。        Integer s1=Integer.valueOf(String/int   a);

(2)拆箱

将包装类转换为基本数据类型即为拆箱。通过intValue方法实现拆箱。  

int a = Integer类型的变量.intValue();

(3)自动装箱和自动拆箱

装箱的时候默认调用valueof方法,自动实现装箱。拆箱的时候默认调用intValue方法,自动实现拆箱。如:

等价于

(4)自动装箱细节问题

如图:a和b都赋值127,输出a==b,c和d都赋值128,输出c==d 

运行结果:

出现以上结果的原因是:为了节省空间,对-128到127之间的256个对象进行了数组的缓存。参数值在区间内时,valueOf方法就会直接返回数组对应的值。值相同时渠道的对象相同,类似String类型的字符串驻留的特性。当参数的值超过区间直接创建新对象 。上述示例中,a和b在区间内,所以指向的同一对象,但是c和d实际指向的是两个对象。

二、Arrays类

1.定义

java.util包下的Arrays类属于静态工具类,它的内部将构造方法私有化,不能用来创建对象;仅包含静态方法。这是java标准库中工具类的典型设计模式。

2.使用

(1)比较方法equals

对两个数组的元素内容进行比较。类中实现了方法重载。

底层逻辑如图,先后判断是否指向同一个数组,是否有一个数组是空,数组之间的长度是否相等以及数组内容是否相同。

示例:

 运行结果:

数组本身也可直接调用equals方法,如上述示例中可以编写a.equals(b);    但是数组类中没有对该方法重写,所以调用的是Object类中的equals方法。只能判断两个数组的引用是否相同。

(2)排序方法sort

当方法中参数只有数组引用时,即对整个数组进行排序。也可以添加参数,实现对指定区间进行排序。如图:

 运行结果:

注意在指定区间时,区间的值的范围为索引的范围,且指定区间的包含开始不包含结束。

当自定义类型的对象进行排序时,需要自定义类实现Comparable接口并重写compareTo方法。详细在后面篇章总结。

(3)输出方法toString

把数组对象的内容以字符串形式去输出。如果是由自定义类型的对象组成的数组,没有在类中重写toString方法时,输出的就是这些对象的地址。

例如,定义一个学生的数组,每个元素都是学生类型。如图:

输出结果如下:

 

首先Arrays类的toString方法的底层逻辑如图,其中for循环中调用了String类的valueOf方法:

String类的valueOf方法逻辑如图,该方法使用了条件运算符,当参数不为空的时候调用参数所属类的toString方法。而如果是自定义的类,没有重写toString方法,就会调用Object类中的该方法。

 

 所以对于上述示例,如果想要输出每个元素对应的内容,就要在Student类中重写toString方法,如图:

此时再去执行上面的示例,运行结果如下:

 

需要注意的是Arrays类的toString方法并非是重写Object类,而是通过方法重载实现的独立的方法。对于基本类型的数组,调用Arrays类的toString方法逻辑如下(以float数组为例),显然是直接将数组元素值添加到输出的数组里:

(4)二分查找方法binarySearch

注意二分查找要求数组必须是有序的。格式和sort排序类似,既可以在整个数组中寻找,也可以指定区间进行寻找,同样包含开始不包含结束。查找成功返回对应索引,查找失败返回负数。

运行结果为: 

(5)复制扩容方法copyOf

因为定义一个数组之后,其长度不能改变,可以利用该方法创建一个指定容量的新数组,并将原有数组内容复制到新数组里。 

如:

运行结果如下:

 

http://www.dtcms.com/a/106346.html

相关文章:

  • 【案例分享】江苏某汽车制造厂水冷式制冷站AI节能优化方案
  • LVS-----DR模式
  • JAVA中JVM一次 GC的 流程
  • 电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法
  • 分布式数据一致性场景与方案处理分析|得物技术
  • 谷粒商城:Redisson
  • TiDB 可观测性解读(二)丨算子执行信息性能诊断案例分享
  • Linux网络编程socket服务器端模拟实现
  • JSP 指令
  • Python数据类型-dict
  • 第八届 蓝桥杯 嵌入式 省赛
  • 【ESP32-IDF 笔记】02-LED PWM 配置
  • 运维面试题(ORACLE数据库)--20250401
  • Cesium学习(未完继续)
  • 题解:AT_arc050_c [ARC050C] LCM 111
  • Android的安全问题 - 在 Android 源码的 system/sepolicy 目录中,区分 public、private 和 vendor的目的
  • Kotlin 作用域函数:apply、let、run、with、also
  • 掩码图像建模 (MIM) 中的对数似然与交叉熵
  • 品铂科技与宇都通讯UWB技术核心区别对比(2025年)
  • C++:位图和布隆过滤器
  • spring-ai-alibaba第三章ollama集成Tool
  • 【redis】缓存 更新策略(定期、实时生存),缓存预热、穿透、雪崩、击穿详解
  • ERP管理系统:Java+Vue,含源码及文档,一体化管理资源,优化流程,强化企业运营效率
  • React.memo()和 useMemo()的用法是什么,有哪些区别
  • CSS3学习教程,从入门到精通,CSS3 媒体查询实现响应式布局语法指南(21)
  • Unity插件SuperScrollView详解(基础篇)
  • Redis安全与配置问题——AOF文件损坏问题及解决方案
  • 机器人--ros2--IMU
  • 用jQuery和Canvas打造2D版“我的世界+超级玛丽“游戏
  • 知名界面控件DevExpress v24.2.6全新可用|发布重要更改