Java基础_常见类

本文详细介绍了Java中的核心概念,包括Object类的toString()和equals()方法,包装类如Integer,日期API的发展历程(包括Date、Calendar和JDK8的Local*类),金额操作涉及的BigDecimal和JavaMoney,以及Stream和Optional等现代特性。此外,还提到了File和URL/URI在Java中的应用。
摘要由CSDN通过智能技术生成

1、Object类

Object类是所有Java类的父类。在类的生命中未显示地指明继承Object类,则默认继承Object类。

a、toString()方法

原理:全限定路径 + @ + 十六进制哈希值对象在堆中地址进行哈希处理,获取哈希值,转十六进制

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

【备注】:一般会重写toString()方法,以便观察对象中的属性。

// 以自定义Person类为例,重写toString方法:
// Person: 
// -name:String
// -age:int
// -gender:int
@Override
public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", gender=" + gender +
            '}';
}

b、equals()方法

原理:使用==进行判断。比较的是对象引用值。

// Object类中原始equals:
public boolean equals(Object obj) {
        return (this == obj);
    }

重写了 equals() 方法,就应该同时重写 hashCode() 方法。

String、Date、File、包装类等已经重写了equals方法。主要是为了能够比较内容是否一致。

// IDE生成equals、hashCode
 @Override
    public boolean equals(Object o) {
        if (this == o) return true;// 判断引用是否一致
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && gender == person.gender && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, gender);
    }

2、包装类

包装类相对于基本数据类型而言,就是一个数据,加上一些属性、方法、构造器。

包装类中,Byte、Short、Integer、Long,Float、Double直接父类是java.lang.Number,Character、Boolean直接父类是Object类。

Integer

实现接口:Comparable<Integer>ConstableConstantDesc【sealed interface】;final修饰。

自动拆箱、自动装箱JDK 1.5】:

// 自动装箱
Integer i = 1;// Integer.valueOf(1)
//自动拆箱
int num = i2;// i2.intValue()

valueOf(int i):

// valueOf(int i)
public static Integer valueOf(int i) {
		// 判定传入int数据是否在IntegerCache中,在,直接返回相应的对象;否则,新创建一个对象。
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}

// 内部类:IntegerCache
private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer[] cache;//存储Integer对象
        static Integer[] archivedCache;

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    h = Math.max(parseInt(integerCacheHighPropValue), 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(h, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            // Load IntegerCache.archivedCache from archive, if possible
            CDS.initializeFromArchive(IntegerCache.class);
            int size = (high - low) + 1;

            // Use the archived cache if it exists and is large enough
            if (archivedCache == null || size > archivedCache.length) {
                Integer[] c = new Integer[size];
                int j = low;
                for(int i = 0; i < c.length; i++) {
                    c[i] = new Integer(j++);
                }
                archivedCache = c;
            }
            cache = archivedCache;
            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }
}

3、日期相关类

  • 第一批日期时间API :JDK1.0中使用java.util.Date类
  • 第二批日期时间API :JDK1.1引入Calendar类

缺陷:
(1) 可变性 : 像日期和时间这样的类应该是不可变的;
(2) 偏移性 : Date中 的年份是从1900开始的,而月份都从0开始;
(3) 格式化 : 格式化只对Date有用,Calendar则不行。

  • 第三批日期时间API:JDK1.8新增日期时间API

(1)JDK8之前

a. Date

在JDK17中,存在大量方法已经处于废弃状态。

构造器未过期:空参、以long类型为参数

//过期方法:
toGMTString()toLocaleString()

getYear()getMonth()getDate()getDay()getHours()getMinutes()getSeconds()getTimezoneOffset()
以及上述对应的setXxx()方法

UTC()

(1)获取时间差

//返回从 1970年1月1日00:00:00GMT以来此Date对象表示的毫秒数
new Date().getTime();

//本地方法。静态方法,可以用于衡量算法执行时间
System.currentTimeMillis();
//例如:
long start = System.currentTimeMillis();
method();
long end = System.currentTimeMillis();
System.out.println(end - start);

