JAVA-八种基础数据类型和包装类型及相关面试题

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: JAVA-八种基础数据类型和包装类型及相关面试题

文章目录

六、总结

前言

   在计算机编程中,数据类型是非常重要的概念。数据类型定义了变量或表达式能够存储的数据范围和类型。在Java中,有基本数据类型和包装类型两种。基本数据类型包括整型、浮点型、字符型和布尔型,它们是Java语言的基础,直接存储在内存中。而包装类型则是为了解决基本数据类型不能直接参与面向对象编程而设计的,它们是基本数据类型对应的类,提供了更多的操作和功能。


   本文将深入探讨Java中的基本数据类型和包装类型。我们将从数据类型的定义、内存分配、转换规则等方面入手,详细介绍Java中各种数据类型的特点和使用方法。同时,我还将介绍如何在程序中正确地使用基本数据类型和包装类型,以及如何避免常见的数据类型错误和陷阱。


   无论是初学者还是有一定经验的Java开发者,了解数据类型的知识都是非常重要的。希望通过本文的介绍,读者能够更深入地理解Java中的数据类型,更加熟练地运用它们,从而写出更加高效和优秀的Java程序。


   Java是一种面向对象的编程语言,拥有丰富的数据类型和数据结构。在Java中,数据类型可以分为基本数据类型和包装类型。这篇文章将深入探讨这些数据类型及其相关内容。


一、基本数据类型

   Java中的基本数据类型是指直接存储数据值的数据类型。在Java中,基本数据类型有八种:byte、short、int、long、float、double、char和boolean。下面我们将逐一介绍这些数据类型的特点及其使用方法。


1.1 分类


1.2 概念

byte

   byte是一种8位的有符号数据类型,可以存储-128到+127之间的整数。byte类型通常用于存储小的整数值,例如文件中的字节、图像处理中的像素等。


short

   short是一种16位的有符号数据类型,可以存储-32768到+32767之间的整数。short类型通常用于存储中等大小的整数值,例如音频处理中的采样值等。


int

   int是一种32位的有符号数据类型,可以存储-2147483648到+2147483647之间的整数。int类型是Java程序中最常用的整数类型,通常用于存储整数值。


long

   long是一种64位的有符号数据类型,可以存储-9223372036854775808到+9223372036854775807之间的整数。long类型通常用于存储大整数值,例如时间戳等。


float

   float是一种32位的单精度浮点数据类型,可以存储6~7位有效数字的浮点数。float类型通常用于存储较小的浮点数值,例如科学计算中的实验数据等。


double

   double是一种64位的双精度浮点数据类型,可以存储15~16位有效数字的浮点数。double类型通常用于存储较大的浮点数值,例如金融计算中的货币数据等。


char

   char是一种16位的无符号Unicode字符数据类型,可以存储任何Unicode字符。char类型通常用于存储单个字符,例如字符串中的字符等。


boolean

   boolean是一种布尔数据类型,只能存储true或false两个值。boolean类型通常用于存储条件结果,例如if语句中的条件判断等。


1.3 代码

public class Main {
    public static void main(String[] args) {
        // 整型
        int i = 10;
        System.out.println("int类型:" + i);
        // 浮点型
        float f = 3.14f;
        double d = 3.14159265358979323846;
        System.out.println("float类型:" + f);
        System.out.println("double类型:" + d);
        // 字符型
        char c = 'A';
        System.out.println("char类型:" + c);
        // 布尔型
        boolean b = true;
        System.out.println("boolean类型:" + b);
        // 字符串类型
        String s = "Hello World!";
        System.out.println("String类型:" + s);
        // 基本数据类型之间的转换
        int j = 100;
        long l = j; // 自动类型转换
        System.out.println("int类型自动转换为long类型:" + l);
        double e = 2.71828;
        int k = (int)e; // 强制类型转换
        System.out.println("double类型强制转换为int类型:" + k);
    }
}

1.4 二维表二、各基本数据类型间强制转换

2.1 为什么Java中有强制转换?

   Java中有强制转换是因为在程序中可能会出现需要将一种数据类型转换为另一种数据类型的情况。例如,我们可能需要将一个整数类型的变量转换为浮点数类型的变量,或者需要将一个浮点数类型的变量转换为整数类型的变量。在这种情况下,我们就需要使用强制类型转换。


   强制类型转换可以将一个数据类型的值强制转换为另一个数据类型的值。但是需要注意的是,强制类型转换可能会导致精度的损失或数据溢出,因此在进行强制类型转换时需要格外小心,并且需要确保转换的结果是正确的。


