Java基础总结(二)
文章目录
- 一、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的方法,进行类型转换
异常
异常就是代表程序出现的问题
Error:代表的系统级别错误(属于严重问题)
Exception:叫做异常,代表程序可能出现的问题,通常会用Exception以及他的子类来封装程序出现的问题
RuntimeException:运行时异常,RuntimeException及其子类,编译阶段不会出现异常提醒。运行时出现的异常(数组索引越界异常)
其他异常:编译时异常,编译阶段就会出现异常提醒的。
编译时异常和运行时异常的区别:
编译时异常:除了RuntimeException本身和所有子类,其他都是编译时异常,编译阶段需要进行处理
运行时异常:RuntimeException本身和所有子类,都是运行时异常,编译阶段不会报错,程序运行时出现
异常的处理方式:
- JVM默认的处理方式
把异常信息以红色字体打印在控制台,并结束程序
- 自己处理
try catch
一般用在调用处,代码可以继续执行,不会停止
- 抛出异常
在方法中,出现异常了,方法就没有继续运行下去的意义了,采取抛出处理
throws: 写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常。编译时异常:必须要写,运行时异常:可以不写.
thorw: 写在方法内,结束方法。手动抛出异常对象,交给调用者,方法中下面的代码不再执行了
相关文章:

Java基础总结(二)
文章目录 一、ObjectObject中的成员方法(11个)toStringequalsclone 二、Objects三、BigInteger和BigDecimaBigIntegerBigDecima 四、正则表达式五、DateJDK7前时间相关类SimpleDateFormat类Calendar类 JDK8新增时间相关类 六、包装类异常 一、Object 没…...

