Java基础总结(二)

news2024/12/30 3:04:10

文章目录

  • 一、Object
    • Object中的成员方法(11个)
      • toString
      • equals
      • clone
  • 二、Objects
  • 三、BigInteger和BigDecima
    • BigInteger
    • BigDecima
  • 四、正则表达式
  • 五、Date
    • JDK7前时间相关类
      • SimpleDateFormat类
      • Calendar类
    • JDK8新增时间相关类
  • 六、包装类


一、Object

没有一个属性是所有类的共性,因此Object类中没有一个成员变量,也就没有带参的构造方法,只有一个空参构造方法.

Object中的成员方法(11个)

在这里插入图片描述

toString

一般会重写,打印对象时打印属性
在这里插入图片描述
默认情况下,Object类中的toString方法返回的是地址值,所以默认情况下,打印一个对象打印的就是地址值。如果想看到对象内部的属性值,该怎么办?
处理方案:重写父类Object中的toString方法,把对象的属性进行拼接

equals

在这里插入图片描述
真正想要比的是对象中的属性值,父类中的方法不能满足当前需求,重写方法
一开始判断当前的调用者this和当前参数中的是不是同一个对象,如果地址值一样,直接return true
否则比较类型是否相等,进行强转,再比较对象内部的属性值

在这里插入图片描述

例子:
在这里插入图片描述
两个结果都是false;
因为第一个equals方法是String调用的,所以equals要看String类中的

String 类中重写的equals方法:
字符串中的equals方法,先判断参数是否为字符串,如果是字符串,再比较其内部的属性,但是如果不是字符串,直接返回false
在这里插入图片描述

第二个equals方法是StringBuilder调用的,所以equals要看StringBuilder类中的
StringBuilder类中没有equals方法,看其父类AbstractStringBuilder中也没有equals方法,所以默认继承Object中的equals方法,再Object当中默认是使用==号比较两个对象的地址值

clone

把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制
在这里插入图片描述
protected只能被本包或者其他包下的子类访问,重写clone方法

在这里插入图片描述
并且需要实现Cloneable接口
在这里插入图片描述
该接口中没有任何的抽象方法
如果一个接口中没有抽象方法,表示当前的接口是一个标记性接口,现在Cloneable一旦实现了,那么当前类的对象就可被克隆,如果没有实现,当前类的对象就不能克隆

实现细节:

方法在底层会帮我们创建一个对象,并把元对象中的数据拷贝过去
1、重写Object类中的clone方法
2、让JavaBean类实现Cloneable接口
3、创建元对象并调用clone就可以了

深克隆:基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的
浅克隆:不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来

Object中的克隆是浅克隆
可以重写方法或者利用第三方工具Gson完成深克隆

Gson gson = new Gson();
//把对象转化为json对象
String s = gson.toJson(u1);
//再把字符串变回对象就可以了
User user = gsin.fromJson(s,User.class);

二、Objects

Objects是一个工具类,提供了一些方法去完成一些功能
在这里插入图片描述

Objects的equals方法实现细节:

在这里插入图片描述

1、方法的底层会判断参数是否为null,如果为null,直接返回false
2、如果不为null,那么就再次调用equals方法
3、如果此时s是重写过equals方法的JavaBean类型,所以最后还是会调用重写之后的equals方法
如果没有重写,比较的就是地址值,重写了就比较属性值

三、BigInteger和BigDecima

BigInteger

BigInteger的构造方法
在这里插入图片描述
BigInteger中的静态方法 BigInteger bd1 = BigInteger.valueOf(100);BigInteger db2 = new BigInteger("100");
区别:

1、BigInteger.valueOf(100) 能表示的范围比较小,只能在long的取值范围之内,如果超出long的范围就不行了
2、在内部对常用的数字:-16~16进行了优化,提前把 -16~16 先创建好BigInteger的对象,如果多次获取不会重新创建新的

在这里插入图片描述
底层源码:
在这里插入图片描述
存放 -16 – -1 和1 --16的两个数组以及单独数字0
在这里插入图片描述

在这里插入图片描述

BigInteger的构造方法小结

  • 如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取
  • 如果BigInteger表示的数字超出long的范围,可以用构造方法获取
  • 对象一旦创建,BigInteger内部记录的值不能发生改变
  • 只要进行计算都会产生一个新的BigInteger对象

