Java数据类型(八种基本数据类型 + 四种引用类型)、数据类型转换

news2024/11/16 19:30:30

1.总览

  • Java的数据类型只有两大类:8大基本数据类型引用数据类型。其中基本数据类型又被称为值类型
    • 基本数据类型:6种数字类型(byte/short/int/long/float/double)、1种字符型(char)、1种布尔型(boolean)
    • 引用数据类型:类(Class)、接口(Interface)、数组(Array)
    • 除了以上的基本数据类型和引用数据类型,还有一些其他相关的数据类型,例如字符串类型String、枚举类型Enum,它们都是基于引用数据类型来实现的
  • 基本数据类型只能存自己类型的值,无其他额外功能,具体介绍如下第2小节
  • 引用类型:参数传递时,以拷贝引用地址的方式传递给接收变量,而非复制整个数据本体。除八大基本数据类型之外的所有数据类型,都为引用数据类型。所有引用数据类型的默认值都为null。
  • 为了基本数据类型可以与引用数据类型互相转换、以利用彼此的特性,java为每一种基本数据类型提供了相应的包装类。包装类对基本数据类型进行了封装,提供了丰富的功能,包装类是基本类型的拓展
  • 包装类是引用类型的一种,包装类与基本数据类型一一对应,也有8种,分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean

2.基本数据类型

2.1 类型概述

  • 6种数字类型

    • 4种整数型:byte、short、int、long
    • 2种浮点型:float、double
  • 1种字符类型:char

  • 1种布尔型:boolean

2.2 基本数据类型详解

基本类型存储大小初始化默认值取值范围包装类型
byte1字节(8位)0-128~127Byte
short2字节(16位)0-32768~32767Short
int4字节(32位)0-2^31 ~ 2^31 - 1Integer
long8字节(64位)0L。"L"理论上不分大小写,但若写成"l"容易与数字"1"混淆,不容易分辨,所以最好大写。-2^63 ~ 2^63 - 1Long
float4字节(32位)0.0f符合IEEE754标准的浮点数,1.4E-45 ~ 3.4028235E38Float
double8字节(64位)0.0d符合IEEE754标准的浮点数,4.9E-324 ~ 1.7976931348623157E308Double
char2字节(16位)‘\u0000’\u0000 ~ \uffff(十进制等效值为 0~65535,本质也是数值)Character
boolean1字节(8位)/4字节(32位)falsetrue/falseBoolean

char 数据类型可以储存任何字符。
float、double不能用来表示精确的值,运算不精确——>解决方案:BigDecimal。创建BigDecimal对象的方式:

  • BigDecimal(double val) : double类型的数据作为参数,交给BigDecimal对象【不用,因为double本身不精确】
  • BigDecimal(String val) : String类型的数据作为参数,交给BigDecimal对象【用这个】
    注:double->String 直接拼接一个字符串""就行。

对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中

//long
System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
System.out.println("包装类:java.lang.Long");
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();

//double
System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
System.out.println("包装类:java.lang.Double");
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();

//其他类型方法同上类似

2.3 基本数据类型与引用数据类型区别

  • 存储方式:基本数据类型直接存储值,而引用数据类型存储的是对象的引用(内存地址)
  • 内存分配:基本数据类型在栈上分配内存,引用数据类型在堆上分配内存(具体内容存放在堆中,栈中存放的是其具体内容所在内存的地址)。栈上的分配速度较快,但是内存空间较小,而堆上的分配速度较慢,但可以分配更大的内存空间
  • 默认值:基本数据类型会有默认值,例如int类型的默认值是0,boolean类型的默认值是false。而引用数据类型的默认值是null,表示没有引用指向任何对象
  • 复制操作:基本数据类型进行复制时,会复制该变量的值。而引用数据类型进行复制时,只会复制对象的引用,两个变量指向同一个对象
  • 参数传递:基本数据类型作为方法的参数传递时,传递的是值的副本,不会修改原始值。而引用数据类型作为方法的参数传递时,传递的是对象的引用,可以修改对象的属性或状态
  • 比较操作:基本数据类型使用==进行比较时,比较的是值是否相等。而引用数据类型使用==进行比较时,比较的是引用是否指向同一个对象,如果要比较对象的内容是否相同,需要使用equals()方法

