JAVA中常用类型

news2025/4/21 10:09:31

一、包装类

1.1 包装类简介

java是面向对象的语言,但是八大基本数据类型不符合面向对象的特征。因此为了弥补这种缺点,为这八中基本数据类型专门设计了八中符合面向面向对象的特征的类型,这八种具有面向对象特征的类型,就叫做包装类,英文:wrapper class。

所有的基本数据类型和包装类型的对比如下图:

1.2 装箱和拆箱

  • 装箱boxing : 由基本数据类型转型为包装类型。

    • 调用包装类的构造器,进行装箱

    • 调用valueOf()静态方法,进行装箱

  • 拆箱 unboxing: 由包装类型转型为基本数据类型。

    • 调用xxxValue()非静态方法,进行拆箱

public class Demo01 {
    public static void main(String[] args) {
        int age = 10;
        Integer a1 = new Integer(age);//用第一种方式进行装箱操作,由值转为了对象
        Integer a2 = Integer.valueOf(100);//用第二种方式进项装箱操作
        int s = a1.intValue();//拆箱操作,由对象转为了值
        int s1=a2.intValue();
        System.out.println(a1);
        System.out.println(a2);
        System.out.println(s+1);//打印结果是11,证明已经变回了值
        System.out.println(s1+1);//打印结果是101,证明已经变回了值
    }
}

 

1.3 自动装箱和拆箱

为了方便获取包装类对象,从jdk1.5以后,提供了一个自动装箱的操作,也提供了一个包装类到基本数据类的自动拆箱操作。

自动装箱 : 直接使用一个基本数据类型的变量或字面值给一个包装类型的引用进行赋值即可;  省略掉的是  valueOf 方法
自动拆箱 : 直接使用一个包装类型的引用给一个基本数据类型的变量进行赋值即可;省略掉的是  xxValue 方法

Integer b=66;//实际上,底层直接帮我们调用了工具方法valueof()方法进行装箱
Short b1=new Short("20");
short b2=b1;//底层自动调用Shortvalue()自动拆箱

1.4 包装类的常量池

对于装箱操作后的包装类的对象,jvm在堆中,维护了一个常量池,该常量池适用于调用了valueOf()方法产生的包装类对象,以及自动装箱的包装类对象。不适用于new关键字创建的包装类对象。

Byte, Short, Integer, Long :创建了数值范围为[-127,128]的相应类型的缓存数据

Character :创建了数值在 [0, 127] 范围的缓存数据

Boolean 直接返回 true 或 false

两种浮点数类型的包装类 Float, Double 并没有实现常量池技术。

Integer b3=new Integer(11);
Integer b4=Integer.valueOf(11);
System.out.println(b3==b4);

证明b3和b4不是同一个对象,一个在包装常量池,一个在堆中

 double d1 = 3.14;
 Double d2 = Double.valueOf(d1);
 Double d3 = Double.valueOf(d1);
 System.out.println(d2==d3); 

如何有常量池,那么d2和d3应该指向同一个地址,结果是true,但结果是false,证明没有常量池

1.5 包装类其他常用方法

工具方法:

static WrapperClassName valueOf(xxx value)

static WrapperClassName valueOf(String value)

static xxx parseXXX(String value)

static String toBinaryString();  转成二进制

static String toHexString();    转成16进制

 static String toOctalString()   转成8进制

String line="123456";
int i=Integer.parseInt(line);
System.out.println(i+1);//结果为123457,证明把字符串line转成了int类型的数字
int num = 1001;
System.out.println(Integer.toBinaryString(num)); //1111101001
System.out.println(Integer.toOctalString(num));  //  1751
System.out.println(Integer.toHexString(num));    //    3e9

二、BigDecimal

提供该类的意图:就是为了更精确的运算。(double和float在运算时,有精度损失,科研中一般不用)

1.1 常用构造器

BigDecimal(String s):  推荐使用

BigDecimal(int v):

BigDecimal(long v):

BigDecimal(double v):

1.2 常用方法

BigDecimal add(BigDecimal other);

BigDecimal subtract(BigDecimal other);

BigDecimal multiply(BigDecimal other);

BigDecimal divide(BigDecimal other):  做除法时要注意,除数不能是0, 还有不能出现除不尽的情况,不然都会报异常。

