JavaSE:常用类
前言
从现在开始进入高级部分的学习,鼓励自己一下!
画个大饼: 常用类->集合框架->IO流->多线程->网络编程 ->注解与反射->GUI
很重要的东西,不能不会!
Object类
祖宗类,主要方法:
toString()
getClass()
equals()
clone()
finalize()
clone ( protected )
分配一个和源对象同样大小的空间,在这个而空间创造一个对象。调用时的代码就是super.clone()
clone和new的区别
new() | clone() | |
分配空间 | 根据new后面的类型,分配空间 | 根据clone对象的大小,分配空间 |
初始化 | 调用构造函数,填充对象的域(初始化) | 使用源对象的域,填充新对象的域 |
发布对象的引用 | 把对象的引用发布到外部 | clone方法返回,把新的对象引用发布到外部 |
clone和copy的区别
clone是复制域,是新建了一个区域,内容和原对象一样
copy(就是 = )是引用,是两个名字指向内存的同一个object
复写clone()
但clone也有问题,因为java中,除了八大类型是值传递,其他类对象传参数都是引用。
比如某对象中有一个引用对象,clone就是复制了一个引用,指向的还是同一个内存object。克隆类和原始类共享一块区域,这不是我们想要的。
clone的保护机制
clone是protected的,需要改写为public
综上,实现深克隆需要以下几步:
类要实现cloneable接口
成员中的类对象,在类中写个clone()
clone()重写为public
调用super.clone()实现复制
类的clone重写为深复制
将clone()重写为public
clone()中,先浅复制一下整体,再调用给类中涉及到的其他类的clone
如:Employee类,中包含SchoolInfo类。实现Employee类的深度clone,
首先这两个类都要implement cloneable;
其次,SchoolInfo里写一个public clone(), 返回SchoolInfo对象,这个对象是(SchoolInfo)super.clone()来的;
然后,Employee里写一个public clone(), 返回Employee对象,这个对象也是(Employee)super.clone()来的,同时这个对象的schoolInfo成员,也要是schoolInfo.clone()来的;
Employee代码:
package com.Object.CloneTest;public class Employee implements Cloneable {String name;int age;SchoolInfo schoolInfo;// getter & setterpublic String getName() {return name;}public int getAge() {return age;}public SchoolInfo getSchoolInfo() {return schoolInfo;}public void setSchoolInfo(SchoolInfo schoolInfo) {this.schoolInfo = schoolInfo;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}// constructorpublic Employee(String name, int age, SchoolInfo schoolInfo){this.name = name;this.age = age;this.schoolInfo = schoolInfo;}public Employee(){}// clone,重点在于super.clone() 和 schoolinfo.clone()public Employee clone(){Employee employee = null;try {employee = (Employee) super.clone();employee.schoolInfo = (SchoolInfo) schoolInfo.clone();}catch(CloneNotSupportedException e){e.printStackTrace();}return employee;}}
SchoolInfo代码
package com.Object.CloneTest;public class SchoolInfo implements Cloneable {String schoolName;int graduateYear;public String getSchoolName() {return schoolName;}public void setSchoolName(String schoolName) {this.schoolName = schoolName;}public int getGraduateYear() {return graduateYear;}public void setGraduateYear(int graduateYear) {this.graduateYear = graduateYear;}public SchoolInfo clone(){SchoolInfo schoolInfo = new SchoolInfo();try{schoolInfo =(SchoolInfo) super.clone();}catch(CloneNotSupportedException e){e.printStackTrace();}return schoolInfo;}
}
Test代码:
package com.Object.CloneTest;public class Test {public static void main(String[] args) {// 初始化原始类SchoolInfo info = new SchoolInfo();info.schoolName = "清华大学";info.graduateYear = 2023;Employee Cindy = new Employee("Cindy", 22, info);// 新建一个EmployeeEmployee Wind = Cindy.clone();System.out.println(Wind.schoolInfo.graduateYear);Wind.schoolInfo.setGraduateYear(20);System.out.println("Cindy的毕业年份: " + Cindy.schoolInfo.graduateYear);System.out.println("Wind的毕业年份: " + Wind.schoolInfo.graduateYear);}
}
改变Wind中SchoolInfo对象的值,并没有改变Cindy中对应的值,可见实现了深度复制clone
toString ( public )
返回字符串,类名+@+对象哈希码的无符号十六进制表示
Test中测试:
// toString()/*如果Employee的clone中,没有调用schoolInfo的clone()函数,则这里输出的是:com.Object.CloneTest.SchoolInfo@3941a79ccom.Object.CloneTest.SchoolInfo@3941a79c如果Employee的clone中,调用schoolInfo的clone()函数,则这里输出的是:com.Object.CloneTest.SchoolInfo@3941a79ccom.Object.CloneTest.SchoolInfo@506e1b77可见,调用成员变量所在类的clone,的确是新建了一个域,实现了深复制*/System.out.println(Cindy.schoolInfo.toString());System.out.println(Wind.schoolInfo.toString());
getClass( public )
一般和getName()配合使用
// getClassSchoolInfo schoolInfo = new SchoolInfo();System.out.println(schoolInfo.getClass().getName());
equals
比较调用equals的对象,和形参obj所引用的对象,是否是同一个
// equalsSystem.out.println(Wind.schoolInfo.equals(Cindy.schoolInfo));
如果像比较内容,则需要重写equals函数,比如String类中就重写了
hashCode()
返回对象哈希值
如果对象equals为true,那么hashCode可推出为true
但hash相等,不一定equals
wait()
调用该方法后线程进入睡眠状态,直到:
其他线程调用了该对象的notify
其他线程调用了该对象的notifyAll
其他线程调用了interrupt中断该线程
时间间隔到了
此时该线程可以被调度,如果是被中断的话,会InterruptedException异常
notify()和notifyAll()
唤醒在该对象上等待的某个线程/所有线程
包装类
介绍
基本数据类型所对应的包装类,可采用面向对象技术,继承Object类.
所有的包装类,都是Number抽象类的子类
可以互换:
装箱:基本类型 ->包装类
拆箱:包装类 -> 基本类型
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
应用
int<->integer
public static void main(String[] args) {// 新建Integer对象int m = 500;Integer iObject = new Integer(m);int n = iObject.intValue();System.out.println(n);/*.equals 比较的是值*/Integer iObj1 = new Integer(500);System.out.println(iObj1.equals(iObject)); // trueSystem.out.println(iObj1.equals(m)); // trueInteger iObj2 = new Integer(300);System.out.println(iObj2.equals(iObject)); // false/*toString 得到的也是值,不是class Name @ 哈希码*/System.out.println(iObj1.toString()); // 500System.out.println(iObj2.toString()); // 300/*hashCode 得到的也是值*/System.out.println("hash Obj1 => " + iObj1.hashCode()); // 500System.out.println("hash Obj2 => " + iObj2.hashCode()); // 300}
源码:
int m = 500;Integer iObject = new Integer(m);System.out.println(iObject.equals(m)); // true
(所以,int m = 5; 和new一个Integer对象,对象value = 5; 这两个变量判断equals时,int如果是实参,会自动把int转换为Integer类)
字符串转化为整数
Integer.parseInt(String s, int radix)
public static void main(String[] args) {/*hello不能被parseInt1234可以被parseInt为123432daj不能被parseInt*/String[] ss = {"hello", "1234", "32daj"};for (String s:ss){try {int m = Integer.parseInt(s, 10);System.out.println(s + "可以被parseInt为" + m);}catch(Exception e){System.out.println(s + "不能被parseInt");}}}
整数转换为字符串
Integer.toString()
整数后面加""即可
自动拆箱和装箱
Integer i = 100; // 自动装箱,等同于Integer I = new Integer(i)
int j = i; // 自动拆箱,等同于int j = i.intValue()
java1.5以后,不用显式写出new Integer()
Math类
public static void main(String[] args) {System.out.println("sqrt(a): 4的平方根" + Math.sqrt(4));System.out.println("cbrt(a): 8的立方根" + Math.cbrt(8));System.out.println("pow(a,b): 计算次方, 4 的 2 次方:" + Math.pow(4,2));System.out.println("Max(a,b): 最大值" + Math.max(4,3));System.out.println("Min(a,b): 最小值" + Math.min(4,3));System.out.println("abs(a): 绝对值" + Math.abs(-102) +" " + Math.abs(3.4));System.out.println("ceil(a): >2.4的最小整数值" + Math.ceil(2.4));System.out.println("floor(a): <3.2的最大整数值" + Math.floor(3.2));System.out.println("random(): [0.1)随机" + Math.random());System.out.println("rint(): 四舍五入,但0.5时取偶数整数,返回double" + Math.rint(4.5));System.out.println("round(): 四舍五入,但0.5时取偶数整数,返回int(输入float)/ long(输入double)" + Math.round(4.5));}
Random类
两种
java.lang.Math.Random
[0.0,1.0) 下的带正号的double值
random(): [0.1)随机0.007757039688858547
2. java.util.Random
Random(): 创建一个随机数生成器
Random( Long Seed): 使用单个Long种子创建一个新的随机数生成器
public static void main(String[] args) {Random r = new Random();int iRandom = r.nextInt(120); // [0, 120) 的整数, 每次生成都不一样System.out.println(iRandom);Random rSeed = new Random(20);for(int i = 0; i < 10; i++){ // 生成的这十个数,每次运行程序,生成的序列都一样System.out.println(rSeed.nextInt(120)); }}
日期时间类
Date类
构造函数
Date() 当前日期和时间
Date(long millisec) 1970.1.1 起的毫秒数
我看还可以通过,Date(23,1,2) 来新建Date对象
创建对象后,有:
getTime()函数,返回自1970.1.1以来的毫秒数
setTime(long time) 用1970.1.1后的毫秒数设置日期
toString() 将对象转换为 dow mon dd hh:mm:ss zzz yyy
public static void main(String[] args) {// 获取当前时间// Thu Mar 02 15:36:57 CST 2023Date date = new Date();System.out.println(date.toString());// 获取自1970.1.1的毫秒数// 比较两个毫秒数:falseDate date1 = new Date();long time = date.getTime();long time1 = date1.getTime();System.out.print("比较两个毫秒数:");System.out.println(time==time1);// 比较日期// falseDate date2 = new Date(23,01,3);System.out.println(date.before(date2));}
SimpleDateFormat
格式化日期 yyyy-MM-dd hh:mm:ss
大小写的原因:MM月份,mm分钟 ,HH为24小时制,hh为12小时
public static void main(String[] args) {// 24小时制SimpleDateFormat f = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");// 12小时制SimpleDateFormat f1 = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");Date date = new Date();System.out.println(f.format(date)); //2023年03月02日 15:46:19System.out.println(f1.format(date));//2023年03月02日 03:46:19}
还有一种,printf
public static void main(String[] args) {Date d = new Date();// %tc 全部日期信息// 周四 3月 02 15:49:43 CST 2023System.out.printf("%tc", d);System.out.println();// %tF 年-月-日// 2023-03-02System.out.printf("%tF", d);System.out.println();// tD 日/月/年(2位)// 03/02/23System.out.printf("%tD", d);System.out.println();// %tr // 03:52:26 下午System.out.printf("%tr", d);System.out.println();// %tt // 15:52:26System.out.printf("%tT", d);System.out.println();// %tR // 15:52System.out.printf("%tR", d);System.out.println();}
休眠sleep
Thread.sleep(1000*3) // 休眠3秒
Calendar类
获取日期的特定部分、在特定部分进行加减
Calendar比Date强大
创建:不是new出来的,是类的一个.getInstance() 方法得到的
Calendar calendar = Calendar.getInstance();
String类
创建方法:
直接复制 String s = “hello”:开辟堆内存空间,自动入池
new一个对象String s = new String("hello"):先开辟一个堆空间放hello,new的时候又开辟一个,s指向后一个,之前的堆空间变成垃圾,不会自动入池
public static void main(String[] args) {String s = "hello";String s0 = "hello";String s1 = new String("hello");String s2 = s1;// s1是引用类型,所以 == 是比较的地址System.out.println(s == s1); // falseSystem.out.println(s1 == s2); // true// s 和 s0都是基本数据类型,所以比较的是内容System.out.println(s == s0); // true}
常量池、享元模式
StringBuilder 和 StringBuffer
线程非线程的,跳过没看
相关文章:
JavaSE:常用类
前言从现在开始进入高级部分的学习,鼓励自己一下!画个大饼: 常用类->集合框架->IO流->多线程->网络编程 ->注解与反射->GUI很重要的东西,不能不会!Object类祖宗类,主要方法:t…...
Element中树形控件在项目中的实际应用
文章目录1、使用目的2、官网组件3、组合使用组件案例4、在项目中实际应用4.1 组合组件的使用4.1.2 代码落地4.1.3 后台接口数据4.1.4 实际效果官网连接直达:Tree树形控件的使用 1、使用目的 用清晰的层级结构展示信息,可展开或折叠。 2、官网组件 <…...
kaggle RSNA 比赛过程总结
引言 算算时间,有差不多两年多没在打kaggle了,自20年最后一场后(其实之前也就打过两场,一场打铁,一场表格赛是金是银不太记得,当时相当于刺激战场,过拟合lb大赛太刺激了,各种trick只…...
51单片机入门————LED灯的控制
LED的电路图通过原理图看出,LED灯是接单片机芯片的P20~P27的一共有8个LED,51单片机也是8字节的P20x010xFE————1111 1110P20xFE可以表示把在P2端的第一个灯点亮1 表示高电平0表示低电平当为0的时候形成一个完整回路,电流从高电平流向低电平…...
J - 二进制与、平方和(线段树 + 维护区间1的个数)
2023河南省赛组队训练赛(二) - Virtual Judge (vjudge.net) 请你维护一个长度为 n 的非负整数序列 a1, a2, ..., an,支持以下两种操作: 第一种操作会将序列 al, al 1, ..., ar 中的每个元素,修改为各自和 x…...
BertTokenizer的使用方法(超详细)
导入 from transformers import BertTokenizer from pytorch_pretrained import BertTokenizer以上两行代码都可以导入BerBertTokenizer,transformers是当下比较成熟的库,pytorch_pretrained是google提供的源码(功能不如transformers全面) 加载 tokenizer BertT…...
深度学习编译器CINN(3):编译过程中遇到的问题总结
目录 问题一:No module named XXXX 问题描述 分析与解决方案 问题二:catastrophic error: cannot open source file "float16.h"...
yum 安装mysql8数据全过程
mysql8安装方式:(使用官方yum仓库) 1. wget https://dev.mysql.com/get/mysql80-community-release-el7-4.noarch.rpm 安装 yum install mysql80-community-release-el7-4.noarch.rpm 2、生成yum源缓存 每次当我们编写了,…...
内网vCenter部署教程一
PS:因为交换机链路为trunk,安装先登录ESXI,将端口组改为管理vlan ID(1021) 一、双击镜像,打开文件夹,目录为F:\vcsa-ui-installer\win32,双击installer.exe 二、先设置语言为中文 三、点击下一步 四、选择需要安装esxi的主机。 五、设置Vcenter虚拟机的密码...
java 进阶—线程的常用方法
大家好,通过java进阶—多线程,我们知道的什么是进程,什么是线程,以及线程的三种创建方式的选择 今天,我们来看看线程的基础操作 start() 开启线程 public class Demo implements Runnable {Overridepublic void run…...
hadoop的运行模式
作者简介:大家好我是小唐同学(๑><๑),好久不见,为梦想而努力的小唐又回来了,让我们一起加油!!! 个人主页:小唐同学(๑><๑)的博客主页 目前…...
服务器(centos7.6)已经安装了宝塔面板,想在里面安装一个SVN工具(subversion),应该如何操作呢?
首先,在登录进入宝塔面板,然后点击左侧终端,进入终端界面,如下图:------------------------------------------如果是第一次使用会弹出输入服务器用户名和密码,此时输入root账号和密码,即可进入…...
从智能进化模型看用友BIP的AI平台化能力
随着人工成本的上升,智能和自动化技术的成熟,企业在越来越多的场景开始应用自动化技术来替代相对标准及有规则的工作,同时利用智能算法来优化复杂工作及决策,获得竞争优势。 不同于阅读、聊天、搜索等面向终端用户的应用场景&…...
项目管理的主要内容包括哪些?盘点好用的项目管理系统软件
阅读本文您将了解:1、项目管理的主要内容包括哪些2、好用的项目管理软件 项目管理是为了实施一个特定目标,所实施的一系列针对项目要素的管理过程,包括过程、手段以及技术等。 通过项目管理,我们能够提前安排和控制项目的时间、…...
Allegro如何查看PCB上器件的库路径操作指导
Allegro如何查看PCB上器件的库路径操作指导 在做PCB设计的时候,有时需要检查PCB上器件使用的库的路径是否正确,Allegro支持快速将PCB上所有器件的库路径都列出来 如下图 如何显示这个报表,具体操作如下 点击Tools点击Report...
笔记【尚硅谷】大数据Canal教程丨Alibaba数据实时同步神器
视频教程:【尚硅谷】大数据Canal教程丨Alibaba数据实时同步神器教程资料:https://pan.baidu.com/s/1VhGBcqeywM6jyXJxtytd1w?pwd6666,提取码:6666本套教程以Canal的底层原理展开讲解,细致地介绍了Canal的安装部署及常…...
如何重定向命令行日志信息到指定txt文件?
如果你想把命令行的输出重定向到指定的txt文件,你可以使用一些符号来实现。例如,你可以在命令后面加上>或>>符号,然后指定文件名。例如: command > output.txt 这样就会把command的标准输出保存到output.txt文件中&…...
物理机不能访问虚拟机kali的web服务解决方案记录
目录 环境 问题描述 解决方案 知识补充 效果测试 其他思路 环境 kali(nat模式),物理机,可互ping 问题描述 kali的web服务器不能在物理机上访问。 1.本机能ping通虚拟机 2.虚拟机也能ping通本机 3.虚拟机能访问自己的web …...
服务器配置 | 在Windows本地显示远程服务器绘图程序
文章目录方法1:在MobaXterm的终端输入指令方法2:在Pycharm中运行前提概要,需要在本地Windows端显示点云的3d可视化界面 对于点云的3d可视化一般有两种方法,open3d显示或者是mayavi显示。这两个库都可以使用pip install来实现安装…...
从0开始学python -47
Python CGI编程 -2 GET和POST方法 浏览器客户端通过两种方法向服务器传递信息,这两种方法就是 GET 方法和 POST 方法。 使用GET方法传输数据 GET方法发送编码后的用户信息到服务端,数据信息包含在请求页面的URL上,以"?"号分割…...
【数据结构】八大经典排序总结
文章目录一、排序的概念及其运用1.排序的概念2.常见排序的分类3.排序的运用二、常见排序算法的实现1.直接插入排序1.1排序思想1.2代码实现1.3复杂度及稳定性1.4特性总结2.希尔排序2.1排序思想2.3复杂度及稳定性2.4特性总结3.直接选择排序3.1排序思想3.2代码实现3.3复杂度及稳定…...
BI的能力边界:能解决的企业问题和不擅长的领域
数字化转型本就需要借助信息化相关技术、思想来完成,所以说信息化建设同样是数字化转型过程中非常重要的一环,而这就是商业智能BI和数字化转型的关系 BI 能解决的企业问题 数据是企业的重要资产,也是企业商业智能BI的核心要求。通常&#x…...
金三银四面试必备,“全新”突击真题宝典,阿里腾讯字节都稳了
前言招聘旺季就到了,不知道大家是否准备好了,面对金三银四的招聘旺季,如果没有精心准备那笔者认为那是对自己不负责任;就我们Java程序员来说,多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础知识点考…...
MYSQL 基础篇 | 02-MYSQL基础应用
文章目录1 MySQL概述2 SQL2.1 SQL通用语法2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作2.4 DML2.4.1 添加数据2.4.2 修改数据2.4.3 删除数据2.5 DQL2.5.1 基础查询2.5.2 条件查询2.5.3 聚合查询2.5.4 分组查询2.5.5 排序查询2.5.6 分页查询2.5.7 综合练习2.6 DCL2.6.1 管理…...
CSS实现checkbox选中动画
前言 👏CSS实现checkbox选中动画,速速来Get吧~ 🥇文末分享源代码。记得点赞关注收藏! 1.实现效果 2.实现步骤 定义css变量,–checked,表示激活选中色值 :root {--checked: orange; }创建父容器…...
工业机器人编程调试怎么学
很多人觉得工业机器人很难学学,实际上机器人涉及的知识远比PLC要少。现简单说明一下初学者学习工业机器人编程调试的流程,以AUBO机器人为例: 首先我们需要知道工业机器人的调试学起来不难,远比编程更简单,示教器上的编…...
Java并发包提供了哪些并发工具类?
第19讲 | Java并发包提供了哪些并发工具类? 通过前面的学习,我们一起回顾了线程、锁等各种并发编程的基本元素,也逐步涉及了 Java 并发包中的部分内容,相信经过前面的热身,我们能够更快地理解 Java 并发包。 今天我要…...
systemctl 启动/停止/重新加载 nginx
systemctl 启动/停止/重新加载 nginx 一、新建nginx.service脚本 sudo vim /usr/lib/systemd/system/nginx.service然后按iii进入编辑模式,粘贴如下内容,其中/usr/local/nginx/是进行make && make install之后的文件夹路径,需要根据…...
SSRF学习 3
目录 <1> 什么是SSRF? <2> 通常SSRF会发生在哪些位置? <3> 测试流程 <4> Weblogic-ssrf 复现 (1) 漏洞存在点 (2) 注入HTTP头,利用Redis反弹shell (3) 修复方案 <1> 什么是SSRF? SSRF(Serv…...
python发布WordPress/搜索引擎优化内容包括哪些方面
云服务器到期了怎么迁移数据 内容精选换一换普通的按需实例(不含本地盘、FPGA卡)、竞价模式的竞价计费实例(不含本地盘、FPGA卡),关机后,基础资源(vCPU、内存、镜像)不再计费,绑定的云硬盘(包括系统盘、数据盘)、弹性公网IP、带宽等资源按各自…...
wordpress主题哥/免费网页制作网站
API 我自己挑一些觉得比较特殊或者不太常用的API来记录一下,毕竟常用那些,大家都非常熟悉了。 numpy.zeros() 创建一个所有元素为0的数组。 代码: my_np1 = np.zeros(6)...
交城有做网站的吗/seo搜索引擎实训心得体会
SpringCloud中的OpenFeign的超时控制和日志增强 为什么要学这个?你不想面试的时候多装两个逼多拿两千块钱? 先回顾一下我们之前OpenFeign的基本使用SpringCloud中的OpenFeign以及与Feign的区别。 我们现在衍生一下,在实际生产环境中&#x…...
wordpress 分享 点赞/天津百度推广排名
1:简述Servlet的生命周期,分析Servlet与CGI的区别。Servlet的生命周期分为5个阶段:实例化:Servlet容器创建Servlet类的实例。初始化:该容器调用init()方法,通常会申请资源。服务:由容器调用service()方法&a…...
上海cms模板建站/销售策略和营销策略
所谓隔代通信就是A 与C的通信 A -> B -> C代码实例 A.vue <template><div id"app"><!-- 此处监听了事件,可以在C组件中直接触发 --><b-childnameToB"nameToB" nameToC"nameToC" buttonClick"butto…...
做时时彩网站需要什么/卫星电视安装视频
MySQL 是一个小巧玲珑但功能强大的数据库,目前十分流行。但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的。很多人下了zip格式的解压 发现没有setup.exe,面对一堆文件一头雾水,不知如何安装。下面笔者将…...