Java面试要点01- 基本数据类型与包装类详解

在这里插入图片描述

本文目录

    • 一、引言
    • 二、基本数据类型详解
      • 2.1 数值类型
      • 2.2 代码示例
    • 三、包装类详解
      • 3.1 包装类介绍
      • 3.2 包装类的主要用途
      • 3.3 代码示例
    • 四、注意事项和最佳实践
      • 4.1 数值计算注意事项
      • 4.2 包装类使用建议
    • 五、面试重点详解
      • 5.1 基本类型和包装类的区别
      • 5.2 自动装箱和拆箱的原理
      • 5.3 Integer缓存池的实现
      • 5.4 浮点数精度问题的解决方案
      • 5.5 包装类的equals和==的区别
      • 5.6 BigDecimal的使用场景


一、引言

在Java中,数据类型分为两大类:基本数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。理解这些数据类型的特点和使用场景,对于写出高质量的Java代码至关重要。

二、基本数据类型详解

2.1 数值类型

  1. 整数类型
  • byte:8位,范围-128 ~ 127
  • short:16位,范围-32768 ~ 32767
  • int:32位,范围-2^31 ~ 2^31-1
  • long:64位,范围-2^63 ~ 2^63-1
  1. 浮点类型
  • float:32位,单精度浮点数
  • double:64位,双精度浮点数
  1. 字符类型
  • char:16位Unicode字符,范围’\u0000’(0) ~ ‘\uffff’(65535)
  1. 布尔类型
  • boolean:只有true和false两个值

2.2 代码示例

public class PrimitiveTypeDemo {public static void main(String[] args) {// 整数类型示例byte b = 127;short s = 32767;int i = 2147483647;long l = 9223372036854775807L; // 注意使用L后缀// 浮点类型示例float f = 3.14F;  // 注意使用F后缀double d = 3.14159265359;// 字符类型示例char c = 'A';char unicode = '\u0041'; // Unicode表示的'A'// 布尔类型示例boolean flag = true;// 打印各类型的值和范围System.out.println("byte value: " + b + ", range: " + Byte.MIN_VALUE + " ~ " + Byte.MAX_VALUE);System.out.println("short value: " + s + ", range: " + Short.MIN_VALUE + " ~ " + Short.MAX_VALUE);System.out.println("int value: " + i + ", range: " + Integer.MIN_VALUE + " ~ " + Integer.MAX_VALUE);System.out.println("long value: " + l + ", range: " + Long.MIN_VALUE + " ~ " + Long.MAX_VALUE);System.out.println("float value: " + f);System.out.println("double value: " + d);System.out.println("char value: " + c + ", unicode value: " + unicode);System.out.println("boolean value: " + flag);}
}

三、包装类详解

3.1 包装类介绍

每个基本数据类型都有对应的包装类:

  • Byte:byte的包装类
  • Short:short的包装类
  • Integer:int的包装类
  • Long:long的包装类
  • Float:float的包装类
  • Double:double的包装类
  • Character:char的包装类
  • Boolean:boolean的包装类

3.2 包装类的主要用途

  1. 作为对象使用,可以存储在集合中
  2. 提供了很多实用的方法
  3. 支持null值
  4. 用于泛型类型参数

3.3 代码示例

public class WrapperClassDemo {public static void main(String[] args) {// 装箱:基本类型转包装类Integer num1 = Integer.valueOf(10);    // 显式装箱Integer num2 = 20;                     // 自动装箱// 拆箱:包装类转基本类型int num3 = num1.intValue();           // 显式拆箱int num4 = num2;                      // 自动拆箱// 包装类的常用方法// 1. 字符串转换int i1 = Integer.parseInt("100");double d1 = Double.parseDouble("3.14");// 2. 进制转换String binary = Integer.toBinaryString(10);    // 转二进制String hex = Integer.toHexString(10);         // 转十六进制String octal = Integer.toOctalString(10);     // 转八进制// 3. 常量值System.out.println("Integer MAX_VALUE: " + Integer.MAX_VALUE);System.out.println("Integer MIN_VALUE: " + Integer.MIN_VALUE);// 4. 比较Integer num5 = 127;Integer num6 = 127;Integer num7 = 128;Integer num8 = 128;// 整数缓存池示例(-128 ~ 127)System.out.println("num5 == num6: " + (num5 == num6));    // trueSystem.out.println("num7 == num8: " + (num7 == num8));    // falseSystem.out.println("num7.equals(num8): " + num7.equals(num8));  // true}
}

四、注意事项和最佳实践

4.1 数值计算注意事项

