Day3 | Java基础 | 3 Java数据类型

Day3 | Java基础 | 3 Java数据类型

  • 基础版
    • 数据类型
      • 值类型和引用类型的区别
      • 数据转换
    • 包装类
    • BigDecimal
      • 常见方法
  • 问题回答版
    • 基本数据类型
      • Java基本数据类型有几种?各占多少位?
    • 包装类
      • 基础类型和包装类有什么区别?
      • 自动装箱与拆箱了解吗?原理是什么?
    • Integer
      • int和Integer区别是什么?
      • Integer缓存机制了解吗?
    • BigDecimal
      • 为什么浮点数运算时会有精度丢失的风险?
      • 怎么避免浮点数精度丢失的问题?
      • 如何比较两个BigDecimal是否相等?

基础版

数据类型

Java 中的数据类型有两类:

  • 值类型:又叫内置数据类型,基本数据类型
  • 引用类型:除值类型以外,都是引用类型,包括String、数组等

值类型和引用类型的区别

-基本类型引用类型
概念变量名指向具体的数值变量名指向村数据对象的内存地址
内存变量在声明之后,Java会立刻分配给他内存空间以特殊的方式(类似C指针)指向对象实体。这类变量声明时不会分配内存,只是存储了一个内存的地址
使用需要赋具体值,判断时使用==可以赋null,判断时使用equals方法

数据转换

自动转换

  • 由小数据转换为大数据(扩大转换,不会丢失数据精度)。

这些类型由“小”到“大”分别为:(byte,short,char) < int < long < float < double。
这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。

  • 转换前后的数据类型要兼容
  • 整数型和浮点型进行计算后,结果会转为浮点型
    强制转换
    引用类型也可以使用强制转换。使用括号()
float f = 25.5f;
int x = (int)f;

包装类

以下对象的属性必须使用包装类:

  • POJO:Plain Ordinary Java Object,简单无规则的Java对象。只有属性字段、setter和getter方法。
  • DTO:Data Transfer Object,数据传输对象。泛指用于展示层与服务层之间的数据传输对象。
  • VO:View Object,视图对象。把某个页面的数据封装起来。
  • PO:Persistant Object,持久化对象。可以看成是与数据库中的表映射的Java对象。

原因:数据库的查询结果可能是null,如果使用基本类型的话,因为要自动拆箱(把包装类型转为基本类型,比如把Integer对象转换成int值),就会抛出NullPointException异常。

BigDecimal

常见方法

创建

使用BigDecimal(String val)构造方法,或BigDecimal.valueOf(double val)静态方法,来创建对象

加减乘除

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
System.out.println(a.add(b));// 1.9  加
System.out.println(a.subtract(b));// 0.1  减
System.out.println(a.multiply(b));// 0.90  乘
System.out.println(a.divide(b));// 无法除尽,抛出 ArithmeticException 异常
System.out.println(a.divide(b, 2, RoundingMode.HALF_UP));// 1.11