2.2 示例代码

public class Main {
    public static void main(String[] args) {
        // 强制将 int 类型转换为 double 类型
        int num1 = 10;
        double num2 = (double) num1; // 注意要加上强制转换符号
        // 强制将 double 类型转换为 int 类型
        double num3 = 3.14;
        int num4 = (int) num3; // 小数部分会被直接截断,只保留整数部分
        // 强制将 long 类型转换为 int 类型
        long num5 = 100L;
        int num6 = (int) num5; // 当 long 类型的值大于 int 类型的最大值时会出现数据溢出
        // 强制将 char 类型转换为 int 类型
        char ch = 'a';
        int num7 = (int) ch; // 实际上是将字符的 Unicode 码转换为 int 类型
        // 强制将 int 类型转换为 byte 类型
        int num8 = 128;
        byte num9 = (byte) num8; // 当 int 类型的值超出 byte 类型的范围时会出现数据溢出
        // 强制将 int 类型转换为 short 类型
        int num10 = 32768;
        short num11 = (short) num10; // 当 int 类型的值超出 short 类型的范围时会出现数据溢出
        // 强制将 float 类型转换为 int 类型
        float num12 = 3.14F;
        int num13 = (int) num12; // 小数部分会被直接截断,只保留整数部分
    }
}

三、包装类型

3.1 为什么有包装类型?

   Java中的包装类型是对基本数据类型的封装,用于在面向对象的环境下使用基本数据类型。

   Java中的包装类型有八种,与基本数据类型一一对应:Byte、Short、Integer、Long、Float、Double、Character和Boolean。


3.2 基本概念

Byte

   Byte是基本数据类型byte的包装类,提供了一些方法用于转换byte类型的值。例如,byteValue()方法可以返回Byte对象所包含的byte值,parseByte()方法可以将字符串解析为byte类型的值。


Short

   Short是基本数据类型short的包装类,提供了一些方法用于转换short类型的值。例如,shortValue()方法可以返回Short对象所包含的short值,parseShort()方法可以将字符串解析为short类型的值。


Integer

   Integer是基本数据类型int的包装类,提供了一些方法用于转换int类型的值。例如,intValue()方法可以返回Integer对象所包含的int值,parseInt()方法可以将字符串解析为int类型的值。


Long

   Long是基本数据类型long的包装类,提供了一些方法用于转换long类型的值。例如,longValue()方法可以返回Long对象所包含的long值,parseLong()方法可以将字符串解析为long类型的值。


Float

   Float是基本数据类型float的包装类,提供了一些方法用于转换float类型的值。例如,floatValue()方法可以返回Float对象所包含的float值,parseFloat()方法可以将字符串解析为float类型的值。


Double

   Double是基本数据类型double的包装类,提供了一些方法用于转换double类型的值。例如,doubleValue()方法可以返回Double对象所包含的double值,parseDouble()方法可以将字符串解析为double类型的值。


Character

   Character是基本数据类型char的包装类,提供了一些方法用于转换char类型的值。例如,charValue()方法可以返回Character对象所包含的char值。


Boolean

   Boolean是基本数据类型boolean的包装类,提供了一些方法用于转换boolean类型的值。例如,booleanValue()方法可以返回Boolean对象所包含的boolean值。


3.3 转换方法

byte 和 Byte

// byte 转 Byte
byte b1 = 10;
Byte b2 = Byte.valueOf(b1); // 调用Byte类的valueOf方法将byte类型转为Byte类型
System.out.println(b2); // 输出10
// Byte 转 byte
Byte b3 = new Byte((byte) 20);
byte b4 = b3.byteValue(); // 调用Byte类的byteValue方法将Byte类型转为byte类型
System.out.println(b4); // 输出20

short 和 Short

// short 转 Short
short s1 = 30;
Short s2 = Short.valueOf(s1); // 调用Short类的valueOf方法将short类型转为Short类型
System.out.println(s2); // 输出30
// Short 转 short
Short s3 = new Short((short) 40);
short s4 = s3.shortValue(); // 调用Short类的shortValue方法将Short类型转为short类型
System.out.println(s4); // 输出40