  1. 浮点数精度问题
public class FloatPrecisionDemo {public static void main(String[] args) {double d1 = 0.1;double d2 = 0.2;System.out.println("0.1 + 0.2 = " + (d1 + d2));  // 0.30000000000000004// 使用BigDecimal处理精确计算BigDecimal bd1 = new BigDecimal("0.1");BigDecimal bd2 = new BigDecimal("0.2");System.out.println("BigDecimal: 0.1 + 0.2 = " + bd1.add(bd2));  // 0.3}
}

4.2 包装类使用建议

  1. 使用equals()而不是==进行值比较
  2. 注意Integer缓存池的范围(-128 ~ 127)
  3. 处理精确计算时使用BigDecimal
  4. 合理选择基本类型和包装类

五、面试重点详解

5.1 基本类型和包装类的区别

  1. 存储位置

    • 基本类型:存储在栈内存中
    • 包装类:存储在堆内存中,栈内存中存储的是引用
  2. 默认值

    • 基本类型:有默认值(如int为0,boolean为false)
    • 包装类:默认值为null
  3. 性能

    • 基本类型:运算效率更高
    • 包装类:需要额外的内存空间和装箱拆箱操作
public class TypeComparisonDemo {// 类成员变量的默认值示例private int primitiveInt;      // 默认值为0private Integer wrapperInt;    // 默认值为nullpublic void performanceTest() {// 性能对比long start = System.nanoTime();int sum1 = 0;for(int i = 0; i < 1000000; i++) {sum1 += i;}long primitive = System.nanoTime() - start;start = System.nanoTime();Integer sum2 = 0;for(Integer i = 0; i < 1000000; i++) {sum2 += i;  // 涉及装箱拆箱}long wrapper = System.nanoTime() - start;System.out.println("Primitive type time: " + primitive);System.out.println("Wrapper class time: " + wrapper);}
}

5.2 自动装箱和拆箱的原理

  1. 装箱过程

    • 自动装箱是通过调用包装类的valueOf方法实现的
    • 例如:Integer i = 10; 实际上是 Integer i = Integer.valueOf(10);
  2. 拆箱过程

    • 自动拆箱是通过调用包装类的xxxValue方法实现的
    • 例如:int n = i; 实际上是 int n = i.intValue();
public class AutoBoxingDemo {public static void main(String[] args) {// 自动装箱Integer num1 = 100;    // 编译器会转换为: Integer num1 = Integer.valueOf(100);// 自动拆箱int num2 = num1;       // 编译器会转换为: int num2 = num1.intValue();// 运算中的自动装箱拆箱Integer num3 = num1 + num2;  // 这里涉及到:// 1. num1自动拆箱// 2. 加法运算// 3. 结果自动装箱}
}

5.3 Integer缓存池的实现

  1. 缓存池范围

    • 默认范围:-128 到 127
    • 可通过JVM参数调整上限:-XX:AutoBoxCacheMax=
  2. 实现原理

    • Integer类中维护了一个IntegerCache内部类
    • 在类加载时初始化缓存数组
    • valueOf方法会优先使用缓存池中的对象
public class IntegerCacheDemo {public static void main(String[] args) {// 缓存池范围内Integer num1 = Integer.valueOf(127);Integer num2 = Integer.valueOf(127);System.out.println(num1 == num2);          // true// 缓存池范围外Integer num3 = Integer.valueOf(128);Integer num4 = Integer.valueOf(128);System.out.println(num3 == num4);          // false// 自动装箱也使用缓存池Integer num5 = 127;Integer num6 = 127;System.out.println(num5 == num6);          // true}
}

5.4 浮点数精度问题的解决方案

  1. 问题原因

    • 浮点数采用IEEE 754标准表示
    • 二进制无法精确表示某些十进制小数
  2. 解决方案

    • 使用BigDecimal类
    • 使用整数运算代替浮点运算
    • 使用特定精度的格式化
public class FloatPrecisionDemo {public static void main(String[] args) {// 精度问题示例System.out.println(0.1 + 0.2);                    // 0.30000000000000004// 解决方案1:使用BigDecimalBigDecimal bd1 = new BigDecimal("0.1");BigDecimal bd2 = new BigDecimal("0.2");System.out.println(bd1.add(bd2));                 // 0.3// 解决方案2:使用整数运算System.out.println((1 + 2) / 10.0);              // 0.3// 解决方案3:格式化输出DecimalFormat df = new DecimalFormat("#.##");System.out.println(df.format(0.1 + 0.2));        // 0.3}
}

5.5 包装类的equals和==的区别

  1. == 运算符

    • 比较基本类型:比较值
    • 比较引用类型:比较引用(内存地址)
  2. equals方法