其中
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
    return divide(divisor, scale, roundingMode.oldMode);
}
语法含义为
divide(divisor, 保留几位小数, 保留规则(不要选择 UNNECESSARY);

大小比较

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
System.out.println(a.compareTo(b));// 1 (a>b)

a<b:-1
a=b:0

保留几位小数setScale()

问题回答版


基本数据类型

Java基本数据类型有几种?各占多少位?

8种。大致分4类(布尔型、字符型、整数型、浮点型)。

基本数据类型分类比特数默认值取值范围说明
boolean布尔型8 位false{false,true}
char字符型16 位‘\u0000’[0, 216-1]存储Unicode码,用单引号赋值
byte整数型8 位0[-27, 27-1]
short整数型16 位0[-215, 215-1]
int整数型32 位0[-231, 231-1]
long整数型64 位0L[-263,263-1]赋值时一般在数字后加上l或L
float浮点型32 位+0.0f[2-149, 2128-1]赋值时必须在数字后加上f或F
double浮点型64 位+0.0D[2-1074, 21024-1]赋值时一般在数字后加d或D

包装类

基础类型和包装类有什么区别?

参考链接

Java的每个基本类型都对应了一个包装类型。主要区别有四点。

  1. 包装类型可以为null,基本类型不可以。
  2. 包装类型可用于泛型,基本类型不可以。编译会出错。
    List<int> list = new ArrayList<>(); // 提示 Syntax error, insert "Dimensions" to complete 		ReferenceType
    

List list = new ArrayList<>();
``

因为泛型在编译时会进行类型擦除,最后只保留原始类型。而原始类型只能是Object类及其子类——基本类型是个特例。

  1. 基本类型比包装类型更高效。

基本类型在栈中直接存储具体数值,包装类型存储堆中的引用。因此,包装类型需要占用更多的内存空间。假如没有基本类型,对于数值这类经常使用到的数据来说,每次都要通过new一个包装类型就显得非常笨重。

  1. 两个包装类型的值可以相同,但不相等。

自动装箱与拆箱了解吗?原理是什么?

指基本类型和包装类型之间的转换。

  • 装箱boxing:基本类型→包装类型。
  • 拆箱unboxing:包装类型→基本类型。

原理:
Java SE5 之前,只能手动:

Integer chenmo = new Integer(10);  // 手动装箱
int wanger = chenmo.intValue();  // 手动拆箱

Java SE5 之后,可以自动:

Integer chenmo  = 10;  // 自动装箱
int wanger = chenmo;     // 自动拆箱

上面这段代码使用JAD反编译后的结果:

Integer chenmo = Integer.valueOf(10);
int wanger = chenmo.intValue();
// 也就是说,自动装箱是通过 Integer.valueOf() 完成的;自动拆箱是通过 Integer.intValue() 完成的。

Integer

int和Integer区别是什么?

int是Java的8个原始数据类型之一。Java虽然号称一切都是对象,但原始数据类型是例外。

Integer是int对应的包装类。有一个int类型的字段存储数据,并且提供了基本操作,如数学运算、int和字符串之间转换等。

Integer缓存机制了解吗?

这是Java5中的改进。

构建Integer对象的传统方式是直接调用构造器,直接new一个对象。但实际上,大部分数据操作都集中在有限的、较小的数值范围。所以,Java5中新增静态工厂方法valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。这个缓存值得范围默认是-128到127之间。

BigDecimal

参考链接

为什么浮点数运算时会有精度丢失的风险?

与计算机保存浮点数的机制有关。计算机是二进制的,在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,从而导致小数精度发生损失。所以浮点数没有办法用二进制精确表示。

浮点数运算

float a = 2.0f - 1.9f;
float b = 1.8f - 1.7f;
System.out.println(a);// 0.100000024
System.out.println(b);// 0.099999905
System.out.println(a == b);// false

怎么避免浮点数精度丢失的问题?

浮点数之间的等值判断,基本数据类型不能用==,包装数据类型不能用equals

可以使用BigDecimal来进行浮点数运算。

如何比较两个BigDecimal是否相等?

使用compareTo()方法。

BigDecimal 使用 equals() 方法进行等值比较出现问题的代码示例:

BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("1.0");
System.out.println(a.equals(b));//false

这是因为 equals() 方法不仅仅会比较值的大小(value)还会比较精度(scale),而 compareTo() 方法比较的时候会忽略精度。

1.0 的 scale 是 1,1 的 scale 是 0,因此 a.equals(b) 的结果是 false。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/606511.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CST软件的界面快捷键汇总与操作窗口【入门基础】

CST界面操作快捷键 利用鼠标和键盘快捷键的GUI操作 View > Mouse Control 本章节介绍&#xff0c;使用鼠标和键盘快捷键&#xff0c;操作CST软件的2D/3D GUI (Graphical User Interface图形用户界面)的方法。为了快速方便地操作2D/3D Model&#xff0c;建议熟悉本章节的内…

springcloud报错:Failed to start bean‘webServerStartStop‘

如果你正在使用nacos进行服务注册&#xff0c;然后报一下错误&#xff1a; 那就说明的nacos没有打开&#xff0c;所以找到你的下载nacos的文件夹 好了&#xff0c;错误完美解决~

eNSP Pro 最新版安装实践

目录 写在前面什么是eNSP Pro版本配置需求 安装流程宿主机环境安装步骤 写在前面 最近听到说&#xff0c;华为的eNSP Pro不再限制账号使用了&#xff0c;马上尝试了一下。 官网下载链接&#xff1a; https://support.huawei.com/enterprise/zh/enterprise-professional-servic…

鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单

很香的 Docker 如果只是为了编译鸿蒙,初级的接触鸿蒙,docker是很香的,从第一次接触docker就对它爱不释手, 脏活累活它干了,少了太多的麻烦. docker 编译鸿蒙看编译环境篇就行了, L1 和 L2 都编译通过了.如果要深入的了解鸿蒙,比如调试鸿蒙的代码或编译工具,就需要另辟蹊径了. …

区块链的可扩展性三难问题

这个词是由以太坊的联合创始人Vitalik Buterin创造的&#xff0c;并提出了理想的区块链需要具备的三个特征&#xff1a;去中心化、可扩展性和安全性。 Vitalik还提出&#xff0c;区块链几乎不可能很好地实现所有这三个特征&#xff0c;所以会出现权衡。 因此&#xff0c;今天…

linux 使用intel oneapi报错报错

使用intel oneapi 2024.1.0 时经常报这个错误 因为当前 intel2024.1.0没有在使用 需要改回2024.0.0并安装适配的torch的包来运行

XN297 2.4GHz 单片高速无线收发芯片

概述 XN297是一款工作在2.400~2.483GHz世界通用ISM频段的单片无线收发芯片。该芯片集成 射频收发器、频率发生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持一对多组网和带 ACK的通信模式。发射输出功率、工作频道以及通信数据率均可配置。 主要特性 1、低功…

三星硬盘好还是西数硬盘好?硬盘数据丢失怎么找回

在数字化时代&#xff0c;硬盘作为数据存储的核心组件&#xff0c;其品质与性能直接关系到用户的数据安全与使用体验。在众多硬盘品牌中&#xff0c;三星与西数无疑是两个备受关注的名字。那么&#xff0c;究竟是三星硬盘更胜一筹&#xff0c;还是西数硬盘更受用户青睐&#xf…

【项目】使用Yolov8 + tesseract 实现“营业执照”信息解析(OCR) + 输入可为图片或者pdf + 完整代码 + 整体方案 + 全网首发

本项目可用于毕业设计参考、实验等,营业执照分为横版和竖版,整体检测+识别效果如下所示: 说明:图片来源于网络,如有侵权,请联系作者删除。 目录

DRF 目录总结+思维导图

【0】思维导图链接 链接: https://gitmind.cn/app/docs/mcd0bc41 密码: 4350 【一】DRF 基础知识 DRF 基础知识-CSDN博客 【二】CBV 源码解析 Django CBV源码分析-CSDN博客 【三】APIView源码解析 DRF APIView源码分析-CSDN博客 【四】request源码分析 DRF APIView源码分…

# 从浅入深 学习 SpringCloud 微服务架构(十三)SCG 网关中使用 sentinel 限流

从浅入深 学习 SpringCloud 微服务架构&#xff08;十三&#xff09;SCG 网关中使用 sentinel 限流 一、SCG 网关中使用 sentinel 限流&#xff1a;入门案例 1、基于 Sentinel 的限流&#xff1a; 1&#xff09; Sentinel 支持对 Spring Cloud Gateway, Zuul 等主流的 API G…

【全开源】Java洗衣清洁服务同城清洗服务小程序源码

特色功能&#xff1a; 在线预约与支付&#xff1a;用户可以通过洗衣小程序在线预约洗衣服务&#xff0c;并选择支付方式进行支付&#xff0c;如微信支付、支付宝等。这种在线预约和支付的方式极大地方便了用户&#xff0c;提高了服务的便捷性。智能推荐与选择&#xff1a;根据…

探索C++的string:从基础到深入

文章目录 string类string类的接口string的常见构造string类对象的容量操作string类的遍历及访问操作string类对象的修改操作string类的非成员函数 总结 string类 C中的string类是一个非常重要的字符串处理工具&#xff0c;它提供了一种方便且灵活的方式来处理字符串。它位于标…

Vue3专栏项目 -- 一、第一个页面(下)

一、Dropdown 组件&#xff08;下拉菜单组件&#xff09;编码 1、基本功能&#xff1a;展示出下拉按钮和下拉菜单栏的样式 我们可以通过bootstrap来实现这个下拉框&#xff0c;需要注意它这个只是有样式&#xff0c;是没有行为的 然后这个下拉按钮的文字展示是根据用户名称展…

云推流-让ue/unity内容及3D大型模型内容轻松做到网页使用的解决方案

UE&#xff08;Unreal Engine&#xff09;和Unity作为当下最热门的游戏引擎之一&#xff0c;为开发者提供了强大的工具集和平台支持&#xff0c;使得创建高质量、交互式的3D场景变得越来越容易。 然而&#xff0c;当我们把这种较大的资源分享给其他人时&#xff0c;对方可能需要…

qml拖动交换之Gridview

qml拖动交换之Gridview 坐标变换代码 QML中mapToItem和mapFromItem的使用 坐标变换 代码 import QtQuick 2.6 import QtQuick.Window 2.2Window {visible: truewidth: 1024height: 480title: qsTr("Drag Icon")property ListModel dataModel: ListModel {ListEleme…

摩菲Murphy显示器显示表 总线编程器维修PV780B

Murphy仪器维修包括&#xff1a;摩菲数字显示器&#xff1b;摩菲监视仪表&#xff1b;摩菲CAN总线控制器等维修 维修故障包括&#xff1a;黑屏、指示灯无显示&#xff0c;触摸屏上电无反应&#xff0c; 上电蓝屏、白屏&#xff0c;通电几分钟后屏幕变为蓝屏&#xff0c;主板故…

46. UE5 RPG 增加角色受击反馈

在前面的文章中&#xff0c;我们实现了对敌人的属性的初始化&#xff0c;现在敌人也拥有的自己的属性值&#xff0c;技能击中敌人后&#xff0c;也能够实现血量的减少。 现在还需要的就是在技能击中敌人后&#xff0c;需要敌人进行一些击中反馈&#xff0c;比如敌人被技能击中后…

android基础-多线程

多线程&#xff1a; 创建子线程&#xff0c;子线程不允许直接更新UI&#xff0c;试想下如果多个线程去更新UI&#xff0c;则会造成资源错乱&#xff0c;如果枷锁就会使得代码冗余复杂。 android异步处理&#xff1a; 另一种异步多线程方法 doInBackground是在子线程中。

VisualGDB:Linux动态库项目创建、编译及库的使用

此篇接上篇 《VisualGDB:为Linux项目添加系统依赖库》,在本篇中我们重点分享一下如何基于VisualGDB 在VS中创建Linux动态库项目,如何编译及使用创建的动态库。 一、VisualGDB创建Linux动态库项目 如下,我们创建一个Linux下的动态库项目MyMath 二、编译动态库 我们稍微…