【JAVA BASE API】介绍Java基础API语法,包括JAVA8之后的时间日期等

news2024/11/15 9:48:47

在这里插入图片描述

博主:_LJaXi Or 東方幻想郷
专栏: Java | 从跨平台到跨行业
开发工具:IntelliJ IDEA

JAVA BASE API

  • Object 类
    • `clone` 对象克隆
    • `toString()` 转换字符串
    • `equals(Object obj)` 地址比较
  • Objects 类
    • `Objects.equals(Object obj1, Object obj2)` 非空比较
    • `isNull(Object obj)` 判断null
    • `nonNull(Object obj)` 判断非null
  • 包装类
    • 自动装箱
    • 自动拆箱
  • 字符串操作 | StringBuilder,StringBuffer,StringJoiner
    • `StringBuilder` 字符串操作
      • 基本使用
      • 使用 `StringBuilder` 拼接数组
    • `StringBuffer` 字符串操作
    • `StringJoiner` 字符串拼接
      • 基本使用
  • `Math`,`System`,`Runtime`
    • `Math` 数学类
    • `System` 系统类
    • `Runtime` 运行类
      • 简单使用
  • `BigDecimal` 解决小数失真运算
  • Date 类
    • `before Java 1.8 `
      • 创建时间对象(部分过时)
      • 获取日期和时间(过时的)
      • 设置日期和时间(过时的)
      • 格式化和解析时间对象(部分过时)
    • `after Java 1.8`

Object 类

Object类是类层次结构的根。每个类都有 Object作为超类。所有对象,包括数组,实现这个类的方法

Object 常见的 API

API用法
clone()创建并返回此对象的副本
toString()返回对象的字符串表现形式
equals(Object obj)指示是否有其他对象 “等于” 这一个

clone 对象克隆

public class Demo{
  public static void main(String[] args) {
	Person p = new Person(12, "zhangssan");
	Person p1 = null;

	{
	  try{
		p1 = (Person)p.clone();
	  } catch(CloneNotSupportedException e) {
		e.printStackTrace();
	  }
	{
	System.out.println(p); // Person@123456
	System out.println(p1); // Person@114514
  }
}

从这边代码可以看到 p1 使用 clone 方法 克隆 对象 p
地址却是不一样的, 说明我们开辟了一块新的栈内存

在这里插入图片描述

浅拷贝 与 深拷贝

  1. 浅拷贝
// Person 类
class Person implements Cloneable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override             // throws xxx 异常声明 或使用 try catch
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}
// Main 程序入口类
public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person("Alice", 25);
        Person person2 = (Person) person1.clone();

        System.out.println("person1: " + person1);
        System.out.println("person2: " + person2);

        // 修改person1的字段
        person1.setName("Bob");
        person1.setAge(30);

        // 验证浅拷贝的效果
        System.out.println("person1: " + person1);
        System.out.println("person2: " + person2);
    }
}
  1. 只可以在子类中重写克隆方法, 因为 Main 函数不是类的实例方法, 它无法被继承或重写
  2. 可以看到 Person 类实现了一个接口 Cloneable, 这个 Cloneable 就称之为 标记接口, 它表示该类的实例可以被克隆, 看开看你会发现它只是一个 …{}

运行如下

person1: Person{name='Alice', age=25}
person2: Person{name='Alice', age=25}
person1: Person{name='Bob', age=30}
person2: Person{name='Alice', age=25}
  1. 深拷贝
// Person 类
class Person implements Cloneable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override         // throws xxx 异常声明 或使用 try catch
    public Object clone() throws CloneNotSupportedException {
        // 创建新的Person对象
        Person clonedPerson = (Person) super.clone();
        // 修改为深拷贝
        clonedPerson.name = new String(this.name);
        // 对于基本类型,直接复制值
        clonedPerson.age = this.age;

        return clonedPerson;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

// Main 程序入口类
public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person("Alice", 25);
        Person person2 = (Person) person1.clone();

        System.out.println("person1: " + person1);
        System.out.println("person2: " + person2);

        // 修改person1的字段
        person1.setName("Bob");
        person1.setAge(30);

        // 验证深拷贝的效果
        System.out.println("person1: " + person1);
        System.out.println("person2: " + person2);
    }
}

运行如下

person1: Person{name='Alice', age=25}
person2: Person{name='Alice', age=25}
person1: Person{name='Bob', age=30}
person2: Person{name='Alice', age=25}

首先,创建了一个名为 person1Person 对象,其姓名为 "Alice",年龄为 25 然后,通过调用clone() 方法创建了一个名为 person2 的新对象,它与 person1 具有相同的属性值。
在验证深拷贝效果之前,我们修改了 person1 的姓名为 "Bob" ,年龄为 30 最后,输出了 person1person2 的详细信息。
可以看到,person1 的改变没有影响到 person2 ,说明这是一个深拷贝。因此,person1 被成功拷贝到了 person2 它们之间没有共享字段的引用。