注意:Java中的包装类(Wrapper Classes)对基本数据类型进行了封装,使其也具有了对象的特性,可以调用方法和进行类型转换等操作。

在这里插入图片描述

2.4 基本数据类型与包装类区别

  • 存储方式:基本类型直接存储值,而包装类型存储的是对应基本类型值的对象。
  • 空值处理:基本类型没有空值(null)的概念,而包装类型可以将null作为有效值来表示缺失或无效值。
  • 默认值:基本类型有默认值,例如int类型的默认值是0,boolean类型的默认值是false。而包装类型的默认值是null。
  • 对象操作:基本类型不能直接调用方法,而包装类型可以调用对应的方法,例如Integer类的intValue()方法可以获取保存在Integer对象中的值。
  • 自动装箱/拆箱:基本类型和包装类型之间可以进行自动装箱和拆箱的转换。自动装箱是指将基本类型的值自动转换为对应的包装类型对象,如int 转Integer,Integer integer = 100,底层调用了Interger.valueOf(100)方法;而自动拆箱则是将包装类型对象自动转换为基本类型的值。
  • 泛型支持:泛型只能使用引用类型,不能直接使用基本类型。因此,当需要在泛型中使用基本类型时,需要使用对应的包装类型。
  • 比较方式:基本类型使用==进行比较时,比较的是值是否相等。而包装类型使用==进行比较时,比较的是引用是否指向同一个对象,而不是比较值是否相等。若要比较包装类型的值是否相等,需要使用equals()方法。

注意:在Java 5及其之后的版本中,基本类型和包装类型之间的转换会通过自动装箱、拆箱来自动进行,使得基本类型和包装类型之间的使用更加方便

补充:

  • 包装类Integer的创建方式

    • 1)Integer i1 = new Integer(3); 没有高效的效果,new一次,创建一个包装类对象

    • 2)Integer i2 = Integer.valueOf(3); 有高效的效果,数据在-128~127的范围内,才有高效的效果

    • 3)Integer i3 = 3; 自动装箱:编译器会把int类型5装箱,变成Integer,底层调用Integer.valueOf(5)方法

  • 包装类Double的创建方式

    • 1)Double d1 = new Double(2.7); 没有高效的效果,new一次,创建一个包装类对象

    • 2)Double d2 = Double.valueOf(2.7);这个也没有高效的效果,只有Integer有

  • 自动装箱与自动拆箱

    • Integer aInteger = 100; 自动装箱【编译器会将int类型的100装箱,变成Interger类型,底层调用 Interger.valueOf(100) 方法】

    • int a = aInteger; 自动拆箱【编译器会将包装类型aInteger中的数据取出来,赋值给a,底层调用 aInteger.intValue() 方法】

  • String转Integer、int、Double、double

String str1 = "7";
Integer m = Integer.valueOf(str1);
int n = Integer.parseInt(str1);

String str2 = "5.4";
Double d2 = Double.valueOf(str2);
double d3 = Double.parseDouble(str2);

//输出  7,  7,  5.4,  5.4
System.out.println(m + ",  " + n + ",  " + d2 + ",  " + d3);

3.数据类型转换

Java中的数据转换主要分为两种:自动类型转换(也称为隐式转换)、强制类型转换(也称为显式转换)。

转换从低级到高级:byte、short、char(三者同级)——> int ——> long ——> float ——> double

  • 自动类型转换:代码无需任何处理,在代码编译时 编译器会自动进行处理。特点——低级转换高级
  • 强制类型转换:需要在待转换数据类型前 使用 (type)value, type是要强制类型转换后的数据类型,可能会导致溢出或损失精度 。特点——高级转换低级

数据类型转换必须满足如下规则

    1. 不能对boolean类型进行类型转换。
    1. 不能把对象类型转换成不相关类的对象。
    1. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
    1. 转换过程中可能导致溢出或损失精度,例如:
    int i =128;   
    byte b = (byte)i;
    

    因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。

    1. 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
    (int)23.7 == 23;        
    (int)-45.89f == -45;
    

3.1 具体示例

int 和 long 互转、int和double互转、int和byte互转、int和char互转、int和String互转