int 和 Integer

// int 转 Integer
int i1 = 50;
Integer i2 = Integer.valueOf(i1); // 调用Integer类的valueOf方法将int类型转为Integer类型
System.out.println(i2); // 输出50
// Integer 转 int
Integer i3 = new Integer(60);
int i4 = i3.intValue(); // 调用Integer类的intValue方法将Integer类型转为int类型
System.out.println(i4); // 输出60

long 和 Long

// long 转 Long
long l1 = 70;
Long l2 = Long.valueOf(l1); // 调用Long类的valueOf方法将long类型转为Long类型
System.out.println(l2); // 输出70
// Long 转 long
Long l3 = new Long(80L);
long l4 = l3.longValue(); // 调用Long类的longValue方法将Long类型转为long类型
System.out.println(l4); // 输出80

float 和 Float

// float 转 Float
float f1 = 1.23f;
Float f2 = Float.valueOf(f1); // 调用Float类的valueOf方法将float类型转为Float类型
System.out.println(f2); // 输出1.23
// Float 转 float
Float f3 = new Float(4.56f);
float f4 = f3.floatValue(); // 调用Float类的floatValue方法将Float类型转为float类型
System.out.println(f4); // 输出4.56

double 和 Double

// double 转 Double
double d1 = 7.89;
Double d2 = Double.valueOf(d1); // 调用Double类的valueOf方法将double类型转为Double类型
System.out.println(d2); // 输出7.89
// Double 转 double
Double d3 = new Double(0.123);
double d4 = d3.doubleValue(); // 调用Double类的doubleValue方法将Double类型转为double类型
System.out.println(d4); // 输出0.123

char 和 Character

// char 转 Character
char c1 = 'A';
Character c2 = Character.valueOf(c1); // 调用Character类的valueOf方法将char类型转为Character类型
System.out.println(c2); // 输出A
// Character 转 char
Character c3 = new Character('B');
char c4 = c3.charValue(); // 调用Character类的charValue方法将Character类型转为char类型
System.out.println(c4); // 输出B

boolean 和 Boolean

// boolean 转 Boolean
boolean b1 = true;
Boolean b2 = Boolean.valueOf(b1); // 调用Boolean类的valueOf方法将boolean类型转为Boolean类型
System.out.println(b2); // 输出true
// Boolean 转 boolean
Boolean b3 = new Boolean(false);
boolean b4 = b3.booleanValue(); // 调用Boolean类的booleanValue方法将Boolean类型转为boolean类型
System.out.println(b4); // 输出false

四、转换过程中使用的自动装箱和自动拆箱

4.1 来源

   自动装箱和自动拆箱是Java语言中的特性,它们的来源是为了让开发者更方便地将基本数据类型转换为对象类型和将对象类型转换为基本数据类型。在Java 5之前,开发者需要手动进行转换,而在Java 5之后,Java引入了自动装箱和自动拆箱的特性,使得开发者无需手动转换,而是由编译器自动完成转换的工作。


4.2 原理

   自动装箱是指将基本数据类型转换为对应的包装类型,例如将int类型的值转换为Integer类型的对象。自动装箱是通过Java编译器在编译代码时自动完成的,不需要程序员显式地调用。


   自动拆箱是指将包装类型转换为对应的基本数据类型,例如将Integer类型的对象转换为int类型的值。自动拆箱是通过Java编译器在编译代码时自动完成的,不需要程序员显式地调用。


   除了自动装箱和自动拆箱外,程序员还可以显式地进行基本数据类型和包装类型之间的转换。这种转换可以通过包装类型的构造方法或静态方法来实现。例如,可以通过Integer的构造方法将int类型的值转换为Integer类型的对象,也可以通过Integer的静态方法valueOf()将int类型的值转换为Integer类型的对象。


4.3 示例代码

