Java基础-常用类

发布于 2024年07月28日

Object类

概述

Object 是所有类的直接或间接父类,位于继承树的最顶层,任何类,如果没有明确书写extends继承某个类,都默认直接继承Object类,否则,为间接继承。

Object类中所定义的方法,是所有对象都具备的方法。

Object类可以cun存储任何对象。

  • 作为参数,可以接收任何对象;
  • 作为返回值,可以返回任何对象;

常用方法

toString方法

方法定义:public String toString

返回一个对象的字符串表示形式;

调用System.out.println() ,会自动调用对象的toString()方法,打印出引用所指的对象的toString()方法的返回值;

每个类都会直接或间接此方法,可以根据需求重写该方法。

//重写toString方法
public class ToStringTest{
    public String name = "hello";
    @Override
    public String toString(){
        return this.name;
    }
}

equals方法

== 运算符:

  • 判断两个基本数据类型的值是否相同
  • 判断两个引用数据类型的引用是否为同一个对象(地址是否相同)

equals方法在未被重写的情况下,继承的是Object类的toString方法,等价于==

public class EqualsTest{
    public static void main(){
        //判断基本数据类型
        int a = 10;
        int b = 11;
        System.out.println(a == b);
        
        //判断引用数据类型
        TestClass tc1 = new TestClass();
        TestClass tc2 = new TestClass();
        
        System.out.println(tc1 == tc2);
        System.out.println(tc1.eauqls(tc2));

    }
}

当equals方法无法满足我们的需求时,我们可以通过重写equals方法来完成判断

//重写TestClass类
public class TestClass{
    private String name;
    private int age;
    @Overried
    public boolean equals(Object obj){
        if(this == obj){return true}
        if(!(obj instanceof TestClass){return false}
        TestClass tc = (TestClass) obj;
        return this.age == obj.getAge() && this.name.equals(obj.getName());
    }
    //Getter
    public String getName(){
        return this.name;
    }
    public int getAge(){
        return this.age;
    }
    //Setter .... 
}

HashCode方法

定义:public int hashCode()

这个方法返回对象的十进制的哈希值。哈希值是通过哈希算法根据对象的地址计算出来的int类型的数组。

Object类的hashCode()方法为不同的对象返回不同的值,Object类的hashCode值我们可以认为其表示对象的地址。

如果equals()判断两个对象相等,那么它们的hashCode()方法应该返回同样的值。

包装类

使用情景:

当一个方法的传入参数数据类型为引用数据类型时,我们的基本数据类型无法传入,为了传入基本数据类型,需要再重载八个基本数据类型参数的方法进行接收。

这样会让代码冗余变高,Java为了解决提供了八种数据类型的包装类。(位于lang包)

八大基本数据类型对应的包装类

  • short --> Short
  • byte --> Byte
  • int --> Integer
  • long --> Long
  • float --> Float
  • double --> Double
  • char --> Character

基本数据类型和包装类转换(装箱与拆箱)

装箱:基本数据类型转换为包装类

拆箱:包装类转换为基本数据类型

手动装箱/拆箱

//装箱
int a = 10;
Integer it = Integer.valueOf(a);
System.out.println(it);

//拆箱
Integer b = Integer.valueOf(10);
int b1 = b.intValue();
System.out.println(b1);

自动装箱/拆箱

//装箱
Integer it = 10;

//拆箱
int b = it;

基本数据类型和字符串的转换

//字符串转换为基本数据类型
String i1 = "111";
int a = Integer.parseInt();

//基本数据类型转换为字符串
//方式1:
int b = 10;
String c = "" + b;
//方式2:
String d = String.valueOf(b);

包装类和字符串转换

//包装类转换为字符串
//方式1:
Integer i1 = 10;
String t1 = i1.toString();
//方式2:
String t2 = “” + i;

//字符串转换为包装类
String t3 = "111";
Integer i2 = Integer.valueOf(t3);


String类

创建

常见的创建方式

String str1 = "XZRO";
String str2 = new String("Hello");

常用方法

判断功能

