JavaSE:常用类

news2024/12/23 11:27:39

前言

从现在开始进入高级部分的学习,鼓励自己一下!

画个大饼: 常用类->集合框架->IO流->多线程->网络编程 ->注解与反射->GUI

很重要的东西,不能不会!

Object类

祖宗类,主要方法:

  • toString()

  • getClass()

  • equals()

  • clone()

  • finalize()

  1. 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

综上,实现深克隆需要以下几步:

  1. 类要实现cloneable接口

  1. 成员中的类对象,在类中写个clone()

  1. clone()重写为public

  1. 调用super.clone()实现复制

  1. 类的clone重写为深复制

  1. clone()重写为public

  1. clone()中,先浅复制一下整体,再调用给类中涉及到的其他类的clone

如:Employee类,中包含SchoolInfo类。实现Employee类的深度clone,

  1. 首先这两个类都要implement cloneable;

  1. 其次,SchoolInfo里写一个public clone(), 返回SchoolInfo对象,这个对象是(SchoolInfo)super.clone()来的;

  1. 然后,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 & setter
    public 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;
    }

    // constructor
    public 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);

        // 新建一个Employee
        Employee 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

  1. toString ( public )

返回字符串,类名+@+对象哈希码的无符号十六进制表示

Test中测试:

        // toString()
        /*
        如果Employee的clone中,没有调用schoolInfo的clone()函数,则这里输出的是:
        com.Object.CloneTest.SchoolInfo@3941a79c
        com.Object.CloneTest.SchoolInfo@3941a79c

        如果Employee的clone中,调用schoolInfo的clone()函数,则这里输出的是:
        com.Object.CloneTest.SchoolInfo@3941a79c
        com.Object.CloneTest.SchoolInfo@506e1b77

        可见,调用成员变量所在类的clone,的确是新建了一个域,实现了深复制
         */

        System.out.println(Cindy.schoolInfo.toString());
        System.out.println(Wind.schoolInfo.toString());
  1. getClass( public )

一般和getName()配合使用

// getClass
        SchoolInfo schoolInfo = new SchoolInfo();
        System.out.println(schoolInfo.getClass().getName());
  1. equals

比较调用equals的对象,和形参obj所引用的对象,是否是同一个

// equals
        System.out.println(Wind.schoolInfo.equals(Cindy.schoolInfo));

如果像比较内容,则需要重写equals函数,比如String类中就重写了

  1. hashCode()

返回对象哈希值

如果对象equals为true,那么hashCode可推出为true

但hash相等,不一定equals

  1. wait()

调用该方法后线程进入睡眠状态,直到:

  • 其他线程调用了该对象的notify

  • 其他线程调用了该对象的notifyAll

  • 其他线程调用了interrupt中断该线程

  • 时间间隔到了

此时该线程可以被调度,如果是被中断的话,会InterruptedException异常

  1. notify()和notifyAll()

唤醒在该对象上等待的某个线程/所有线程

包装类

  1. 介绍

基本数据类型所对应的包装类,可采用面向对象技术,继承Object类.

所有的包装类,都是Number抽象类的子类

可以互换:

  • 装箱:基本类型 ->包装类

  • 拆箱:包装类 -> 基本类型

byte

Byte

short

Short

int

Integer

long

Long

char

Character

float

Float

double

Double

boolean

Boolean

  1. 应用

  • 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));   // true
        System.out.println(iObj1.equals(m));         // true
        Integer iObj2 = new Integer(300);
        System.out.println(iObj2.equals(iObject));   // false

        /*
        toString 得到的也是值,不是class Name @ 哈希码
         */
        System.out.println(iObj1.toString());   // 500
        System.out.println(iObj2.toString());   // 300

        /*
        hashCode 得到的也是值
         */
        System.out.println("hash Obj1 => " + iObj1.hashCode());   // 500
        System.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不能被parseInt
        1234可以被parseInt为1234
        32daj不能被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");
            }
        }
    }
  • 整数转换为字符串

  1. Integer.toString()

  1. 整数后面加""即可

  1. 自动拆箱和装箱

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类

两种

  1. 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)); 
        }
    }