toString() 转换字符串

toString() 方法源码

public String toString() {
   return "Person{name='" + name + "', age=" + age + "}"; // 例如有name age字段
}

使用

// 入口函数 Main
public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", 25);
        System.out.println(person.toString());
    }
}

输出: Person{name=“John”, age=25}

equals(Object obj) 地址比较

简单比较两个对象的引用

Object obj1 = new Object();
Object obj2 = obj1;
if (obj1 == obj2) {
    // 两个对象的引用相等
}

判断两个对象的地址是否相等

obj1.equals(obj2);

Objects 类

Objects是一个工具类,提供了很多操作对象的静态方法给我们使用

它与 Object 类有着相同的方法名,功能都是类似的
在这里插入图片描述

Objects.equals(Object obj1, Object obj2) 非空比较

Objects.equals 先做非空判断,再做对象比较
源码解析

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

isNull(Object obj) 判断null

判断对象是否为 null 若为 null 返回 true

nonNull(Object obj) 判断非null

判断对象是否不为 null 若不为 null 返回 true

包装类

基本数据类型对应的包装类列表

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
charCharacter
floatFloat
doubleDouble
booleanBoolean

自动装箱

可以自动把基本类型的数据转换成对象

例如

Integer a1 = 12;

自动拆箱

可以自动把包装类型的对象转换成对应基本数据类型

例如

int a4 = a1;

字符串操作 | StringBuilder,StringBuffer,StringJoiner

StringBuilderStringBufferStringJoiner 都是一些字符串的操作方法,它们有时比 String 更适合做字符串的修改操作,效率也会更高,代码也会更简洁

StringBuilder 字符串操作

StringBuilder 在操作字符串的时候效率非常高(频繁拼接,修改建议使用 StringBuilder )

基本使用

StringBuilder s = new StringBuilder();
StringBuilder s = new StringBuilder("hello");

// 拼接内容
s.append(12);
s.append("hi");
s.append(true);
// 返回内容: “hello12hitrue”

// 支持链式编程
s.append(true).append("haha")

使用 StringBuilder 拼接数组

public static void main(String[] args) {
  System.out.println(getArrayList(new int[] {
      1, 123, 456
  }));
}

// 实现方法
public static String getArrayList(int[] arr) {
    if (arr == null) {
        return null;
    }
	// 实例化字符串操作类 StringBuilder
    StringBuilder sb = new StringBuilder();
    sb.append("[");
    for (int i = 0; i < arr.length; i++) {
      if (i == arr.length - 1) { // 若拼接到最后一个不加 ,
        sb.append(arr[i]);
      } else {
        sb.append(arr[i]).append(",");
      }
  }
  sb.append("]");
  return sb.toString(); // 返回 字符串表现形式
}

StringBuffer 字符串操作

StringBuilder 相似,但是 StringBuilder 是线程不安全的,StringBuffer 是线程安全的

StringJoiner 字符串拼接

StringBuilder 相似,也是用来操作字符串的,也可以看成是一个容器,创建之后里面的内容是可变的
好处: 不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会更简洁

基本使用

StringJoiner s = new StringJoiner(间隔符号);
StringJoiner s = new StringJoiner(间隔符号, 开始符号, 结束符号);

StringJoiner 相对于 StringBuilder 来说还是比较简单, 一般只可以操作简单的字符拼接,如果需要频繁插入,删除字符,建议使用 StringBuilder 操作

StringJoiner s = new StringJoiner(", ");
s.add("java1");
s.add("java2"); 
// java1, java2
// ----------------------------------
StringJoiner s = new StringJoiner(", ", "[", "]");
s.add("java1");
s.add("java2"); 
// [java1, java2]

使用 StringJoiner 拼接

public static void main(String[] args) {
  System.out.println(getArrayData(new int[] {
      1, 2, 3
  }));
}

public static string getArrayData(int[] arr) {
	// 判断 arr 非空
	if (arr == null) {
		return null;
	}
	// arr 数组存在
	StringJoiner sj = new StringJoiner(", ", "[", "]");
	for(int i = 0; i < arr.length; i++) {
		sj.add(arr[i] + "");
	}
	return sj.toString();
}

MathSystemRuntime

Math 数学类

Math 代表数学,是一个工具类,里面提供的都是对数据进行操作的一些静态方法

在这里插入图片描述

System 系统类

  System.currentTimeMillis(); // 获取当前系统的时间(毫秒值) long 类型

在这里插入图片描述

Runtime 运行类

小知识: Runtime 是个单例设计模式的类

简单使用

Runtime r = Runtime.getRuntime(); // 返回与当前Java应用程序关联的运行时对象

在这里插入图片描述

BigDecimal 解决小数失真运算