区分:java.util.Datejava.sql.Date

  • java.sql.Date继承自java.uti.Date
  • java.util.Datejava.sql.DateString相互转换:

b. java.text.SimpleDateFormat

  在进行Stringjava.sql.Date转换过程中,String格式只能是年-月-日拼接的形式。否则,出现异常:IllegalArgumentException
在这里插入图片描述
  使用SimpleDateFormat解决:

  • SimpleDateFormat继承自DateFormat
  • 使用:
//格式标准
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

//String-> Date:parse
try {
    Date d = simpleDateFormat.parse("2024-4-7 22:14:28");
} catch (ParseException e) {
    e.printStackTrace();
}
//Date-> String:format
String format = simpleDateFormat.format(new Date());

c. Calendar

  • 抽象类:不能直接创建对象
    • 创建子类对象:GregorianCalendar
    • 静态方法:getInstance()
  • 一些get、set方法:
calendar.get(Calendar.YEAR);
calendar.get(Calendar.MONTH);
calendar.get(Calendar.DATE);
calendar.get(Calendar.DAY_OF_WEEK);
//获取当月日期的最大天数
calendar.getActualMaximum(Calendar.DATE);
//获取当月日期的最小天数
calendar.getActualMinimum(Calendar.DATE);

calendar.set(Calendar.YEAR, 1900);
calendar.set(Calendar.MONTH, 3);
calendar.set(Calendar.DATE, 16);
  • String、Calendar、java.sql.Date转换:
/*
 String -> Calendar:
 	String -> java.sql.Date
 	java.sql.Date -> Calendar
*/
java.sql.Date date = java.sql.Date.valueOf("2024-4-7");
calendar.setTime(date);

(2)JDK8

a. LocalDate、LocalTime、LocalDateTime

(1)now():获取当前日期、时间、日期+时间

LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();

(2)of():设置指定日期、时间、日期+时间

LocalDate localDate1 = LocalDate.of(2024, 1, 1);
LocalTime localTime1 = LocalTime.of(12, 11, 12);
LocalDateTime localDateTime1 = LocalDateTime.of(1890, 12, 23, 13, 24, 15);

(3)getXxx():获取信息;withXxx()设置

localDateTime.getYear());//2024
localDateTime.getMonth());//APRIL
localDateTime.getMonthValue());//4
localDateTime.getDayOfYear());//98
localDateTime.getDayOfMonth());//7
localDateTime.getDayOfWeek());//SUNDAY
localDateTime.getHour());//23
localDateTime.getMinute());//15
localDateTime.getSecond());//11

//修改重新返回一个LocalDateTime对象,方法的调用者本身没有改变。
//而在Calendar中,修改会改变调用者本身
LocalDateTime localDateTime2 = localDateTime.withMonth(8);
System.out.println(localDateTime);//2024-04-07T23:20:29.482425500
System.out.println(localDateTime2);//2024-08-07T23:20:29.482425500

(4)加减操作:同样不会修改调用者本身

LocalDateTime localDateTime3 = localDateTime.plusMonths(4);
LocalDateTime localDateTime4 = localDateTime.minusMonths(1);

b. DateTimeFormatter

I. 获取DateTimeFormatter对象

(1)预定义的标准格式:
ISO_LOCAL_DATE_TIME
ISO_LOCAL_DATE
ISO_LOCAL_TIME

DateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

(2)本地化相关的格式。
例如:pflocalizedDateTime()。
参数:

  • FormatStyle.LONG:2024年4月7日 下午23点20分42秒
  • FormatStyle.MEDIUM :2024-4-7 23:20:42
  • FormatStyle.SHORT:24-4-7 下午11:21
DateTimeFormatter df2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);

(3)自定义格式
例如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");

II. 使用

// LocalDateTime extends Temporal
// Temporal extends TemporalAccessor

//LocalDateTime->String: format
//format参数:TemporalAccessor类型
String str = df1.format(LocalDateTime.now());

//String->LocalDateTime: parse
TemporalAccessor parse = df1.parse("2024-04-07T23:20:29");

c. Period、Duration; Instant

4、String、StringBuffer、StringBuilder