BigInteger的成员方法
在这里插入图片描述

BigDecima

可以表示较大的小数和解决小数运算精度失真问题
在这里插入图片描述
运行结果:
在这里插入图片描述
计算机中的小数:浮点数运算的时候会有精度丢失的风险这个和计算机保存浮点数的机制有很大关系。计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。

在这里插入图片描述

在这里插入图片描述
BigDecimal 可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过 BigDecimal 来做的。

1、通过传递double类型的小数来创建对象

BigDecimal bd1 = new BigDecimal(0.01); 
BigDecimal bd2 = new BigDecimal(0.09);
System.out.println(bd1);
System.out.println(bd2);

在这里插入图片描述

这种方式有可能是不精确的,所以不建议使用

2、通过传递字符串表示的小数来创建对象

BigDecimal bd1 = new BigDecimal("0.01"); 
BigDecimal bd2 = new BigDecimal("0.09");
System.out.println(bd1);
System.out.println(bd2);

在这里插入图片描述
这种方法可以获取到精确的小数

3、通过静态方法获取对象

BigDecimal bd3 = BigDecimal.valueOf(10);
System.out.println(bd3);

底层源码:
在这里插入图片描述

第二种和第三种方式的细节:
1、如果要表示的数字不大,没有超出double的取值范围,建议使用静态方法
2、如果要表示的数字比较大,超出了double的取值范围,建议使用构造方法
3、静态方法中,如果我们传递的是0-10之间的整数,包含10 包含0,那么方法会返回已经创建好的对象,不会重新new。

BigDecimal的成员方法
在这里插入图片描述

四、正则表达式

作用:
1、校验字符串是否满足规则
2、在一段文本中查找满足要求的内容

在这里插入图片描述
在这里插入图片描述
通过正则表达式进行文本爬虫:

//1、获取正则表达式的对象
Pattern p = Pattern.compile("Java\\d{0,2}");
//2、获取文本匹配器对象
//拿着m去读取str 找符合p规则的子串
Matcher m = p.matcher(str);
//3、利用循环获取
while(m.find()){
	String s = m.group();
	System.out.println(s);
}

五、Date

世界标准时间:格林威治时间,简称GMT
目前时间标准时间已经替换为:原子钟

Date类是一个JDK写好的JavaBean类,用来描述时间,精确到毫秒
利用空参构造创建的对象,默认表示系统当前时间
利用有参构造创建的对象,表示指定的时间

JDK7前时间相关类

SimpleDateFormat类

格式化:把时间变成我们喜欢的格式
解析:把字符串表示的时间变成Date对象
构造方法
在这里插入图片描述
成员方法
在这里插入图片描述


//利用空参构造创建SimpleDateFormat对象 默认格式
SimpleDateFormat sdf = new SimpleDateFormat();
Date d = new Date();
sdf.format(d);
//利用带参构造创建SimpleDateFormat对象 指定格式
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = new Date();
sdf1.format(d1);

Calendar类

Calendar代表了系统当前时间的日历对象,可以单独修改,获取时间中的年、月、日
Calendar是一个抽象类,不能直接创建对象,通过getInstance方法获取对象

//1、获取日历对象 通过一个静态方法获取到子类对象
//细节1:Calendar是一个抽象类,不能直接new
//底层原理:会根据系统的不同时区来获取不同的日历对象,默认表示当前时间,
//会把时间中的纪元,年,月,日,时,分,秒,星期,等放在一个数组当中
// 0:纪元 1:年  2:月  3:一年中的第几周 4:一个月中的第几周 5:一个月中的第几天
//细节2:
//月份:范围0~11 如果获取出来的是0 那么实际上是1月
//星期:在外国人眼里,星期日是一周中的第一天
//1(星期日) 2(星期一) 3(星期二)……
Calendar c = Calendar.getInstance();
//2、修改日历代表的时间
Date d = new Date();
c.setTime(d);
//获取日期中的某个字段信息
//java在Calendar中 ,把索引对应的数字都定义成常量
int year = c.get(1);
int year1 = c.get(Calendar.YEAR);
int month = c.get(2)+1;
int month1 = c.get(Calendar.MONTH)+1;
int day= c.get(5);
int day1 = c.get(Calendar.DAY_OF_MONTH);
int week = c.get(Calendar.DAY_OF_WEEK);
c.set(Calendar.YEAR,2000);
c.set(Calendar.MONTH,11);//实际上是12月