  • boolean equals(Object obj)
  • boolean equalsIgnoreCase(String str)
  • boolean contains(String str)
  • boolean startsWith(String str)
  • boolean endsWith(String str)
  • boolean isEmpty

获取功能

  • int length()
  • char charAt(int index)
  • int indexOf(int ch)
  • int indexOf(String str)
  • int indexOf(int ch, int fromIndex)
  • int indexOf(String str, int fromIndex)
  • String subString(int start)
  • String subString(int start, int end)

转换功能

  • byte[] getByte()
  • char[] toCharArray()
  • static String valueOf(char[] chs)
  • static String valueOf(int i)
  • String toLowerCase()
  • String toUpperCase()
  • String concat(String str)

替换功能

  • String replace(char old, char new)
  • String replace(String old, String new)

去空格功能

  • rein()

按字典比较

  • int compareTo(String str)
  • int compareToIgnoreCase(String str)

关于字符串不可变的理解

字符串放在常量池中吗,相同的字符串再常量池中只有一份。

public class StringTest{
    
    String str1 = "XZRO";
    String str2 = new String("XZRO");
    String str3 = "XZRO";
    
    System.out.println(str1 == str2); //false
    System.out.println(str1 == str3); //true
    
    //编译器进行优化,编译阶段就能计算出结果
    String str4 = "XZ" + "RO";
    System.out.println(str1 == str4);
    
    String str5 = "XZ";
    String str6 = "RO";
    String str7 = str5 + str6;
    String Str8 = str5 + "RO";
    System.out.println(str1 == str7);
    System.out.println(str1 == str8);
    
}

可变字符串

StringBuffer

优势:解决了String用字符串做拼接,既费时又耗内存的问题。

字符串缓冲区,用于存储可变字符串的容器。

特点:

  • 可以对字符串进行修改
  • 长度可变
public class SringBufferTest{
    StringBuffer stb = new StringBuffer("XZRO");
    //拼接
    stb.append("666");
    stb.append("$$$$");
 	//转换为String   
    String str = stb.toString();
    System.out.println(str);
}

StringBuilderStringBuffer功能相同

  • 区别

    • StringBuffer是线程同步的,线程安全。通过用于多线程。
    • StringBuilder是线程不同步的,线程不安全。通常用于单线程。但是提高了处理可变字符串对象的效率

    数学类相关

    Math类(java.lang)

    常量:

    • PI圆周率
    • E

    常用方法:random()