在一些商业项目中,在进行一些小数运算时,必须要求精准,使用传统运算符时可能会出现小数运算失真的情况

System.out.println(0.2 + 0.1); // 0.30000000000000004

采用 java.util.math 中的 BigDecimal 类 来运算解决失真问题

// 转为 字符串 封装成 BigDecimal 对象来运算
BigDecimal a1 = new BigDecimal(Double.toString(a));
BigDecimal b1 = new BigDecimal(Double.toString(b));
// 优化
// 推荐用以下方式把小数转换为字符串再得到BigDecimal对象来使用(更简洁)
BigDecimal a1 = BiDecimal.valueOf(a);
BigDecimal b1 = BiDecimal.valueOf(b);

BigDecimal b = a1.add(b1);
BigDecimal b = a1.subtract(b1);
BigDecimal b = a1.multiply(b1);
BigDecimal b = a1.divide(b1);

Date 类

before Java 1.8

在 Java 1.8 之前,Date 对象是可变的,所以处理时间类需要谨慎

创建时间对象(部分过时)

Date currentDate = new Date(); // 使用当前日期和时间创建Date对象
Date specificDate = new Date(year, month, day); // 使用指定的年、月、日创建Date对象(过时的)

获取日期和时间(过时的)

int year = date.getYear(); // 获取年份(从1900年开始计算)
int month = date.getMonth(); // 获取月份(从0开始计算,0表示一月)
int day = date.getDate(); // 获取天数(月份中的日期)
int hours = date.getHours(); // 获取小时w
int minutes = date.getMinutes(); // 获取分钟
int seconds = date.getSeconds(); // 获取秒钟

设置日期和时间(过时的)

date.setYear(year); // 设置年份
date.setMonth(month); // 设置月份
date.setDate(day); // 设置天数
date.setHours(hours); // 设置小时
date.setMinutes(minutes); // 设置分钟
date.setSeconds(seconds); // 设置秒钟

格式化和解析时间对象(部分过时)

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 生成规定格式的时间对象(过时的)
String formattedDate = formatter.format(date); // 格式化Date对象为指定格式的字符串
Date parsedDate = formatter.parse("2022-01-01 12:00:00"); // 将字符串解析为Date对象

after Java 1.8


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

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

相关文章

react ant add/change created_at