//调用方法在这个基础上增加一个月
c.add(Calendar.MONTH,1);
//调用方法在这个基础上减一个月
c.add(Calendar.MONTH,-1);

总结:
1、如何获取对象?
通过getInstance方法来获取对象
2、常见方法:
setXxx:修改
getXxx:获取
add:在原有的基础上进行增加或减少
3、细节点:
日历类中的月份范围:0~11
日历类中星期的特点:星期日是一周中的第一天

JDK8新增时间相关类

在这里插入图片描述

在这里插入图片描述

//1、获取所有的时区名称
Set<String> zoneIds =  ZoneId.getAvailableZoneIds();
//2、获取当前系统的默认时区
ZoneId zoneId = ZoneId.systemDefault();
//3、获取指定时区
ZoneId zoneId1 = ZoneId.of("Asia/Pontianak");

Instant时间戳常用的方法
在这里插入图片描述

ZoneDateTime时间戳常用的方法

在这里插入图片描述

DateTimeFormatter 用于时间的格式化和解析
在这里插入图片描述

LocalDate、LocalTime、LocalDateTime
在这里插入图片描述
工具类
在这里插入图片描述

例题1:
用JDK7和JDK8计算当前活了多少天
JDK7

//JDK7:
//规则:只要对时间进行计算或者判断,都需要先获取当前时间的毫秒值
//1、计算出生年月日的毫秒值
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String birth = "1999-10-04";
        long birthTime = sdf.parse(birth).getTime();
//2、获取当前时间的毫秒值
		Date today = new Date();
        long todayTime = today.getTime();
//3、计算间隔
		long day = (todayTime-birthTime)/1000/60/60/24;
		System.out.println(day);
	}

在这里插入图片描述
JDK8

    public static void main(String[] args) throws ParseException {
        LocalDate birth = LocalDate.of(1999,10,4);
        LocalDate today = LocalDate.now();
        long days = ChronoUnit.DAYS.between(birth, today);
        System.out.println(days);
    }

在这里插入图片描述

例题2:
用JDK7和JDK8判断任意的一个年份是闰年还是平年
二月有29天是闰年,一年有366天是闰年
JDK7

    public static void main(String[] args) throws ParseException {
        //可以把时间设置为3月1日
        Calendar c = Calendar.getInstance();
        c.set(2023,2,1);
        //再把日历往前减一天
        c.add(Calendar.DAY_OF_MONTH,-1);
        //看看当前时间是28号还是29号
        int day = c.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);
        //判断day是28还是29
    }

在这里插入图片描述
JDK8

    public static void main(String[] args) throws ParseException {
        LocalDate ld = LocalDate.of(2023, 3, 1);
        LocalDate localDate = ld.minusDays(1);
        System.out.println(localDate.getDayOfMonth());
    }

JDK8中自带方法判断
isLeapYear();

    public static void main(String[] args) throws ParseException {
        LocalDate ld = LocalDate.of(2023, 3, 1);
        boolean leapYear = ld.isLeapYear();
        System.out.println(leapYear);
    }

在这里插入图片描述

六、包装类

包装类:用一个对象,把基本数据类型给包起来
基本数据类型对应的引用类型
为什么要设置包装类?
1、在集合当中只能存引用数据类型,不能存基本数据类型
2、参数如果是Object类型,那么基本数据类型就传不进去
在这里插入图片描述
JDK5之前

//通过构造方法获取Integer对象
Integer i1 = new Integer(1);
//通过静态方法获取Integer对象
Integer i2 = Integer.valueOf(123);

这两种方式获取对象的区别

在这里插入图片描述
运行结果
在这里插入图片描述
JDK5之后提出了自动装箱和自动拆箱

自动装箱:把基本数据类型会自动变成其对应的包装类
自动拆箱:把包装类自动的变成其对象的基本数据类型

//在底层,此时还会去自动调用静态方法valueOf得到一个Integer对象,只不过这个动作不需要我们自己去操作了
Integer i1 = 10;

Integer i2 = Integer.valueOf(10);
//自动拆箱的动作
int i = i2;

在JDK5之后,int和Integer可以看作是同一个东西,因为在内部可以自动转化