大数据-玩转数据-oracle创建dblink及应用
一、创建DBLINK的应用场景 oracle在进行跨库访问时,可以通过创建dblink实现。 二、创建DBLINK应用场景 在tnsnames.ora中配置两个数据库别名:orcl(用户名:wangyong 密码:1988)、orcl2(用户名:wangyong 密码…...

冯诺依曼体系结构
冯诺依曼体系结构 目录 冯诺依曼体系结构引入1、冯诺依曼体系结构1.1 内存1.2 操作系统预加载 2、操作系统2.1 理解管理2.2 系统调用接口2.3 操作系统四大基本功能 引入 冯诺依曼体系结构(von Neumann architecture)是现代计算机体系结构的基础…...

Axios请求(对ajax的二次封装)——Axios API、Axios实例、请求配置、Axios响应结构
axios起步——介绍和使用基本用例post请求 场景复现核心干货axios APIaxios(config)axios(url[,config])请求方式别名 axios实例创建一个axios实例axios.create([config])实例方法 axios请求配置axios响应结构 场景复现 最近学习与前端相关的小程序时,接触了异步请…...

Scrum of Scrums规模化敏捷开发管理全流程
Scrum of Scrums是轻量化的规模化敏捷管理模式,Leangoo领歌可以完美支持Scrum of Scrums多团队敏捷管理。 Scrum of Scrums的场景 Scrum of Scrums是指多个敏捷团队共同开发一个大型产品、项目或解决方案。Leangoo提供了多团队场景下的产品路线图规划、需求管理、…...

BP神经网络原来就是曲线拟合
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 在初学BP神经网络的时候,总是非常抽象和难理解 但是,学久了会发现,BP神经网络原来就是曲线拟合! 一下子才具体、深入的理解到BP神经网络是什么 本文…...
Oracle数据库查看与修改内存配置
Oracle数据库查看与修改内存配置 Oracle内存管理模式查看Oracle内存分配修改Oracle内存分配 Oracle内存管理模式 Oracle数据库的内存管理模式从自动管理化程度由高到低依次可以分为: 自动内存管理:完全由Oracle自动管理内存分配。DBA只需设置MEMORY_TA…...

Jenkins自动拉取SVN源代码构建打包vue前端项目
目录 1.功能需求 2.安装插件 2.1 安装NodeJS插件 2.2 安装SVN插件 3.配置环境 3.1 NodeJS环境 4.新建任务配置部署信息 4.1 源代码管理 4.2 构建触发器 4.3 构建环境 4.4 构建步骤 5.构建项目 5.1 点击查看控制台日志 1.功能需求 使用Jenkins从SVN上拉取Vue项…...

MySQL表的操作
文章目录: 创建表查看表结构修改表删除表 在使用 MySQL 数据库时,操作表是最基本和最重要的任务之一。表是 MySQL 数据库的核心对象,用于存储数据,并且可以通过 SQL 语句进行查询、插入、更新和删除等操作。因此,熟练掌…...

MySQL索引数据结构入门
之前松哥写过一个 MySQL 系列,但是当时是基于 MySQL5.7 的,最近有空在看 MySQL8 的文档,发现和 MySQL5.7 相比还是有不少变化,同时 MySQL 又是小伙伴们在面试时一个非常重要的知识点,因此松哥打算最近再抽空和小伙伴们…...
《低代码PaaS驱动集团企业数字化创新白皮书》-低代码PaaS应对行业集团企业数字化应用的需求(制造)
低代码PaaS应对行业集团企业数字化应用的需求 制造 制造业是我国重要的经济支柱之一,随着经济结构的调整,产业链的转移,劳动密集型制造业的利润已大不如前。在数字经济的大环境下,诸多制造业企业选择数字化转型,通过…...

深度学习实战26-(Pytorch)搭建TextCNN实现多标签文本分类的任务
大家好,我是微学AI,今天给大家介绍一下深度学习实战26-(Pytorch)搭建TextCNN实现多标签文本分类的任务,TextCNN是一种用于文本分类的深度学习模型,它基于卷积神经网络(Convolutional Neural Networks, CNN)实现。TextCNN的主要思想…...

还在精神内耗?还在焦虑?可以看看这个
作为一个即将毕业的本科生,总是会不由自主的焦虑。因为不考研,所以显得和同学们格格不入,每天都在进行精神内耗,但是我不经意间看到了一个东西-《邓宁克鲁格效应》 上述的四个阶段刻画出了一条典型的“大师养成之路”。但大师毕竟…...
Event Camera (事件相机)
1.传统相机的缺点 1.随着计算机视觉领域的不断发展,目标检测的算法也越来越多样化,特别是近些年深度学习在计算机视觉领域的进步,已经产生了很多优秀的目标检测方法,这些基于帧的方法对于图片的质量有一定的要求,比如合…...

藏经阁(七)有源蜂鸣器和无源蜂鸣器 解析
文章目录 特征区别场景选型实战应用 特征 有源蜂鸣器特征: 又被称为直流蜂鸣器包含了一个多谐振荡器只要额定直流电压可以在两端发出声音具有驱动控制简单价格略高 无源蜂鸣器特征: 又被称为交流蜂鸣器内部没有振荡器需要在两端施加特定频率的方波电…...

配置FTP/TFTP协议的ASPF
在多通道协议和NAT的应用中,ASPF是重要的辅助功能。通过配置ASPF功能,实现内网正常对外提供FTP和TFTP服务,同时还可避免内网用户在访问外网Web服务器时下载危险控件。 组网需求 如图1所示,FW部署在某公司的出口,公司提…...

泛型基本说明
使用传统方法的问题分析 不能对加入到集合ArrayList中的数据类型进行约束(不安全)遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响。泛型的好处 编译时,检查添加元素的类型,提…...
干洗店洗鞋下店预约小程序开发多少钱
干洗店小程序是一种便捷的移动应用程序,能够帮助用户快捷、轻松地处理干洗、洗衣和清洗等服务。随着智能手机普及和人们生活节奏的不断加快,越来越多人选择使用干洗店小程序来满足自己的日常衣物清洗需求。那干洗店小程序怎么弄,洗衣预约小程…...

用Python实现批量翻译文档文件
文件名批量翻译需要用到编程语言和相应的翻译 API,下面以 Python 和 Google 翻译 API 为例,介绍具体的实现步骤: 安装必要的 Python 库 使用 Python 代码进行文件名翻译需要先安装两个库:googletrans 和 os。 pip install goog…...

机器视觉公司,在玩一局玩不起的游戏
导语 有个著名咨询公司曾经预测过:未来只有两种公司,是人工智能的和不赚钱的。 它可能没想到,还有第三种——不赚钱的AI公司。 去年我们报道过“正在消失的机器视觉公司”,昔日的“AI 四小龙”( 商汤、旷视、云从、依图…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...