public class Demo02 {
    public static void main(String[] args) {
        BigDecimal m =new BigDecimal("10");
        BigDecimal n =new BigDecimal("20");
        BigDecimal sum=m.add(n);
        System.out.println(sum);//调用了重写的toString,返回字符串样子。
        BigDecimal c=n.subtract(m);
        System.out.println(c);
        BigDecimal c1=n.multiply(m);
        System.out.println(c1);
        BigDecimal c2=n.divide(m);
        System.out.println(c2);
    }
}

1.3 常用的舍入模式

BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式     

setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
setScaler(1,BigDecimal.ROUND_CEILING)接近正无穷大的舍入
setScaler(1,BigDecimal.ROUND_FLOOR)接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样
setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

1、ROUND_UP,向远离0的方向舍入,在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。
eg: 保留1位小数 1.60->1.6 1.61->1.7 1.66->1.7 , -1.62->-1.7

2、ROUND_DOWN,向接近0的方向舍入,在丢弃某部分之前,始终不增加数据(即,截断),该方式是只减不加。
eg: 保留1位小数 1.60->1.6 1.61->1.6 1.66->1.6 , -1.62->-1.6

3、ROUND_CEILING,向正无穷方向舍入,如果数值为正,舍入方式与ROUND_UP一致,如果为负,舍入方式与ROUND_DOWN一致,该模式始终不会减少计算数值。
eg: 保留1位小数 1.60->1.6 1.61->1.7 1.66->1.7 , -1.62->-1.6

4、ROUND_FLOOR,向负无穷方向舍入,如果数值为正,舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。该模式始终不会增加计算数值。
eg: 保留1位小数 1.60->1.6 1.61->1.6 1.66->1.6 , -1.62->-1.7

5、ROUND_HALF_UP,向“最接近的”数字舍入,也就是四舍五入。
eg: 保留1位小数 1.61->1.6 1.65->1.7 1.66->1.7 , -1.62->-1.6

6、ROUND_HALF_DOWN,向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式,也就是五舍六入。
eg: 保留1位小数 1.61->1.6 1.65->1.6 1.66->1.7 , -1.62->-1.6

7、ROUND_HALF_EVEN,向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

eg. 1.15->1.2, 1.25->1.2

8、ROUND_UNNECESSARY,计算结果是精确的,不需要舍入模式。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

1.4  BigDecimal常见问题

1、创建 BigDecimal精度丢失

在BigDecimal 中提供了多种创建方式,可以通过new 直接创建,也可以通过 BigDecimal.valueOf 创建。这两种方式使用不当,也会导致精度问题。

public static void main(String[] args) throws Exception {
   BigDecimal b1= new BigDecimal(0.1);
   System.out.println(b1);
   BigDecimal b2= BigDecimal.valueOf(0.1);
   System.out.println(b2);
   BigDecimal b3= BigDecimal.valueOf(0.111111111111111111111111111234);
   System.out.println(b3);

}

 上面示例中两个方法都传入了double类型的参数0.1但是 b1 还是出现了精度的问题。造成这种问题的原因是 0.1 这个数字计算机是无法精确表示的,送给 BigDecimal 的时候就已经丢精度了。

结论:

第一,在使用BigDecimal构造函数时,尽量传递字符串而非浮点类型;

第二,如果无法满足第一条,则可采用BigDecimal.valueOf方法来构造初始化值。但是valueOf受double类型精度影响,当传入参数小数点后的位数超过double允许的16位精度还是可能会出现问题的

2、等值比较的坑

一般在比较两个值是否相等时,都是用equals 方法,但是,在BigDecimal 中使用equals可能会导致结果错误,BigDecimal 中提供了 compareTo 方法,在很多时候需要使用compareTo 比较两个值。

public static void main(String[] args){
    BigDecimal b1 = new BigDecimal("1.0");
    BigDecimal b2 = new BigDecimal("1.00");
    System.out.println(b1.equals(b2));
    System.out.println(b1.compareTo(b2));
}

 出现此种结果的原因是,equals不仅比较了值是否相等,还比较了精度是否相同。示例中,由于两个值的精度不同,所有结果也就不相同。而 compareTo 是只比较值的大小。返回的值为-1(小于),0(等于),1(大于)。

3、无限精度的坑

BigDecimal 并不代表无限精度,当在两个数除不尽的时候,就会出现无限精度的坑,此种情况,只需要在使用 divide方法时指定结果的精度即可:

BigDecimal b3 = new BigDecimal("1");
BigDecimal b4 = new BigDecimal("3");
System.out.println(b3.divide(b4,2, RoundingMode.HALF_UP));//结果为0.33

 在使用BigDecimal进行(所有)运算时,尽量指定精度和舍入模式。

三、Date日期类型

3.1 简介

1、是一个用来表示时间、日期的类,这个类在 java.util 包中,在使用 Date的时候,一定要注意 : 在 java.sql 包中,也有一个Date,千万不要导错包了。

2、 Date对象,用来表示一个时间点。是距离纪元时间点的总毫秒数。

3、纪元时间点:  1970年1月1日00:00:00(本初子午线处的时间点)

3.2 常用API

1)构造器

  • Date() :获取当前系统时间

  • Date(long time):设置一个距离固定点的指定毫秒数的时间点。

2)方法

  • long getTime()

  • void setTime(long time)

  • String toString() 格式: Thu May 24 19:32:14 CST 2018

Date now = new Date();
System.out.println(now);
Date d = new Date(24*60*60*1000*2);//使用有参构造器,来获取距离纪元的2天后的时间
System.out.println(d);

四、SimpleDateFormat类型

4.1 简介

java.text.SimpleDateFormat是一个用来格式化和解析日期的具体类,它允许进行格式化(日期 ->文本)、解析(文本 -> 日期)和规范化

  • 将一个Date对象转成一个指定格式的字符串

  • 将一个自定格式的字符串转成一个Date对象

4.2 常用构造器和方法

1)构造器

- SimpleDateFormat()

- SimpleDateFormat(String pattern):指定一个日期格式符号来构造对象

2)方法

- final String format(Date date) Date

- Date parse(String source) throws ParseException String

3)日期模式匹配字符

字符含义案例
yyyyy年—2018年;yy-18年
MMM月—05月;M月—5月
ddd日—06日;d日—6日
E星期E-星期日(Sun)
a上下午(AM、PM)a—下午(PM)
H24小时制a h时--------下午 10时HH:mm:ss------12:21:34hh(a):mm:ss------12(PM):21:34
h12小时制
m分钟
s
public class Date01 {
    public static void main(String[] args) throws ParseException {
        Date now = new Date();
        System.out.println(now);
        Date d = new Date(24*60*60*1000*2);//使用有参构造器,来获取距离纪元的2天后的时间
        System.out.println(d);
        //进行格式化
        SimpleDateFormat a =new SimpleDateFormat("yyyy.MM.dd HH.mm.ss");
        String str=a.format(now);
        System.out.println(str);
        String s1="2002年11月09日";
        //字符串转日期时,SimpleDateFormat里的格式按照字符串来写
        SimpleDateFormat date=new SimpleDateFormat("yyyy年MM月dd日");
        Date date1=date.parse(s1);
        System.out.println(date1);
    }

 

五、Calendar类型

5.1 简介

1、日历类型,位于java.util包下,封装了日历信息,包括年月日时分秒这些时间分量。

2、Calendar是抽象类,有很多子类型,比如格力高日历类型。该格力高日历类型正是大多数国家通用的日历类型,即阳历。

3、 程序员不需要直接调用子类型的构造器来获取日历对象,Calendar类型里封装了一个工具方法getInstance(),来获取该地区的子类型对象。

5.2 常用方法

1)getInstance方法

Calendar提供了一个类方法getInstance,以获取此类型的一个通用的对象
此方法返回一个Calendar对象,其日历字段已经由当前日期和时间初始化

2)getActualMaximum方法

作用:指定一个时间常量,返回指定日历分量可能拥有的最大值

Date getTime();

get(int Field)

5.3 时间常量

Calendar.YEAR:   年

Calendar.MONTH:  月    注意 该值的范围是0~11,分别表示1月~12月。 因此表示月份时,要+1操作。

Calendar.DAY_OF_MONTH   日

Calendar.DATE           日

Calendar.HOUR_OF_DAY   24小时制的时

Calendar.HOUR         12小时制的时

Calendar.MINUTE      分钟

Calendar.SECOND      秒钟

Calendar.DAY_OF_WEEK:   星期几     范围1~7,  1表示周日, 7表示周六,  显示时要-1操作

Calendar.DAY_OF_YEAR:   一年中的第几天。