日期时间类

  1. 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 2023
        Date date = new Date();
        System.out.println(date.toString());

        // 获取自1970.1.1的毫秒数
        // 比较两个毫秒数:false
        Date date1 = new Date();
        long time = date.getTime();
        long time1 = date1.getTime();
        System.out.print("比较两个毫秒数:");
        System.out.println(time==time1);

        // 比较日期
        // false
        Date date2 = new Date(23,01,3);
        System.out.println(date.before(date2));
    }
  1. 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:19
        System.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 2023
        System.out.printf("%tc", d);
        System.out.println();
        // %tF 年-月-日
        // 2023-03-02
        System.out.printf("%tF", d);
        System.out.println();
        // tD 日/月/年(2位)
        // 03/02/23
        System.out.printf("%tD", d);
        System.out.println();
        // %tr 
        // 03:52:26 下午
        System.out.printf("%tr", d);
        System.out.println();
        // %tt 
        // 15:52:26
        System.out.printf("%tT", d);
        System.out.println();
        // %tR 
        // 15:52
        System.out.printf("%tR", d);
        System.out.println();
    }

休眠sleep

Thread.sleep(1000*3)  // 休眠3秒

  1. 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);    // false
        System.out.println(s1 == s2);   // true

        // s 和 s0都是基本数据类型,所以比较的是内容
        System.out.println(s == s0);    // true
    }

常量池、享元模式

StringBuilder 和 StringBuffer

线程非线程的,跳过没看

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

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

相关文章

接口测试简介

接口测试简介 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 ——百度百科&#xff01; …

低代码开发与传统开发有什么不同?有什么价值?

低代码开发与传统开发有些什么不同&#xff1f;有什么价值&#xff1f; 自2014年Forrester明确提出低代码&#xff08;Low-Code&#xff09;概念以来&#xff0c;这一领域已经逐步升温。近年来&#xff0c;低代码凭借其低开发门槛和易用性等优点赢得了众多投资研究机构和企业用…

设计模式(十四)----结构型模式之组合模式

1 概述 对于这个图片肯定会非常熟悉&#xff0c;上图我们可以看做是一个文件系统&#xff0c;对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树&#xff0c;当我们找到某个叶子节点后&#xff0c;就可以对叶子节点进行相关的操作。可以将这颗树…

Cookie原理及JAVA端关于Cookie的增删改查操作

什么是Cookie 在java中&#xff0c;Cookie是来自于Servlet规范中一个工具类&#xff0c;存在于Tomcat提供servlet-api.jar中Cookie存放当前用户的私人数据 Cookie原理 用户打开浏览器第一次&#xff08;指每次重新打开浏览器的第一次&#xff0c;而非指历来第一次&#xff0…

ChatGPT可以作为一个翻译器吗?

论文地址&#xff1a;https://arxiv.org/abs/2301.08745.pdf 背景 自从OpenAI2022年11月30日发布ChatGPT以来&#xff0c;基本上把NLP所有任务大统一了&#xff0c;那么在机器翻译的表现到底如何呢&#xff1f;腾讯AI Lab在翻译Prompt、多语言翻译以及翻译鲁棒性三方面做了一…

365天深度学习训练营-第J4周:ResNet与DenseNet结合探索

目录 一、前言 二、论文解读 三、DPN代码复现 四、总结 一、前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制● 难度&#xff1a;夯实基础⭐⭐ ● 语言&#xff1a;Python3、Pytorc…

难道ERP"死了",中台"凉了",低/无代码要称王了?

一句&#xff1a;“不上ERP等死&#xff0c;上了ERP找死”&#xff0c;可把ERP的尴尬处境说透了。 有人把ERP奉为信仰&#xff1a;“那些说ERP不好用的根本是没用明白。” 有人则认为ERP只是卖概念&#xff0c;冷嘲&#xff1a;“实施ERP的企业&#xff0c;估计一半都倒闭了。…

JavaSE-集合框架013-队列Queue及双端队列Deque

原文链接 Queue 我们可以把LinkedList当作队列来用&#xff0c;也可以当作链表来用。LinkedList只是一个实现方式&#xff0c;但是可以具备很多特点 虽然他是一个链表&#xff0c;但是当你从后加从前取&#xff0c;就是队列&#xff08;Queue&#xff09;。当你从后加从后取&a…

第七章 实现effect的stop功能

实现effect的stop功能 通过stop函数传入effect返回的runner 再次修改响应式对象的值的时候 不会修改成功 其实主要思路就是在调用stop函数的时候将 收集的effect依赖移除掉 老样子先给上测试用例&#xff1a; it(stop,()>{// 通过stop函数传入effect返回的runner 再次修…

JPG格式图片怎么弄?可以试试这些途径