    //生成随机数(0-1)
    System.out.println(Math.random());
    //生成1-10的随机数
    System.out.println((int)(Math.random()*10) + 1);
    //生成1-4的随机数
    System.out.println((int)((Math.random()*10)%4+1)
    

    Random类(java.util)

    生成随机数,可以设置随机数种子,让随机结果固定,可以设置区间,生成区间内的数值

    //不设置种子
    Random r = new Random();
    //生成设置1-5的随机数
    System.out.println(r.nextInt(1,5));
    
    //设置随机数种子
    Random r1 = new Random(111);
    //每次执行
    for(int i = 0; i<=10; i++){
        System.out.println(r.nextInt());
    }
    

BigDecimal类(java.lang)

常用方法

**作用:**可以精确计算浮点数

**创建:**直接new BigDecimal( ),可以传入基本数据类型和字符串

常用方法:

  • add(BigDecimal augend)
  • subtract(BigDecimal subtrahend)
  • multiply(BigDecimal nultiplicand)
  • divide(BigDecimal divisor)
class BigDecimalTest{
	public static void main(String[] args){
	BigDecimal num1 = new BigDecimal(10);
	BigDecimal num2 = new BigDecimal(3);
	
	System.out.println(num1.add(num2));
	System.out.println(num1.subtract(num2));
	System.out.println(num1.multiply(num2));
	System.out.println(num1.divide(num2));
	}
}

BigDecimal转换为基本数据类型

使用:

  • xxxValue()正常返回指定基本数据类型的值
  • xxxValueExact()精确转换基本数据类型的值,当转换时出现精度损失时会报出异常:ArithmeticException
BigDecimal b = Bigdecimal(10.1);

//出现损失,但不影响转换
byte b1 = b.byteValue();
//出现损失,报出异常
byte b2 = b.byteValueExact();



日期时间相关类

Date

表示特定的时间,精确到毫秒,现在已过时,不推荐使用

创建:

  • new Date() 创建当前时间

  • new Date(Long date)使用时间戳创建指定日期(从1970-1-1 00:00:00 到现在的毫秒值)

常用方法:

  • boolean adfter(Date anotherTime)测试此日期是否在指定日期之后
  • boolean before(Date anotherTime)测试此日期是否在指定日期之前
  • compareTo(Date anotherTime)比较两个时间的顺序,此日期大于指定日期返回正值,等于 0,小于为负值
  • long getTime()获取时间戳
  • void setTime(long time)设置时间
  • toString()默认实现是把此Date对象转换为以下形式的字符串dow mon dd hh:mm:ss zzz yyyy

SimpleDateFormat

以指定格式输出日期和时间

Date类型与字符串转换

  • Date转换为字符串:format
  • 字符串转为Dateparse()
//Date转换为字符串
//创建SimpleDateFormat对象
SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//创建Date对象获取当前时间
Date d1 = new Date();
String s1 = s1.format(d1);
System.out.println(s1);

//字符串转换为Date
Date d2 = s1.parse(s1);
System.out.println(d2);

Calendar

概述

获取当前日期中年月日的时间

获取Calendat对象:

Calendar.getInstance()

常用静态常量:

  • Calendar.YEAR代表年
  • Calendar.MONTH代表月,从0开始
  • Calendar.Date日期
  • Calendar.DAY_OF_MONTH日期,和Calendar.Date完全相同
  • Calendar.HOUR12小时制的小时
  • Calendar.HOUR_OF_DAY24小时制的小时
  • Calendar.MINUTE分钟
  • Calendar.SECOUND
  • Calendar.DAY_OF_WEEK星期几(1-7,1代表周日)

常用方法:

  • get()
  • set()

JDK8中新的日期时间API

LocalDateTime

常用方法:

  • now()/now(ZoneId zone)获取当前时间/获取指定时区的时间
  • of()根据指定的日期时间创建对象
  • getDayOfWeek()/getDayOfMonth()/getDayOfYear获取星期几/获取当月的第几天/获取今年的第几天
  • getMonth()获取当前月份,返回一个枚举值
  • withDayOfMonth()/withDayOfYear()/whitMonth()/withYear()修改日期
  • plusDays()/plusWeeks()/plusMonths()/plusYears()/plusHours()增加日期
  • minusMonths()/minusWeeks()/minusDays()/minusYears()/minusHours()减去日期

(重点)日期与字符串的转换

DateTimeFormatter

  • 预定义的格式标准
  • 自定义的格式
  • 本地化的格式
//通过 LocalDateTime 互相转换
//LocalDateTime --> 字符串
//创建当前时间
LocalDateTime l1 = LocalDateTime.now();
//创建LocalDateFormat
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String s1 = l1.format(dtf1);
System.out.println(s1);

//字符串 --> LocalDateTime
LocalDateTime l2 = LocalDateTime.parse("2024-11-11 11:11:11",dtf1);
System.out.println(l2);

//通过 DateTimeFormatter 互相转换
//LocalDateTime --> 字符串
LocalDateTime l3 = LocalDateTime.now();
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String s2 = dtf2.format(l3);
System.out.println(s2);

//字符串 --> LocalDateTime
//创建DateTimeFormatter
DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
TemporalAccessor tma = dtf3.parse("2024-11-11 11:11:11");
LocalDateTime l4 = LocalDateTime.from(tma);
System.out.println(l4);



评论