Integer中的成员方法
在这里插入图片描述
细节:

  • 细节一:在类型转换的时候,括号中的参数只能是数字不能是其他,否则代码会报错
  • 细节二:8中包装类当中,除了Character都有对应的parseXxx的方法,进行类型转换

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

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

相关文章

【密码算法 之十四】非对称算法,ECC椭圆曲线算法 之 ECDSA、ECDH、SM2、SM9等

文章目录1. ECC椭圆曲线1.1 曲线类型1.2 曲线标准1.3 表示方法1.4 曲线运算1.4.1 点加&#xff08;Point Addition&#xff09;1.4.2 点乘&#xff08;Point Multiplication&#xff09;1.4.3 倍点&#xff08;Point Double&#xff09;2. ECDSA2.1 私钥签名2.2 公钥验签3. ECD…

Java——旋转数组的最小数字

题目链接 牛客在线oj题——旋转数组的最小数字 题目描述 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]&#xff0c;将它进行旋转&#xff0c;即把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;变成一个旋转数组&#xff0c;比如变成了[3,4,5,1,2]&…

Stable Diffusion成为生产力工具(五):放大并修复老照片、马赛克照片、身份证件照

S&#xff1a;你安装stable diffusion就是为了看小姐姐么&#xff1f; I &#xff1a;当然不是&#xff0c;当然是为了公司的发展谋出路~~ 预先学习&#xff1a; 安装webui《Windows安装Stable Diffusion WebUI及问题解决记录》。运行使用时问题《Windows使用Stable Diffusion时…

Kubernetes 多集群管理工具Kuboard v3

目录 一、概述 二、安装和基本使用 2.1 添加k8s集群 2.2 信息查看 2.2.1概要信息查看 2.2.2导入集群的节点信息 2.2.3 存储 2.3创建工作负载 一、概述 Kuboard&#xff0c;是一款免费的 Kubernetes 图形化管理工具&#xff0c;Kuboard 力图帮助用户快速在 Kubernetes 上…

Tomcat8性能优化

文章目录授人以鱼不如授人以渔目的服务器资源Tomcat整体架构Tomcat配置优化Linux环境安装运行Tomcat8AJP连接什么是AJP执行器&#xff08;线程池&#xff09;3种运行模式bionioapr禁用DNS查询添加Listener版本号隐藏压缩传输部署测试用的web项目查看服务器信息查看Linux版本查看…

three.js学习 01-使用最基本的方法创建出来一个threejs立方体,three.js开发环境搭建

1.当前实现的最终效果&#xff1a; 我们将会在页面上使用threejs的渲染器创建场景和相机&#xff0c;并且将一个简单几何体结果的canvas嵌入到我们的网页中 2.环境以及工具介绍&#xff1a; three中文官方文档地址&#xff1a;https://www.three3d.cn/docs/index.html 使用的开…

制作两栏布局的 6+5 种方法:从相当合理到完全错误

一个挑战 假设您需要创建一个两列布局。是的&#xff0c;最简单的那种&#xff1a;左边一列&#xff0c;右边一列&#xff0c;中间有一些空隙。有一个明显的现代解决方案&#xff1a; .columns {display: grid;grid-template-columns: 1fr 1fr;gap: 20px; }完毕&#xff01;当…

Go 语言高质量编程

编写高质量的 Go 代码~ 前言&#xff1a; 本次课程简要介绍了高质量编程的定义和原则&#xff0c;分享了代码格式、注释、命名规范、控制流程、错误和异常处理五方面的常见编码规范&#xff0c;帮助我们在今后的开发过程中写出更加优秀的代码 … 什么是高质量编程&#xff1f…

凌恩生物文献分享|微刊:三代全长16s扩增子——环境多样性研究的明星

在微生物研究领域&#xff0c;PacBio三代全长的时代已经来临&#xff0c;如果你还没用过那就太可惜了&#xff01; 要问三代有什么好&#xff0c;那我可得说道说道。 相比于传统二代Illumina平台测序&#xff0c;PacBio Sequel lle 平台获得的序列更长&#xff0c;信息量更多…

Java Servlet Tomcat(HttpServlet)处理底层机制详解总括