public static void main(String[] args) {
    int aInt = 20;
    long bLong = 50L;
    double cDouble = 4.8;

    //低优先级类型数据 + 高优先级类型数据 ——> 结果会自动转换为高优先级数据
    long sum = aInt + bLong;

    //long -> int 需要强制类型转换
    int d = (int) bLong;
    //double -> int 需要强制类型转换
    int e = (int) cDouble;

    System.out.println("自动类型转换 int—>long:  " + sum);
    System.out.println("强制类型转换 long—>int:  " + d);
    System.out.println("强制类型转换 double—>int:  " + e);
    System.out.println();


    //int 和 byte 转换
    byte fByte = (byte) aInt;  //高转低,强转
    int gInt = fByte;          //低转高,自动
    System.out.println("高转低-强转,int->byte:  " + fByte);
    System.out.println("低转高-自动,byte->int:  " + gInt);
    System.out.println();

    //int 和 char 转换
    char hChar = 'a';
    int iInt = hChar;
    char j = (char) iInt;
    System.out.println("低转高-自动,char->int:  " + iInt);
    System.out.println("高转低-强转,int->char:  " + j);
    System.out.println();

    //int 和 String 转换
    //int转String: 1)使用String的ValueOf方法   2)直接使用 String类+ (即字符串拼接),任意字符串和其他类型"+" 都会把其他类型转为字符串
    String str1 = String.valueOf(aInt);
    String str2 = "" + aInt;
    System.out.println("int转String: " + str1 + ",  " + str2);
    //String转int:调用包装类的Integer.parseInt方法,当字符串中包含非数字时会出错
    String str3 = "18";
    int k = Integer.parseInt(str3);
    System.out.println("String转int: " + k);
    System.out.println();

    //byte 和 char 互转
    byte m = (byte) hChar;
    char n = (char) m;
    System.out.println("char->byte,强转:  " + m);
    System.out.println("byte->char,强转:  " + n);
}

输出:

自动类型转换 int—>long:  70
强制类型转换 long—>int:  50
强制类型转换 double—>int:  4

高转低-强转,int->byte:  20
低转高-自动,byte->int:  20

低转高-自动,char->int:  97
高转低-强转,int->char:  a

int转String: 20,  20
String转int: 18

char->byte,强转:  97
byte->char,强转:  a

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

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

相关文章

Java中常见延时队列的实现方案总结

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

爬虫的一些小技巧总结

一、在爬虫中,爬取的数据类型如下 1.document:返回的是一个HTML文档 2.png:无损的图片,jpg:压缩后的图片,wbep:有损压缩,比png差,比jpg好 3.avgxml图像编码字符串 4.script:脚本文件,依据一定格式编写的可执行的文…

高性能MySQL 第4版

第一章MySQL架构 MySQL提供了多种锁的颗粒度,每种MySQL存储引擎都可以实现自己的锁策略和锁力度。 行级锁是在存储引擎而不是在服务器中实现的。 隔离界别 READ UNCOMMITTED - 脏读 在事务中可以可以查看到其他事务中还没有提交的修改。实际中很少用。 READ C…

(C语言)qsort函数模拟实现

前言 我们需先了解qsort函数 qsort函数详解:http://t.csdnimg.cn/rTNv9 qsort函数可以排序多种数据类型,很是神奇,这是为什么,我们在里模拟实现这样的功能 目录 1. qsort函数模拟实现 2. 我们使用bubble_sort函数排序整形数…

微星H510M PLUS V3主板安装纯Ubuntu系统安装或启动界面黑屏问题

Ubuntu系统安装或启动界面黑屏问题 1 前言2 原因分析3 解决方法3.1 安装界面黑屏3.2 启动界面黑屏3.3 安装显卡驱动 1 前言 我自己组装了一台台式机,配置如下: 主板:微星H510M PLUS V3显卡:英伟达RTX 2060内存:金百达…

文件的顺序读写函数举例介绍

目录 例1:(使用字符输出函数fputc)例2:(使用字符输入函数fgetc)例3:(使用文本行输出函数fputs )例4:(使用文本行输入函数fgets )例5&a…

微信小程序屏蔽控制台黄色提示信息