public class Calendar01 {
    public static void main(String[] args) {
        //想要获取一个日历对象
        Calendar cal = Calendar.getInstance();
        System.out.println(cal);
        Date time = cal.getTime();
        System.out.println(time);
        System.out.println("------------设置时间分量------------------");
        // 修改成北京奥运时间: 2008-8-8日 20:08:00
        cal.set(Calendar.YEAR,2008);
        System.out.println(cal.getTime());
        cal.set(Calendar.MONTH,8-1);
        cal.set(Calendar.DAY_OF_MONTH,8);
        cal.set(Calendar.HOUR_OF_DAY,20);
        cal.set(Calendar.MINUTE,8);
        System.out.println(cal.getTime());
    }
}

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

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

相关文章

使用 GPTQ 进行 4 位 LLM 量化

权重量化方面的最新进展使我们能够在消费级硬件上运行大量大型语言模型&#xff0c;例如 RTX 3090 GPU 上的 LLaMA-30B 模型。这要归功于性能下降最小的新型 4 位量化技术&#xff0c;例如GPTQ、GGML和NF4。 在本文中&#xff0c;我们将探索流行的 GPTQ 算法&#xff0c;以了解…

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

【黑马点评优化】2-Canel实现多级缓存&#xff08;RedisCaffeine&#xff09;同步 0 背景1 配置MySQL1.1 开启MySQL的binlog功能1.1.1 找到mysql配置文件my.ini的位置1.1.2 开启binlog 1.2 创建canal用户 2 下载配置canal2.1 canal 1.1.5下载2.2 配置canal2.3 启动canal2.4 测试…

CPP集群聊天服务器开发实践(五):nginx负载均衡配置

1 负载均衡器的原理与功能 单台Chatserver可以容纳大约两万台客户端同时在线聊天&#xff0c;为了提升并发量最直观的办法需要水平扩展服务器的数量&#xff0c;三台服务器可以容纳六万左右的客户端。 负载均衡器的作用&#xff1a; 把client的请求按照负载均衡算法分发到具体…

百问网(100ask)的IMX6ULL开发板的以太网控制器(MAC)与物理层(PHY)芯片(LAN8720A)连接的原理图分析(包含各引脚说明以及工作原理)

前言 本博文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 。 本博文和博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 的目录是找出百问网(100ask)的IMX6ULL开发板与NXP官方提供的公板MCIMX6ULL-EVK(imx6ull14x14evk)在以太网硬件…

组件库地址

react&#xff1a; https://react-vant.3lang.dev/components/dialoghttps://react-vant.3lang.dev/components/dialog vue用v2的 Vant 2 - Mobile UI Components built on Vue

2025.2.16机器学习笔记:TimeGan文献阅读

2025.2.9周报 一、文献阅读题目信息摘要Abstract创新点网络架构一、嵌入函数二、恢复函数三、序列生成器四、序列判别器损失函数 实验结论后续展望 一、文献阅读 题目信息 题目&#xff1a; Time-series Generative Adversarial Networks会议&#xff1a; Neural Information…

最新智能优化算法: 中华穿山甲优化( Chinese Pangolin Optimizer ,CPO)算法求解23个经典函数测试集,MATLAB代码

中华穿山甲优化&#xff08; Chinese Pangolin Optimizer &#xff0c;CPO&#xff09;算法由GUO Zhiqing 等人提出&#xff0c;该算法的灵感来自中华穿山甲独特的狩猎行为&#xff0c;包括引诱和捕食行为。 算法流程如下&#xff1a; 1. 开始 设置算法参数和最大迭代次数&a…

使用 DeepSeek + 语音转文字工具 实现会议整理

目录 简述 1. DeepSeek与常用的语音转文字工具 1.1 DeepSeek 1.2 讯飞听见 1.3 飞书妙记 1.4 剪映电脑版 1.5 Buzz 2. 安装Buzz 3. 使用DeepSeek Buzz提取并整理语音文字 3.1 使用 Buzz 完成语音转文字工作 3.2 使用 DeepSeek 进行文本处理工作 3.3 整理成思维导图…

【OS安装与使用】part4-ubuntu22.04安装anaconda

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 官网下载Anaconda&#xff08;1&#xff09;确认自己的系统型号与硬件架构&#xff08;2&#xff09;官网下载对应版本 2.2.2 安装Anaconda&#xff08;1&#xff09;基于shell脚本…

Spring IoC DI:控制反转与依赖注入