以tomact服务器为例&#xff1a; 热知识&#xff1a;Servlet是java定义的处理动态资源&#xff08;非静态资源&#xff09;的java接口规范&#xff0c;HttpServlet是tomcat实现了servlet接口的类 一.当第一次发送请求时候&#xff1a; 1.查询web.xml中的url-parrtern中配置的…

LNMP及论坛搭建

安装 Nginx 服务 systemctl stop firewalld systemctl disable firewalld setenforce 01.安装依赖包 #nginx的配置及运行需要pcre、zlib等软件包的支持&#xff0c;因此需要安装这些软件的开发包&#xff0c;以便提供相应的库和头文件。 yum -y install pcre-devel zlib-deve…

排序(4)——归并排序

目录 前言 1.归并排序的递归实现 1.1 归并排序概念 1.2 归并排序递归实现 2.归并排序的非递归实现 前言 今天给大家带来比较排序的最后一种&#xff0c;归并排序&#xff0c;这个排序&#xff0c;需要我们对递归&#xff0c;循环控制要有着较强的理解&#xff0c;我相信大…

【iOS的NSNULL nil Nil 】

前言 偶然看到了NSNULL 简单了解他的兄弟nil Nil记录一下。 NSNULL Nil nil 在iOS中&#xff0c;nil、Nil和NSNull都表示“空值”的概念&#xff0c;但它们在使用时有所不同。 nil和Nil都表示空指针&#xff0c;可以用于指针类型的变量、对象类型的变量、和Objective-C对象…

浙江海發進出口股份有限公司官网上线|LTD五金技术行业案例分享

​浙江海發進出口股份有限公司 (以下简称海發)是一家多元化的国际贸易企业。拥有自己的工厂&#xff0c;稳定的资金储备和最好的服务&#xff0c;在商业领域赢得了很高的声誉。地处长江三角洲交通经济中心嘉兴市。 浙江海發進出口股份有限公司 (以下简称海發)是一家多元化的国…

Python轻量级Web框架Flask(5)——Flask模型基础和数据迁移

0、前言&#xff1a;学习这部分的前提是对python的面向对象有一定的了解&#xff0c;同时对MySQL有扎实的学习 1、Flask模型基础知识&#xff1a; Flask模型 ORM &#xff08;注意&#xff1a;在flask中用ORM可以实现SQL语句功能&#xff0c;但是并不意味着SQL语句不重要&am…

NISACTF2023 WP

NISACTF2023 WP 前言 2年多没玩CTF了&#xff0c;pwn显得手生了不少&#xff0c;我的PWN环境已经在硬盘的某个角落里吃灰了。今天参加了一场校赛&#xff0c;捣鼓了一下午&#xff0c;Reverse和PWN都AK了。其实比赛是新手向&#xff0c;没啥难度&#xff0c;不过有道PWN设计的…

ChatGPT实战100例 - (02) 自动出PPT它不香么?

文章目录ChatGPT实战100例 - (02) 自动出PPT它不香么&#xff1f;一、需求与思路1. 需求&#xff1a;出个PPT&#xff0c;5分钟后要用2. 思路&#xff1a;生成markdown然后转化二、生成markdown语法的思维导图1. 问题2. 回答三、把markdown文本转换成PPTChatGPT实战100例 - (02…

STM32 gpio外部中断详解

什么是中断&#xff1f; 打断CPU执行正常的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续运行&#xff0c;就叫中断 中断的作用和意义 中断的意义&#xff1a;高效处理紧急程序&#xff0c;不会一直占用CPU资源 STM32 GPIO外部中断简图 NVIC 什么…

JSTL标签库

英文全称&#xff1a;Java Standard Tag Lib&#xff08;Java标准的标签库&#xff09; 使用目的&#xff1a;JSTL标签库通常结合EL表达式一起使用。目的是让JSP中的java代码消失。 使用位置&#xff1a;JSTL标签是写在JSP当中的&#xff0c;但实际上最终还是要执行对应的jav…

Ubuntu 开机启动 通过crontab定时器去检查脚本 实现

有个项目的程序需要实现开机启动 通过添加一个qmcy.service服务的方法 发现 确实执行脚本了 但是脚本的程序缺并没有起来 但是如果手动执行这个脚本 程序是能起来的 不知道为啥 没办法 网上搜了下 可以通过 crontab定时器去检查 程序是否启动 没启动的话去 执行对应的脚…