java常用类
1、内部类
- 内部类分类
2、Object类
2.1 Object概述
- 超类、基类,所有类的直接或间接父类,位于继承树的最顶层
- 任何类。如果没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承
- Object类中所定义的方法,是所有对象都具备的方法
- Objecte类型可以存储任何对象
1.作为参数,可接受任何对象
2.作为返回值,可返回任何对象
2.2 Object类常用方法
1. getClass()方法
- 返回引用中存储的实际对象类型
- 通常用于判断两个引用中实际存储对象类型是否一致
普通Student类
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类
public class Test {
public static void main(String[] args) {
Student s1 = new Student("a",18);
Student s2 = new Student("b",20);
//判断s1和s2是不是同一个类型
Class class1 = s1.getClass();
Class class2 = s2.getClass();
if(class1==class2){
System.out.println("s1和s2属于同一个类型");
}else {
System.out.println("s1和s2不属于同一个类型");
}
}
}
运行结果
2. hashCode()方法
- 返回对象的哈希码值
- 哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值
- 一般情况下相同对象返回相同的哈希码
//hashCode
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
Student s3 = s1;
System.out.println(s3.hashCode());
3. toString()方法
- 返回该对象的字符串表示
- 可以根据程序需求覆盖该方法,如:展示对象的各个属性值
//toString
System.out.println(s1.toString());
System.out.println(s2.toString());
没有重写toString方法之前
重写过后
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
4. equals()方法
- 默认实现为(this == obj),比较两个对象地址是否相同
- 可进行覆盖,比较两个对象的内容是否相同
//equals
System.out.println(s1.equals(s2));//false
Student s4 = new Student("s",18);
Student s5 = new Student("s",18);
//为什么值相同但是地址不同呢?
System.out.println(s4.equals(s5));//false
- equals()方法覆盖步骤
1.比较两个引用是否指向同一个对象
2.判断obj是否为null
3.判断两个引用指向的实际对象类型是否一致
4.强制类型转换
5.依次比较各个属性值是否相同
@Override
public boolean equals(Object obj){
//1.比较两个引用是否指向同一个对象
if(this == obj){
return true;
}
//2.判断obj是否为null
if(obj == null){
return false;
}
//3.判断两个引用指向的实际对象类型是否一致
// if(this.getClass() == obj.getClass()){}
if(obj instanceof Student){
//4.强制类型转换
Student s = (Student) obj;
//5.依次比较各个属性值是否相同
if(this.name.equals(s.getName())&&this.age == s.getAge()){
return true;
}
}
return false;
}
重写后
//equals
System.out.println(s1.equals(s2));//false
Student s4 = new Student("s",18);
Student s5 = new Student("s",18);
System.out.println(s4.equals(s5));//true
5. finalize()方法
- 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列
- 垃圾对象:没有有效引用指向此对象时,为垃圾对象
- 垃圾回收:由GC销毁垃圾对象,释放数据存储空间
- 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象
- 手动回收机制:使用System.gc();通知JVM执行垃圾回收
重写该方法
@Override
protected void finalize() throws Throwable {
System.out.println(this.name+"对象被回收了");
}
//finalize
new Student("a",18);
new Student("b",20);
System.gc();
System.out.println("回收垃圾");
3、包装类
3.1 什么是包装类
- 基本数据类型所对应的引用数据类型
- Object可统一所有数据,包装类的默认值是null
3.2 类型转换与装箱、拆箱
- 装箱:基本类型转换为引用类型
- 拆箱:引用类型转换为基本类型
- java中,基本数据类型存放在栈中,引用类型存放在堆中
- 8种包装器提供不同类型间转换方式:
Number父类中提供的6个共性方法
valueOf()静态方法
public static void main(String[] args) {
//JDK 1.5之前语法----------
//装箱
int num1 = 18;//基本类型
//Integer引用类型
Integer integer1 = new Integer(num1);
Integer integer2 = Integer.valueOf(num1);
System.out.println(integer1);
System.out.println(integer2);
//拆箱
Integer integer3 = new Integer(100);//Integer引用类型
int num2 = integer3.intValue();
System.out.println(num2);
//JDK 1.5之后,提供自动装箱和拆箱
//自动装箱
int age = 30;
Integer integer4 = age;
System.out.println(integer4);
//自动拆箱
int age2 = integer4;
System.out.println(age2);
}
- parseXXX()静态方法
//基本类型和字符串之间转换
//1.基本类型转成字符串
int n1 = 255;
//使用+号
String s1 = n1+"";
//使用Integer中的toString方法
String s2 = Integer.toString(n1);
String s3 = Integer.toString(n1,16);//16进制转换
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
//2.字符串转成基本类型
String str = "150";
//使用Integer.parseXXX方法
int n2 = Integer.parseInt(str);
System.out.println(n2);
//3.boolean字符串形式转为基本类型
String str2 = "true";
boolean b1 = Boolean.parseBoolean(str2);
System.out.println(str2);//true
3.3 Integer缓冲区
//经典面试题
public static void main(String[] args) {
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1==integer2);//false
Integer integer3 = Integer.valueOf(100);
Integer integer4 = 100;
System.out.println(integer3==integer4);//true
Integer integer5 = 200;
Integer integer6 = 200;
System.out.println(integer5==integer6);//false
}
为什么会出现这种情况?
1.valueOf()方法缓冲区的范围是127 ~ -128
2.当数值在此范围内,java中自动创建出基本类型;当数值不在此范围中时,java便以new Integer()形式创建数据,实际为引用类型
4、String类
4.1 String概述
- 字符串是常量,创建之后不可改变
- 字符串字面值存储在字符串池中,可以共享
public static void main(String[] args) {
String name = "hello";//存储在字符串池中
//修改了name,并不是将hello修改了,而是栈中name指向了zhangsan
//重新开辟空间,hello是垃圾数据
name = "zhangsan";
String name2 = "zhangsan";
}
String s = "hello";
产生一个对象,字符串池中存储String s = new String("hello");
产生两个对象,堆、池各存储一个
//第二种方式
String str = new String("java");
String str2 = new String("java");
System.out.println(str==str2);//false ==:比较的是地址
System.out.println(str.equals(str2));//true equals:比较的是数据
4.2 string常用方法
- public int length():返回字符串长长度
- public char charAt(int index):根据下标获取字符串
- public boolean contains(String str):判断当前字符串中是否包含str
- public char[] toCharArray():将字符串转换为数组
- public int indexOf(String str):查找str首次出现的下标,存在则返回该下标,不存在,则返回-1
- public int indexOf(String str):查找字符串在当前字符串中最后一次出现的下标索引
- public String trim():去掉字符串前后的空格
- public String toUpperCase():将小写转成大写
- public boolean endsWith(String str):判断字符串是否以str结尾
- public String replace(char oldChar,char newChar):将旧字符串替换成新字符串
- public String[] split(String str):根据str做拆分
public static void main(String[] args) {
String content = " java是 世界上最好的编程语言,java真香 ";
//length()
System.out.println(content.length());
//charAt(int index)
System.out.println(content.charAt(content.length()-1));
//contains(String str)
String str = "java";
System.out.println(content.contains(str));
//toCharArray()
System.out.println(Arrays.toString(content.toCharArray()));
//indexOf(String str)
System.out.println(content.indexOf("java"));
System.out.println(content.indexOf("java",4));
//lastIndexOf(String str)
System.out.println(content.lastIndexOf("java"));
//trim()
System.out.println(content.trim());
//toUpperCase()
System.out.println(content.toUpperCase());
System.out.println(content.toLowerCase());
//endWith(String str)
System.out.println(content.startsWith("java"));
System.out.println(content.endsWith(" "));
//replace
System.out.println(content.replace("java","C"));
//split() 拆分 +:多个相同的分隔为1个
String[] arr = content.split("[ ,]+");
System.out.println(arr.length);
for (String string:arr){
System.out.println(string);
}
}
4.3 可变字符串
- StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全
- StringBuilder:可变长字符串,JDK1.5提供,运行效率快、线程不安全
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
// StringBuffer sb = new StringBuffer();
//append()追加
sb.append("java世界第一");
System.out.println(sb.toString());
sb.append("java真香");
System.out.println(sb.toString());
//insert()添加
sb.insert(0,"前排");
System.out.println(sb.toString());
//replace 取头不取尾
sb.replace(0,2,"hello");
System.out.println(sb.toString());
//delete
sb.delete(0,5);
System.out.println(sb.toString());
}
- 验证String和StringBuffer的效率
public static void main(String[] args) {
long start = System.currentTimeMillis();
String string = "";
for (int i = 0;i<900;i++){
string += i;
}
System.out.println(string.toString());
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-start));
long start1 = System.currentTimeMillis();
StringBuffer str = new StringBuffer();
for (int i = 0;i<900;i++){
str.append(i);
}
System.out.println(str.toString());
long end1 = System.currentTimeMillis();
System.out.println("用时:"+(end1-start1));
}
5、BigDecimal类
- 位置:java.math包中
- 作用:精确计算浮点数
- 创建方式:BigDecimal bd = new BigDecimal(“1.0”);
- 方法:
1.BigDecimal add(BigDecimal bd) 加
2.BigDecimal subtract(BigDecimal bd) 减
3.BigDecimal multiply(BigDecimal bd) 乘
4.BigDecimal divide(BigDecimal bd) 除 - 使用除法时,会出现除不尽的异常,我们加上保留几位小数的参数
public static void main(String[] args) {
//double存储的是近似值
double d1 = 1.0;
double d2 = 0.9;
System.out.println(d1-d2);//0.09999999999999998
//面试题
double result = (1.4-0.5)/0.9;
System.out.println(result);//0.9999999999999999
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
BigDecimal r = bd1.subtract(bd2);
System.out.println(r);//0.1
}
6、Date类
- Date表示特定的瞬间,精确到毫秒,Date类中的大部分方法都已经被Calendar类中的方法取代。
public static void main(String[] args) {
//当前时间
Date date1 = new Date();
System.out.println(date1.toString());
//昨天
Date date2 = new Date(date1.getTime()-(60*60*24*1000));
System.out.println(date2);
//判断date1是否在date2之后
System.out.println(date1.after(date2));
//比较
System.out.println(date1.compareTo(date2));
}
7、Calendar类
- Calendar提供了获取或设置各种日历字段的方法
- 构造方法是protected Calendar():由于修饰符是protected,所以无法直接创建该对象
- 部分方法
public static void main(String[] args) {
//创建对象
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime().toLocaleString());
//获取时间信息
//年
int year = calendar.get(calendar.YEAR);
//月
int month = calendar.get(calendar.MONTH);
//日
int day = calendar.get(calendar.DAY_OF_MONTH);
//时
int hour = calendar.get(calendar.HOUR_OF_DAY);
//分
int minute = calendar.get(calendar.MINUTE);
//秒
int second = calendar.get(calendar.SECOND);
System.out.println(year+"年"+month+1+"月"+day+"日"+hour+":"+minute+":"+second);
//修改时间
Calendar calendar2 = Calendar.getInstance();
calendar2.set(Calendar.DAY_OF_MONTH,5);
System.out.println(calendar2.getTime().toLocaleString());
}
8、SimpleDateFormat类
- SimpleDateFormat是一个以语言环境有关的方式来格式化和解析日期的具体类
- 进行格式化(日期 -> 文本)、解析(文本 -> 日期)
- 常用时间模式字母
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss S");
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy/MM/dd");
Date date = new Date();
String str = simpleDateFormat.format(date);
System.out.println(str);
//解析 字符串转为日期
Date date2 = simpleDateFormat1.parse("2020/05/01");
System.out.println(date2);
}
9、System类
- System系统类,主要用于获取系统属性数据和其他操作,构造方法私有的