    • 包装类重写了equals方法
    • 比较的是值而不是引用
public class EqualsDemo {public static void main(String[] args) {Integer num1 = new Integer(100);Integer num2 = new Integer(100);Integer num3 = 100;Integer num4 = 100;// == 比较System.out.println(num1 == num2);          // false(不同对象)System.out.println(num3 == num4);          // true(缓存池)// equals比较System.out.println(num1.equals(num2));     // trueSystem.out.println(num3.equals(num4));     // true}
}

5.6 BigDecimal的使用场景

  1. 主要应用场景

    • 金融计算
    • 精确的科学计算
    • 需要精确小数运算的业务逻辑
  2. 使用注意事项

    • 优先使用String构造器
    • 注意scale和舍入模式的设置
    • 使用compareTo而不是equals比较值
public class BigDecimalDemo {public static void main(String[] args) {// 创建BigDecimal的正确方式BigDecimal bd1 = new BigDecimal("0.1");BigDecimal bd2 = BigDecimal.valueOf(0.1);  // 推荐BigDecimal bd3 = new BigDecimal(0.1);      // 不推荐System.out.println("String构造器:" + bd1);System.out.println("valueOf方法:" + bd2);System.out.println("double构造器:" + bd3);// 常见运算BigDecimal price = new BigDecimal("19.99");BigDecimal quantity = new BigDecimal("2");BigDecimal total = price.multiply(quantity);// 设置精度和舍入模式BigDecimal result = total.setScale(2, RoundingMode.HALF_UP);// 比较System.out.println(bd1.compareTo(bd2) == 0);  // trueSystem.out.println(bd1.equals(bd2));          // 可能false(scale不同)}
}

今天的内容就到这里了,希望可以对你有帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

铠侠代理商 | KIOXIA SLC闪存选型和应用

一、铠侠&#xff08;KIOXIA&#xff09;的SLC闪存系列 铠侠SLC NAND可以高速写入大量数据&#xff0c;具有高的擦写次数耐久性和可靠性的1位/单元非易失性存储器。铠侠SLC NAND闪存产品系列具有多种容量和封装形式的选择&#xff0c;可满足嵌入式市场的不同需求。 铠侠的SLC…

ts定义接口返回写法

接口&#xff08;未进行ts定义&#xff09; export async function UserList(params: {// keyword?: string;current?: number;pageSize?: number;},// options?: { [key: string]: any }, ) {return request<API1.UserList>(http://geek.itheima.net/v1_0/mp/artic…

#多语言爬取京东价格信息 python 比价api接入指南

以下是使用 Python 接入京东价格信息比价 API 的一般指南&#xff1a; 寻找合适的比价 API 服务&#xff1a; 市面上有一些第三方数据服务提供商提供京东比价 API。这些服务通常需要你注册账号并申请 API Key 和 API Secret 等凭证&#xff0c;以便进行接口调用。你可以根据自己…

超详细:三大范式和反范式设计详解

目录 1、三大范式 第一范式&#xff1a; 列不可再分 。 第二范式&#xff1a; 行可以唯一区分 第三范式&#xff1a;确保数据的完整性、减少数据冗余和避免更新异常。 反方式模式 实验数据&#xff1a;模拟两张百万量级的数据表 反范式优化实验对比 反范式存在的问题 &am…

新标准大学英语综合教程1课后习题答案PDF第三版

《新标准大学英语&#xff08;第三版&#xff09;综合教程1 》是“新标准大学英语&#xff08;第三版&#xff09;”系列教材之一。本书共包含6个单元&#xff0c;从难度和话题上贴近大一上学生的认知和语言水平&#xff0c;包括与学生个人生活领域和社会文化等相关内容&#x…

Llama 3.2-Vision 多模态大语言模型

1. 引言 Llama 3.2-Vision多模态大型语言模型(文本 图像)是一个图像推理生成模型&#xff0c;按照官方的说法&#xff0c;在常见行业基准测试上&#xff0c;其性能优于许多可用的开源和闭源多模态模型。Llama 3.2-Vision有两个版本&#xff0c;一个是11B (7.9G)&#xff0c;另…

OpenObserve云原生平台指南:在Ubuntu上快速部署与远程观测

文章目录 前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动OpenObserve容器4. 本地访问测试5. 公网访问本地部署的OpenObserve5.1 内网穿透工具安装5.2 创建公网地址 6. 配置固定公网地址 前言 本文主要介绍如何在Linux系统使用Docker快速本地化部署OpenObserve云原生可…

隧道论文阅读2-采用无人融合扫描数据的基于深度学习的垂直型隧道三维数字损伤图

目前存在的问题&#xff1a; 需要开发新的无人测量系统测量垂直隧道图像数据量巨大&#xff0c;基于深度学习完成损伤评估跟踪获取图像位置的困难&#xff0c;对大型基础设施感兴趣区域(roi)的2d和3d地图建立进行了研究&#xff0c;对整个目标结构的损伤定位仍然具有挑战性。为…

【从VAE到LDM】Variational Auto Encoder原理以及关于Latent Diffusion的思考

论文链接&#xff1a;High-Resolution Image Synthesis with Latent Diffusion Models 官方实现&#xff1a;CompVis/latent-diffusion、CompVis/stable-diffusion 视频讲解&#xff1a;一个视频看懂VAE的原理以及关于latent diffusion的思考 前言 目前的扩散模型范式基本上都…

1111fxh,MYSQL加锁规则

怎么查看一个事务中对索引的加锁情况 -- 这条语句可以看到事务执行过程中加了哪些锁 select * from performance_schema.data_locks X是next-key lock 混合锁 X,REC_NOT_GAP就是行锁 X,GAP是间隙锁 可重复读下的加锁规则 2原则2优化 1.加锁的基本单位是next-key lock,即行…

mysql中数据不存在却查询到记录?

前言 首先看下面的查询语种 select * from AudioKnowledgeChatInfo where AudioId297795550566600706; 查询结果如下 看到上面的查询结果&#xff0c;是不是一脸懵&#xff1f;这audioId明显不对啊&#xff0c;怎么查询到了&#xff1f; 原因剖析 首先我们来看看数据库表…

拿不下总统之位,那就用热加载拿下验证码识别与爆破好了!

大家好&#xff0c;这里是在总统选举中惜败的超级牛 虽然没能拿下阿美利卡总统之位 但是牛牛的热加载功能&#xff0c;却能轻松拿下验证码的识别与爆破 验证码一般会在注册、登录等功能&#xff0c;用来防止自动化工具的攻击。一般的验证码生成过程如下图所示&#xff1a; …

闯关leetcode——202. Happy Number

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/happy-number/description/ 内容 Write an algorithm to determine if a number n is happy. A happy number is a number defined by the following process: Starting with any positive inte…

如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息

目录 前言一、什么是Web Scraper API二、Web Scraper API 的优势&#xff1a;三、Web Scraper API 适用场景四、实践案例目标需求视频讲解1、选择Web Scraper API2、登录注册3、进入用户控制面板4、选择API5、触发数据收集 API6、获取爬虫结果7、分析爬虫结果&#xff08;1&…

json转excel,读取json文件写入到excel中【rust语言】

一、rust代码 将json文件写入到 excel中。&#xff08;保持json &#xff1a;key原始顺序&#xff09; use indexmap::IndexMap; use serde::Deserialize; use serde_json::{Value, from_str}; use std::error::Error; use std::io::{self, Write}; use std::path::{Path}; u…

2024年下半年系统规划与管理师论文真题

试题一、论IT服务规划设计 IT服务规划设计处于整个IT服务生命周期中的前端&#xff0c;可以帮助IT服务供方了解客户的需求并对其进行全面的需求分析&#xff0c;规划设计的范围不仅包括新的服务&#xff0c;还包括服务连续性保障服务水平的满足和对标准、规则的遵从&#xff0…

无人机动力测试台如何快速外接第三方传感器

前言 动力测试台对于测试动力系统的拉力、扭矩、RPM 和效率至关重要。将传感器集成到您的测试中增加了另一层优化&#xff0c;可以将您的性能提升到一个新的水平。 在无人驾驶行业中&#xff0c;有充分的证据表明&#xff0c;从外部传感器收集数据可能具有挑战性。为了解决这…

金蝶云星空与旺店通数据集成解决方案实例

金蝶云星空与旺店通旗舰奇门的数据集成案例分享 在企业日常运营中&#xff0c;数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中的直接调拨单数据无缝集成到旺店通旗舰奇门平台。 本次集成方案命名…

gorm使用注意事项

1. 使用updates更新字段为0或""时 在updates更新时&#xff0c;会默认将数值为0、字符串为""等忽略掉&#xff0c;不会更新&#xff1b;比如 db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false, Games: 0, Friend: &qu…

docker compose - 设置名字

只使用 docker compose up 启动容器&#xff0c;默认名字为当前文件夹的名字 设置 project-name&#xff0c;docker 客户端会显示设置的名字&#xff0c;方便区分 docker compose --project-name webtest up错误&#xff1a; docker compose up --project-name webtest 效果…