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);
}
StringBuilder
和StringBuffer
功能相同
-
区别
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
- 字符串转为
Date
:parse()
//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.HOUR
12小时制的小时Calendar.HOUR_OF_DAY
24小时制的小时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);