在日常生活中&#xff0c;我们经常需要将图片转换为JPG格式&#xff0c;以便在各种设备上使用&#xff0c;因为 JPG 是一种常用的图像格式&#xff0c;具有广泛的兼容性和易用性。这里将介绍几种简单的方法&#xff0c;以帮助您将图片转换为JPG格式。方法一、使用格式转换软件转…

快速入门 Stream 流 【学习笔记】Java基础

若文章内容或图片失效&#xff0c;请留言反馈。部分素材来自网络&#xff0c;若不小心影响到您的利益&#xff0c;请联系博主删除。写这篇博客旨在制作笔记&#xff0c;方便个人在线阅览&#xff0c;巩固知识&#xff0c;无其他用途。 学习视频&#xff1a;【黑马 Java 基础教程…

怎么避免计算机SCI论文的重复率过高? - 易智编译EaseEditing

论文成稿前 在撰写阶段就避免重复&#xff1a;在撰写阶段就避免文章中的重复内容&#xff0c;可以减少后期修改的工作量。 在写作前&#xff0c;可以制定良好的计划和大纲&#xff0c;规划好文章的结构和内容&#xff0c;从而减少重复内容。 加强对相关文献的阅读 为了避免自己…

大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

6 最短路径 最短路径&#xff0c;对于图来说&#xff0c;是两顶点之间经过的边数最少的路径&#xff1b;对于网来说&#xff0c;是指两顶点之间经过的边上权值之和最小的路径。路径上第一个顶点为源点&#xff0c;最后一个顶点是终点。 6.1 迪杰斯特拉&#xff08;Dijkstra&am…

【C语言】深度理解指针(上)

前言&#x1f30a;谈到指针&#xff0c;想必大家都不陌生。它不仅是C语言的重难点&#xff0c;还是不少C初学者的噩梦。本期我们将深度探讨一些较为复杂的指针以及指针的妙用&#xff0c;带领大家感受指针的魅力&#x1f61d;。首先&#xff0c;我们先来复习复习指针的概念&…

dbutils给bean类对象赋值源码分析

本文重点 以ResultSetHandler的实现类BeanListHandler为例&#xff0c;探索dbutils的QueryRunner的实现细节&#xff0c;重点是如何给java bean类对象赋值。 public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws…

119.Android 简单的软键盘和菜单无缝切换效果,聊天界面软键盘无缝切换

//此效果主要通过动态设置windowSoftInputMode三种状态的切换实现&#xff1a;SOFT_INPUT_ADJUST_NOTHING、SOFT_INPUT_ADJUST_PAN、SOFT_INPUT_ADJUST_RESIZE。 1.第一步 导入需要用到的依赖库&#xff1a; //RecyclerView implementation com.android.support:recyclerview-…

做为骨干网络的分类模型的预训代码安装配置简单记录

一、安装配置环境 1、准备工作 代码地址 GitHub - bubbliiiing/classification-pytorch: 这是各个主干网络分类模型的源码&#xff0c;可以用于训练自己的分类模型。 # 创建环境 conda create -n ptorch1_2_0 python3.6 # 然后启动 conda install pytorch1.2.0 torchvision…

Anaconda环境配置Python绘图库Matplotlib的方法

本文介绍在Anaconda环境中&#xff0c;安装Python语言matplotlib模块的方法。 在之前的文章中&#xff0c;我们多次介绍了Python语言matplotlib库的使用&#xff1b;而这篇文章&#xff0c;就介绍一下在Anaconda环境下&#xff0c;配置matplotlib库的方法。 首先&#xff0c;打…

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual ...

目录 报错 解决 注意&#xff1a; - > 是追加的意思。 解决&#xff1a;分号结尾执行报错&#xff0c;然后重新输入正确的sql语句就可以了。 报错 在docker中部署mysql&#xff0c;创建进入mysql进行数据库查询的时候报错&#xff1a; ERROR 1064 (42000): You have a…

有趣的小知识(三)提升网站速度的秘诀:掌握缓存基础,让你的网站秒开

像MySql等传统的关系型数据库已经不能适用于所有的业务场景&#xff0c;比如电商系统的秒杀场景&#xff0c;APP首页的访问流量高峰场景&#xff0c;很容易造成关系型数据库的瘫痪&#xff0c;随着缓存技术的出现很好的解决了这个问题。 一、缓存的概念&#xff08;什么是缓存…