我们很多时候 一个小程序 啥都没有 终端就一直报一些黄色的警告 可以打开项目的 project.config.json 找一下setting 下面有没有 checkSiteMap 字段 如果没有加一个 如果有 直接将值改为 false 这样 再运行 就不会有这个黄色的提示信息了

牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是 1.p s; 2.p k; 3.p s[0]; 4.k s; 答案:124 char s[3][10] s 是数组指针,类型为char (*)[3],所指向的每个数组长度为10; char (*k)[3] k是一个数组指针&a…

Windows下用crashRpt让C++程序崩溃自动生成dump

背景 我们的Windows c程序如果在客户或者没有代码调试的环境下崩溃了。我们只能从机器异常报错里得知寥寥无几的信息,如果程序崩溃时,能自动触发当前堆栈信息的收集,那么对于开发人员复现BUG就尤为重要 CrashRpt CrashRpt主要功能 1.崩溃报…

【Java基础系列】时间戳

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

政安晨【示例演绎虚拟世界开发】(五):从制作一个对战小游戏开始(Cocos Creator 《击败老大》)(第二段)

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: AI虚拟世界大讲堂 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 现在我们已经学会了如何向场景中添加图片,接下来继…

Django路由层(反向解析、路由分发、命名空间、路径转换)

Django路由层(反向解析、路由分发、命名空间、路径转换) 目录 Django路由层(反向解析、路由分发、命名空间、路径转换)路由配置反向解析前端用法后端用法 反向解析的本质路由分发用法示例 分发时遇到的问题解决方案1解决方案2 命名…

过于老旧的pytorch_ssim包 请从github下载源码

有些冷门算法真的不要随便pip,有可能下载到史前版本…最好还是找源代码 汗 今天要用到SSIM损失函数,从网上简单看了一下原理就想测试一下,偷了一下懒就直接在命令行输入pip install pytorch_ssim了,结果报了一堆错误(汗…

vue3编写H5适配横竖屏

具体思路如下&#xff1a; 1、监听浏览器屏幕变化&#xff0c;通过监听屏幕宽高&#xff0c;辨别出是横屏&#xff0c;还是竖屏状态 在项目的起始根页面进行监听&#xff0c;我就是在App.vue文件下进行监听 代码如下&#xff1a; <template><RouterView /> <…

【MySQL】:约束全解析

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 约束概述二. 约束演示三. 外键约束3.1 介绍3.2 语法3.3 删除/更新行为 &…

Ribbon负载均衡(黑马学习笔记)

上Eureka一节中&#xff0c;我们添加了LoadBalanced注解&#xff0c;即可实现负载均衡功能&#xff0c;这是什么原理呢&#xff1f; 负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://users…

文献阅读:The Unreasonable Effectiveness of Easy Training Data for Hard Tasks

文献阅读&#xff1a;The Unreasonable Effectiveness of Easy Training Data for Hard Tasks 1. 文章简介2. 方法介绍 1. 数据集难易度分析2. 模型训练前后变化 3. 实验考察 & 结论 1. 实验设计 1. 使用数据集2. 使用模型 2. 实验结果 1. 数据集难度分析2. 在Easy数据集下…

迭代器模式:分离遍历逻辑与数据结构,实现统一访问接口与灵活扩展

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、优缺点分析总结&#xff1a; 一、引言 ​ 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种方法顺序访问聚合对象的元素&#xff0c;而又不暴露其底层表示。迭…

SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)

目录 一.背景1.1 业务背景1.2 技术负债 二.技术目标三.方案设计3.1 解决移动端频繁发版3.1.1 场景分析3.1.2 技术方案 3.2 减少后端坏味道代码&无法灵活扩展问题3.2.1 通过抽象接口完成各自单独楼层渲染逻辑3.2.2 通过配置能力做到部分字段可配 四.升级上线(普适于高并发大…

NoSQL--2.MongoDB配置

目录 2.MongdoDB配置 2.1 Windows环境下操作 2.1.1 注册MongDB Atlas&#xff1a; 2.1.2 MongoDB Community Server Download&#xff1a; 2.1.3 启动MondgoDB服务&#xff1a; 2.1.3.1 命令行参数的方式启动MongoDB服务&#xff1a; 2.1.3.2 使用配置文件方式启动Mongo…