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

在这里插入图片描述

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

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

过年写
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
很高兴扮演ChitGPT,接下来我将为您提供有关如何使用Java调用百度云API查询域名到期时间的详细说明。 首先,您需要申请一个百度云账号并在控制台中创建一个新的应用程序,然后在应用程序中启用“域名API”服务。接着,您需要获取您的Access Key和Secret Key,这将用于与百度云API进行身份验证和授权。 在获得这些凭证之后,您可以使用Java中的HttpClient类来向百度API发送GET请求并获取JSON响应。以下为示例代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class DomainExpirationQuery { private static final String API_URL = "https://domainapi.baidu.com/api/v3/domain/expiredate"; public static void main(String[] args) { String domainName = "example.com"; String accessKeyId = "yourAccessKeyId"; String secretKey = "yourSecretKey"; try { URL url = new URL(API_URL + "?apikey=" + accessKeyId + "&domain=" + domainName); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("User-Agent", "Mozilla/5.0"); conn.setRequestProperty("X-bce-date", "20220101T010101Z"); String auth = AuthUtils.generateAuthorization(accessKeyId, secretKey, "GET", url.toString(), null, conn.getRequestProperty("X-bce-date")); conn.setRequestProperty("Authorization", auth); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println(response.toString()); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); } } } ``` 在上面的示例代码中,您需要将“example.com”替换为您要查询到期时间的域名,将“yourAccessKeyId”和“yourSecretKey”替换为您的百度云凭证。 请注意,您还需要在AuthUtils类中实现generateAuthorization方法以生成用于身份验证的Authorization头。这需要使用HMAC-SHA256算法和UTF-8字符集生成签名,并对其进行Base64编码。以下为示例代码: ```java import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.SimpleTimeZone; public class AuthUtils { private static final String BCE_AUTH_VERSION = "bce-auth-v1"; private static final String BCE_DATE_FORMAT = "yyyyMMdd'T'HHmmss'Z'"; private static final String BCE_TIME_ZONE = "UTC"; public static String generateAuthorization(String accessKeyId, String secretAccessKey, String httpMethod, String uri, String params, String timestamp) { try { String authString = BCE_AUTH_VERSION + "/" + accessKeyId + "/" + getFormattedTimestamp(timestamp) + "/1800"; String httpHeaders = ""; String httpQuery = (params != null && !params.isEmpty()) ? "?" + params : ""; String signingKey = generateSigningKey(secretAccessKey, getFormattedTimestamp(timestamp), "bce/auth/v1"); String auth = generateAuthString(authString, httpMethod.toUpperCase(), uri, httpQuery, httpHeaders, timestamp, signingKey); return auth; } catch (Exception e) { throw new RuntimeException("Unable to generate authorization signature", e); } } private static String generateAuthString(String authString, String httpMethod, String uri, String httpQuery, String httpHeaders, String timestamp, String signingKey) throws NoSuchAlgorithmException { String canonicalRequest = httpMethod + "\n" + uri + httpQuery + "\n" + httpQuery + "\n" + httpHeaders + "\n\n" + "content-md5;content-type\n" + timestamp + "\n" + "x-bce-date:" + timestamp + "\n\n" + "content-md5;content-type;x-bce-date\n" + "UNSIGNED-PAYLOAD"; String signing = hmacSha256(signingKey, canonicalRequest); String auth = authString + "/" + "host" + "/" + signing; return auth; } private static String hmacSha256(String secret, String message) { try { byte[] key = secret.getBytes(StandardCharsets.UTF_8); SecretKeySpec secretKeySpec = new SecretKeySpec(key, "HmacSHA256"); Mac mac = Mac.getInstance("HmacSHA256"); mac.init(secretKeySpec); byte[] messageBytes = message.getBytes("UTF-8"); byte[] result = mac.doFinal(messageBytes); return Base64.encodeBase64String(result); } catch (Exception e) { throw new RuntimeException("Unable to calculate a request signature: " + e.getMessage(), e); } } private static String generateSigningKey(String secretAccessKey, String dateStamp, String regionName) throws Exception { byte[] kSecret = ("Baidu" + secretAccessKey).getBytes(StandardCharsets.UTF_8); byte[] kDate = hmacSha256("Baidu" + dateStamp, kSecret).getBytes(StandardCharsets.UTF_8); byte[] kRegion = hmacSha256(regionName, kDate).getBytes(StandardCharsets.UTF_8); byte[] kService = hmacSha256("bce/auth/v1", kRegion).getBytes(StandardCharsets.UTF_8); byte[] kSigning = hmacSha256("bce/auth/v1", kService).getBytes(StandardCharsets.UTF_8); return Base64.encodeBase64String(kSigning); } private static String getFormattedTimestamp(String timestamp) { SimpleDateFormat sdf = new SimpleDateFormat(BCE_DATE_FORMAT, Locale.US); sdf.setTimeZone(new SimpleTimeZone(0, BCE_TIME_ZONE)); if (timestamp == null) { return sdf.format(new Date()); } Calendar cd = Calendar.getInstance(); try { Date date = sdf.parse(timestamp); cd.setTime(date); } catch (Throwable ignored) { } return sdf.format(cd.getTime()); } } ``` 最后,代码将输出响应的JSON字符串,其中包含查询到域名到期日期的信息。 希望这个例子能帮助您理解如何使用Java调用百度云API来查询域名到期时间

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那云散了

你真是个富哥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值