a. String

  • "abc"是String类的一个具体对象,存放在字符串常量池中。
  • 不可变
  • final类:不可被继承,不会有子类
  • 底层:
    • JDK9之前:char数组
    • JDK9及以后:byte数组 + coder【byte】=>【减少内存空间开支】
  • 常见方法:
    • 构造器:String()、String(“xxx”)、String(char[])、String(byte[])
    • 长度:lenght();判空:isEmpty();下标对应字符charAt()
    • 相等:equals()【Object类】
    • 比较大小:compareTo()【Comparable接口】
    • 截取:subString();拼接:concat()
    • 字符替换:replace()
    • 含有特定字符的字符串分裂成数组:split()
    • 大小写转换:toUpperCase()、toLowerCase()
    • 去除结尾空格:trim()
    • toString()、其他基本类型转换成String:String.valueOf(false)
  • 创建对象:
    • 字符串直接赋值/字面量拼接:
      字符串拼接在赋值:
      • 进行简单的字符串字面常量拼接:String str = "ab"+"c";
        会被编译器优化成拼接结果,直接赋值。
        此时,会去常量池中取。第一次没有的话,会放入常量池。
      • 变量参与拼接:`String a = “ab”; String b = a + “c”;
        • JDK 8:使用StringBuilder进行拼接,还原String
          JDK8 String拼接
        • JDK 17:直接进行字符串拼接
          在这里插入图片描述
    • new创建对象:String str = new String("abc");
      会在上开辟空间创建对象,然后引用到常量池中的字符串。

b. StringBuilder、StringBuffer

  • 相同点:
    • 可变字符串
    • 都继承自AbstractStringBuilder
    • JDK9之后:都改为使用byte[] + byte,之前使用char[]
    • 空参构造器:初始会对value数组初始化,长度为16;传入String对象作为参数的构造器:会初始化一个长度为传入字符串长度+16的数组【JDK9之后会根据编码调整】
    • 常用方法:append、insert、reverse、setCharAt、setLength;转成String:toString
  • 不同点:
    • StringBuilder是JDK1.5新增的
    • StringBuffer线程安全、StringBuilder线程不安全,性能略高

5、Math、Random; 金额操作(BigDecimal、Concurrency、Java Money)

a. Math

  • final类:不能被继承;
  • 构造器私有化:不能创建Math类对象;
  • 内部所有属性、方法都被static修饰:无需创建对象,直接使用类名获取。
    • 常用属性:PI【圆周率】
    • 常用方法:
      • 随机数:random()【返回 [0.0,1.0) 的一个double类型的伪随机数】
        Math.random()调用轨迹
      • 绝对值:abs()
      • 近似:
        • 向上取整【天花板数】:ceil()
        • 向下取整【地板数】:floor()
        • 四舍五入:round()
      • 最值:
        • 最大值:max()
        • 最小值:min()
  • 静态导入:静态导入后,可以直接用属性/方法名访问静态属性和方法。目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序。但是,滥用静态导入会使程序更难阅读,更难维护。

b. Random

Math.random()中已有提及。

c. 金额操作

JAVA中如何处理金额类数据
java.util工具类之Currency类
JavaMoney规范(JSR 354)与对应实现解读

6、Stream、Optional

在这里插入图片描述
在这里插入图片描述

7、File

Java中操作文件系统中的文件/目录,使用java.io.File,是文件/目录的路径名的抽象表示。不能获取到文件/目录中的内容。所以要使用到IO流的相关内容

绝对路径、相对路径

8、URL_URI

URI(uniform resource identifier,统一资源标识符),用来唯一的标识一个资源。
在这里插入图片描述

URL(Uniform Resource Locator,统一资源定位符),是互联网上用来标识某一处资源的地址,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
在这里插入图片描述

引用:

(1)Java中重写了equals()和toString()方法的类有哪些

(2)JAVA中如何处理金额类数据

(3)java.util工具类之Currency类

(4)JavaMoney规范(JSR 354)与对应实现解读

(5)【Java】静态导入import static

(6)HTTP协议、URL、URI、请求响应—讲解很详细

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值