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

Java 包装类

Java 中有些类只能操作对象,因此 Java 的基本数据类型都有一个对应的包装类。

  • byte:Byte
  • short:Short
  • int:Integer
  • long:Long
  • float:Float
  • double:Double
  • char:Character
  • boolean:Boolean
  • void:Void

包装类与基本数据类型转换

包装类与基本数据类型的转换代码结构是类似的。

将基本类型转换为包装类的过程,一般称为“装箱”,而将包装类型转换为基本类型的过程,则称为“拆箱”。

装箱拆箱的写法比较繁琐,Java 5 以后引入了自动装箱和拆箱技术,可以直接将基本类型赋值给引用类型,反之亦可。

自动装箱/拆箱是 Java 编译器提供的能力,编译后会替换为调用对应的 valueOf / xxxValue 方法。

基本数据类型转包装类

  • ❑ valueOf (推荐)
Integer a = Integer.valueOf(1);
  • ❑ 构造方法
Integer b = new Integer(1);

包装类转基本数据类型 xxxValue

int c =  b.intValue();  // 注意 b 不能为 null

包装类与字符串转换

字符串转基本数据类型 / 包装类

  • ❑ parseXXX 字符串转基本数据类型
double pai = Double.parseDouble("3.14");
  • ❑ valueOf 字符串转包装类
Double pai = Double.valueOf("3.14");

包装类转字符串

  • ❑ + 连接符
Double pai = Double.valueOf("3.14");
String str = pai + "";
  • ❑ toString
Double pai = Double.valueOf("3.14");
String str = pai.toString();

对于整数类型,字符串表示除了默认的十进制外,还可以表示为其他进制,如二进制、八进制和十六进制,包装类有静态方法进行相互转换。

❑ toBinaryString 转二进制

❑ toOctalString 转八进制

❑ toHexString 转十六进

包装类共性

equals

所有包装类都重写了该实现,实际比较用的是其包装的基本类型值。

public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;
}
public boolean equals(Object obj) {return (obj instanceof Float) && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}

floatToIntBits() 会将 float 的二进制表示视为 int,只有两个 float 的二进制表示完全一样的时候,equals 才会返回 true。

hashCode

hashCode 和 equals 方法联系密切,如果 equals 方法返回 true,则 hashCode 也必须一样,反之不要求。

  • Byte、Short、Integer、Character
public int hashCode() {return (int)value;
}
  • Long
public int hashCode() {return (int)(value ^ (value >>> 32));
}

Long 是高 32 位与低 32 位进行位异或操作。

  • Boolean
public int hashCode() {return value ? 1231 : 1237;
}

根据值返回两个质数,质数用于哈希时比较好,不容易冲突。

  • Float
public int hashCode() {return floatToIntBits(value);
}
  • Double
public int hashCode() {long bits = doubleToLongBits(value);return(int)(bits ^ (bits >>> 32));
}  

实现了 Comparable 接口

数值父类 Number

byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()        

通过这些方法,包装类实例可以返回任意的基本数值类型。

不可变性

包装类都是不可变类。

  • 所有包装类都声明为了 final,不能被继承。
  • 内部基本类型值是私有的,且声明为了 final。
  • 没有定义 setter 方法。

参考:《Java 编程的逻辑》马俊昌

http://www.lryc.cn/news/30539.html

相关文章:

  • Raspberry Pi GPIO入门指南
  • 汇编语言程序设计(三)之汇编程序
  • 用二极管和电容过滤电源波动,实现简单的稳压 - 小水泵升压改装方案
  • 【数据结构与算法】数据结构有哪些?算法有哪些?
  • 使用Element-UI展示数据(动态查询)
  • lamda 表达式例子全集
  • 计算机网络第八版——第一章课后题答案(超详细)
  • 嵌入式和Python(二):python初识及其基本使用规则
  • C语言详解双向链表的基本操作
  • 面试必须要知道的常见排序算法
  • Kubernetes之服务发布
  • 【第二章】谭浩强C语言课后习题答案
  • PostgreSQL和PostGISWGS84和CGCS2000与GCJ02和BD09坐标系与之间互转
  • 数据结构——链表讲解(2)
  • Elasticsearch:图片相似度搜索的 5 个技术组成部分
  • 【CVPR2022】Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation
  • PMP项目管理项目运行环境
  • Vue 3.0 渲染函数 【Vue3 从零开始】
  • 西电软件体系结构核心考点汇总(期末真题+核心考点)
  • SRS源码分析-SDP内容解析
  • HTML 颜色
  • MySQL高可用架构之InnoDB Cluster部署
  • Linux安装minio单机版
  • 网络总结知识点(网络工程师必备)四
  • 数据结构——第三章 栈与队列(5)
  • CSDN竞赛第33期题解
  • 农产品销售系统的设计与实现
  • C语言-基础了解-08-C判断
  • 用数组名作函数参数的详解,以及形参实参采用数组名,形参实参采用指针变量的几种情况解析
  • k8s中的PV和PVS