目录 前言 - Spring MVC 与 Spring IoC 之间的关系 1. IoC 1.1 Spring Framework, Spring MVC, Spring boot 之间的联系[面试题] 1.2 什么是容器 1.3 什么是 IoC 2. DI 2.1 什么是 DI 3. Spring IoC & DI 3.1 Component 3.2 Autowired 4. IoC 详解 4.1 Applica…

数字化转型4化:标准化奠基-信息化加速-数字化赋能-智能化引领

​随着经济增速的放缓&#xff0c;大国体系所催生的生产力逐渐释放&#xff0c;后续业务的发展愈发需要精耕细作&#xff0c;精益理念也必须深入企业的骨髓。与此同时&#xff0c;在全球经济一体化的大背景下&#xff0c;企业面临着来自国内外同行&#xff0c;甚至是跨行业的激…

简单易懂,解析Go语言中的Channel管道

Channel 管道 1 初始化 可用var声明nil管道&#xff1b;用make初始化管道&#xff1b; len()&#xff1a; 缓冲区中元素个数&#xff0c; cap()&#xff1a; 缓冲区大小 //变量声明 var a chan int //使用make初始化 b : make(chan int) //不带缓冲区 c : make(chan stri…

C++基础知识学习记录—模版和泛型编程

1、模板 概念&#xff1a; 模板可以让类或者函数支持一种通用类型&#xff0c;在编写时不指定固定的类型&#xff0c;在运行时才决定是什么类型&#xff0c;理论上讲可以支持任何类型&#xff0c;提高了代码的重用性。 模板可以让程序员专注于内部算法而忽略具体类型&#x…

已解决IDEA无法输入中文问题(亲测有效)

前言 在使用IDEA的时候&#xff0c;比如我们想写个注释&#xff0c;可能不经意间&#xff0c;输入法就无法输入中文了&#xff0c;但是在其他地方打字&#xff0c;输入法仍然能够正常工作。这是什么原因呢&#xff0c;这篇文章带你解决这个问题&#xff01; 快捷键 如果你的I…

人工智能之目标追踪DeepSort源码解读(yolov5目标检测,代价矩阵,余弦相似度,马氏距离,匹配与预测更新)

要想做好目标追踪,须做好目标检测,所以这里就是基于yolov5检测基础上进行DeepSort,叫它为Yolov5_DeepSort。整体思路是先检测再追踪,基于检测结果进行预测与匹配。 一.参数与演示 这里用到的是coco预训练人的数据集&#xff1a; 二.针对检测结果初始化track 对每一帧数据都输出…

Copilot基于企业PPT模板生成演示文稿

关于copilot创建PPT&#xff0c;咱们写过较多文章了&#xff1a; Copilot for PowerPoint通过文件创建PPT Copilot如何将word文稿一键转为PPT Copilot一键将PDF转为PPT&#xff0c;治好了我的精神内耗 测评Copilot和ChatGPT-4o从PDF创建PPT功能 Copilot for PPT全新功能&a…

MySQL 主从复制原理及其工作过程

一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器&#xff08;主服务器&#xff0c;Master&#xff09;复制到一个或多个 MySQL 数据库服务器&#xff08;从服务器&#xff0c;Slave&#xff09;的技术。以下简述其原理&#xff0c;主要包含三个核…

MySQL远程连接配置

一、配置TCP服务地址绑定 配置文件路径 /etc/mysql/mysql.cnf /etc/mysql/mysql.conf.d/mysqld.cnf具体文件可以通过 mysql --help查看 配置项 # 只接受本地连接 bind-address 127.0.0.1 mysqlx-bind-address 127.0.0.1改为 # 接受任意IP地址连接 bind-address …

iOS开发书籍推荐 - 《高性能 iOS应用开发》(附带链接)

引言 在 iOS 开发的过程中&#xff0c;随着应用功能的增加和用户需求的提升&#xff0c;性能优化成为了不可忽视的一环。尤其是面对复杂的界面、庞大的数据处理以及不断增加的后台操作&#xff0c;如何确保应用的流畅性和响应速度&#xff0c;成为开发者的一大挑战。《高性能 …

leetcode1047-删除字符串中的所有相邻重复项

leetcode 1047 思路 因为要删除字符串中的所有相邻重复项&#xff0c;那么在删除完成后&#xff0c;最后返回的元素中是不应该存在任何相邻重复项的&#xff0c;如果是普通的遍历&#xff0c;假设str ‘abbaca’&#xff0c;遍历出来只发现中间的bb是相邻重复的删除了以后a…