public class AutoBoxingExample {
    public static void main(String[] args) {
        // 定义一个基本数据类型int
        int i = 10;
        // 自动装箱,将int类型的值转换为对应的包装器类型Integer
        Integer integer = i;
        // 自动拆箱,将Integer类型的对象转换为对应的int值
        int j = integer;
        // 自动装箱,将boolean类型的值转换为对应的包装器类型Boolean
        Boolean bool = true;
        // 自动拆箱,将Boolean类型的对象转换为对应的boolean值
        boolean b = bool;
        // 自动装箱,将double类型的值转换为对应的包装器类型Double
        Double d = 3.14;
        // 自动拆箱,将Double类型的对象转换为对应的double值
        double e = d;
        // 打印结果
        System.out.println("integer: " + integer);
        System.out.println("j: " + j);
        System.out.println("bool: " + bool);
        System.out.println("b: " + b);
        System.out.println("d: " + d);
        System.out.println("e: " + e);
    }
}
输出结果为:
integer: 10
j: 10
bool: true
b: true
d: 3.14
e: 3.14

4.4 二维表五、相关面试题

5.1 为什么应该避免使用包装类型?

   使用包装类型会带来一些额外的开销,如对象创建、内存分配和垃圾回收等,对性能有一定的影响。因此,在性能要求较高的场景下,应该尽量使用基本数据类型。


5.2 Java中如何判断两个包装类型是否相等?

   在Java中判断两个包装类型是否相等,不能使用 == 运算符,因为此运算符比较的是两个对象的引用地址,而不是对象本身的值。


   应该使用 equals() 方法进行比较。equals() 方法比较的是对象的值是否相等。当包装类型的值相等时,equals() 方法返回 true,否则返回 false。


下面是一个示例代码:

Integer a = 10;
Integer b = 10;
if (a.equals(b)) {
    System.out.println("a 和 b 相等");
} else {
    System.out.println("a 和 b 不相等");
}

  在上面的代码中,a 和 b 都是 Integer 类型的对象,它们的值都为 10。使用 equals() 方法比较它们的值,结果为 true,因此输出 “a 和 b 相等”。

5.3 Java中的基本数据类型和包装类型在内存中的存储方式有什么区别?

5.4 Java中的基本数据类型和包装类型可以作为泛型类型参数吗?

   在Java中,基本数据类型不能作为泛型类型参数,只能使用其对应的包装类型作为泛型类型参数。


   这是因为泛型类型参数只能是引用类型,基本数据类型不是引用类型,而只是一个简单的值类型。因此,基本数据类型不能作为泛型类型参数。


   但是,Java SE 5.0 以后的版本中,引入了自动装箱和拆箱功能,使得基本数据类型与其对应的包装类型之间可以进行自动转换。这样,在使用泛型时,我们可以直接使用基本数据类型,Java会自动将其转换为对应的包装类型。


   例如,我们可以使用 List 来存储整数,或者使用 Map<String, Boolean> 来存储布尔值等。


   需要注意的是,如果使用基本数据类型作为方法的参数或返回值,我们仍然需要使用其对应的包装类型。因为方法参数和返回值也必须是引用类型。


5.5 char类型能不能存储一个汉字?为什么?

   在Java中,char类型是16位的,可以存储Unicode编码中的字符。汉字是Unicode编码中的字符之一,一个汉字通常由多个Unicode编码的字符组成,例如“中”字的Unicode编码为’\u4E2D’。因此,如果要存储一个汉字,需要使用多个char类型的变量来表示。


   例如,要表示“中”字,需要使用两个char类型的变量来表示,代码如下:

char c1 = '\u4E2D'; // 第一个字符
char c2 = '\u6587'; // 第二个字符

  虽然char类型可以存储一个汉字,但是需要注意它只能存储一个字符,而不能存储整个汉字。同时,由于Java中的字符串类型是由多个字符构成的,因此在实际开发中,通常使用字符串类型来存储汉字。


六、总结

   本文介绍了Java中的基本数据类型和包装类型,包括它们各自的特点及其使用方法。同时,还介绍了基本数据类型和包装类型之间的转换,包括自动装箱和自动拆箱以及显式转换。掌握这些知识,可以帮助程序员更好地使用Java中的数据类型,提高程序的效率和可读性。


相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
7天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
13天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
10天前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
9天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
33 4
|
7天前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
22 1
|
10天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
49 4
|
11天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
26 2
|
SQL 缓存 安全
Java高频面试题目
面试时面试官最常问的问题总结归纳!
142 0
JAVA高频面试题目集锦(6)
JAVA高频面试题目集锦(6)
141 0
JAVA高频面试题目集锦(6)