1.引入ant的 Table import { Table, Space, Button, message } from antd; 2.获得接口的数据的时候增加上创建时间 const response await axios.get(${Config.BASE_URL}/api/v1/calculation_plans?token${getToken()});if (response.data.message ok) {const data respon…

Matlab的信号频谱分析——FFT变换

Matlab的信号频谱分析——FFT变换 Matlab的信号频谱分析 FFT是离散傅立叶变换的快速算法&#xff0c;可以将一个时域信号变换到频域。 有些信号在时域上是很难看出什么特征的。但是如果变换到频域之后&#xff0c;就很容易看出特征了。 这就是很多信号分析采用FFT变换的原因…

灵遨底盘驱动安装

文章目录 ROS Packages灵遨科技ROS包的安装安装ROS依赖包导入lingao_ros包到工作空间工作空间的环境source &#xff08;可选&#xff09; 通讯接口设置ROS Package 基本用法使用测试 ROS Packages lingao_base: 灵遨底盘驱动软件包&#xff0c;用于ROS的底盘通讯收发 lingao_…

C++初阶引用

目录 引用引用的特性使用输出型参数作返回值小总结引用的权限引用和指针 引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 比如周树人&#xff0c;在外…

毕马威加入IBM量子网络,已搭建完成通信行业量子电路!

​ 毕马威全球量子中心主管Bent Dalager&#xff08;图片来源&#xff1a;网络&#xff09; 随着全球企业技术的持续转型&#xff0c;量子计算在开发创新解决方案上越来越重要。为此&#xff0c;毕马威(KPMG)公司加入了IBM量子网络&#xff0c;旨在利用量子计算解决当今最复杂的…

为什么list.sort()比Stream().sorted()更快?

真的更好吗&#xff1f; 先简单写个demo List<Integer> userList new ArrayList<>();Random rand new Random();for (int i 0; i < 10000 ; i) {userList.add(rand.nextInt(1000));}List<Integer> userList2 new ArrayList<>();userList2.add…

Python爬虫遇到重定向问题解决办法汇总

在进行Python爬虫任务时&#xff0c;遇到重定向问题是常见的问题之一。重定向是指在发送请求时&#xff0c;服务器会返回一个新的URL&#xff0c;将请求重新定向到该URL。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决办法&#xff0c;并给出相关的代码示例&…

java linq多字段排序时间比较

public static void main(String[] args) {//100万条数据List<CrmInvestSaleUserCount> waitAssignUserList new ArrayList<>();for (int i 0; i < 1000000; i) {waitAssignUserList.add(new CrmInvestSaleUserCount().setSales_username("test" i…

小孩学python课程需要多久,儿童学python哪个机构好

本篇文章给大家谈谈小孩学python课程需要多久&#xff0c;以及儿童学python语言能做什么&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 学习儿童python编程越来越受欢迎&#xff0c;原因有很多&#xff0c;对于孩子来说&#xff0c;Python是一种很好的编程语…

深入探究DDD领域建模的方法:从概念到实践

目录 &#xff11;.什么是领域建模&#xff1f; &#xff12;.领域驱动设计的基本原则 &#xff13;.领域建模的核心概念 &#xff14;.DDD领域建模方法 &#xff15;.领域建模中的挑战与解决方案 &#xff16;.DDD领域建模的优势和适用场景 &#xff17;.DDD领域建模的…

【枚举+01 trie树】CF1658 D2

Problem - D2 - Codeforces 题意&#xff1a; 给定一个区间[l, r]和r - l 1个数&#xff0c;问是否存在一个数 x &#xff0c;使得这些数异或上 x 之后为[l, r]的一个排列 思路&#xff1a; 这种有关一个集合和异或操作的&#xff0c;都可以试试字典树 我们将所有数插入到…

C++ 左值和右值

C 左值和右值 左值、右值左值引用、右值引用std::move()std::move()的实现引用折叠 完美转发forward()的实现函数返回值是左值还是右值如何判断一个值是左值还是右值 左值、右值 在C11中所有的值必属于左值、右值两者之一&#xff0c;右值又可以细分为纯右值、将亡值。在C11中…

Python实现蚁群优化算法,求解旅行商问题

文章目录 蚁群算法蚂蚁的基本变量蚂蚁的优化流程蚁群优化验证与可视化 蚁群算法 蚁群算法是Colori A等人在1991年提出的&#xff0c;通过模仿蚂蚁觅食行为&#xff0c;抽象出信息素这一奖惩机制&#xff0c;从而赋予蚂蚁智能Agent的身份&#xff0c;使之得以在最佳路线问题中大…

Windows环境下Node.js二进制版安装教程

文章目录 前言一 下载Node.js二 设置环境变量三 配置全局安装和缓存路径四 设置仓库 前言 新版的Node.js已自带npm&#xff0c;就在Node.js下载完成解压后的文件内&#xff0c;的node_modules包中。 npm的作用&#xff1a;是对Node.js依赖的包进行管理&#xff0c;类似maven。…

使用 CausalPy 进行因果推理

这篇文章通过一个实际的例子简要介绍了因果推理&#xff0c;这个例子来自于《The Brave and True》一书&#xff0c;我们使用 CausalPy 来实现。 因果推理是从观察数据中估计因果效应的过程。对于任何给定的个体&#xff0c;我们只能观察到一种结果。另一种结果对我们来说是隐藏…

蓝牙ble tips2-UUID GATT(service和CHARACTERISTIC) profile相关概念介绍

服务和特性 低功耗蓝牙设备之间通信&#xff0c;都是基于服务和特性。一个蓝牙设备中可以包含若干个服务&#xff0c;一个服务中可以包含若干个特性&#xff0c;每一个服务或者特性都要有一个UUID。蓝牙的数据交互都是基于一个个特性进行的&#xff0c;数据交互的方式有五种&a…

超全面的高精度行星减速机结构、原理、功能以及优势解析

行星减速机是运动控制系统中连接伺服电机和应用负载的一种机械传动组件&#xff0c;具有高减速比、良好的传动特性、结构紧凑、体积小、重量轻、可靠性高、低噪音等优点&#xff0c;广泛用于电机、汽车、机器人及各种工业机械中&#xff0c;以实现高效率和稳定性。 一、什么是…

Ubuntu20.04安装ROS Noetic 版本安装记录

用的是VMWare的20.04的Ubuntu虚拟机&#xff0c;打算安装一下Noetic 版本的ROS学习一下。B站有个视频可以参考一下&#xff1a;在Ubuntu20.04上安装ROS机器人操作系统-Noetic但是基本也是参考中文文档安装&#xff0c;步骤相比网上的教程更权威Ubuntu install of ROS Noetic&am…

LeetCode--HOT100题(20)

目录 题目描述&#xff1a;48. 旋转图像&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;48. 旋转图像&#xff08;中等&#xff09; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#x…

echarts图表渐变色 + 每个柱子不同颜色设置

echarts柱状图&#xff0c;默认所有柱子都是同一个颜色&#xff0c;显示效果差强人意&#xff0c;本文介绍如果修改成为每个柱子添加不同的颜色&#xff0c;以及如何添加渐变色&#xff0c;丰富图表的显示鲜果。先看效果&#xff1a; 每个柱子颜色不同 每个柱子都有自己的渐变…