文章目录

  • 一、Object 类
  • getClass()方法
  • hashCode()方法
  • toSring()方法
  • equals()方法
  • finalize()方法
  • 二、包装类
  • 类型转换与装箱、拆箱
  • 整数缓冲区
  • 三、String类
  • 常用方法
  • 可变字符串
  • 四、BigDecimal 类
  • 五、Date类
  • Calendar
  • SimpleDateFormat
  • 六、System类


一、Object 类

  • 超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
  • 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承。
  • Object类中所定义的方法,是所有对象都具备的方法。
  • Object类型可以存储任何对象。
  • 作为参数,可接受任何对象。
  • 作为返回值,可返回任何对象。

getClass()方法

public final Class<?> getClass(){}
  • 返回引用中存储的实际对象类型。
  • 应用:通常用于判断两个引用中实际存储对象类型是否一致。
public static void main(String[] args) {
        Student s1=new Student("aa",12);
        Student s2=new Student("bb",13);
        // 判断s1 和 s2是不是同一个类型  Student
        Class class1 = s1.getClass();//class object.Student
        Class class2 = s2.getClass();//class object.Student
        //getClass返回 class类型
        System.out.println(class1+"--"+class2);//class object.Student --- class object.Student
        if(class1==class2){
            System.out.println("s1和s2属于同一个类型");
        }else{
            System.out.println("s1和s2不属于同一个类型");
        }
        //s1和s2属于同一个类型
    }

hashCode()方法

public int hashCode(){}
  • 返回该对象的哈希码值
  • 哈希值根据对象的地址字符串数字使用hash算法计算出来的int类型的数值。
  • 一般情况下相同对象返回相同哈希码。
public static void main(String[] args) {
        Student s1=new Student("aa",12);
        Student s2=new Student("bb",13);
        //hashCode()方法
        System.out.println(s1.hashCode());//460141958
        System.out.println(s2.hashCode());//1163157884
        //s1和s2自然不同
        Student s3 = s1; //此时s3的hashCode与s1相同
        System.out.println(s3.hashCode());//460141958
    }

toSring()方法

public String toSring(){}
  • 返回该对象的字符串表示(表现形式)。
  • 可以根据程序需求覆盖该方法,如:展示对象各个属性值。
public static void main(String[] args) {
        Student s1=new Student("aa",12);
        Student s2=new Student("bb",13);
        //toSring()方法
        //直接打印 包+类名+哈希值
        System.out.println(s1.toString());//object.Student@1b6d3586
        System.out.println(s2.toString());//object.Student@4554617c
    }
//重写toSring()方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

equals()方法

public boolean equals(Object obj){}
  • 默认实现为(this == obj),比较两个对象地址是否相同。
  • 可进行覆盖,比较两个对象的内容是否相同。
public static void main(String[] args) {
        Student s1=new Student("aa",12);
        Student s2=new Student("bb",13);
        //equals()方法:判断两个对象是否相等
        System.out.println(s1.equals(s2)); //false
        Student s4 = new Student("小明", 17);
        Student s5 = new Student("小明", 17);
        System.out.println(s4.equals(s5)); //false 对象不一样,在堆中的地址也不同
    }

equals()方法覆盖步骤

  • 比较两个应用是否指向同一个对象
  • 判断obj是否为null
  • 判断两个引用只想的实际对象类型是否一致
  • 强制类型转换
  • 依次比较各个属性值是否相同
@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()){
        //
        // }
        //instanceof 判断对象是否是某种类型
        if(obj instanceof Student){
            //4.强制类型转换
            Student s = (Student)obj;
            //5.依次比较各个属性值是否相同
            if(this.name.equals(s.getName()) && this.age == s.getAge()){
                return true;
            }
        }
        return false;
    }

finalize()方法

  • 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
  • 垃圾对象:没有有效引用指向此对象时,为垃圾对象。
  • 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
  • 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
  • 手动回收机制:使用System.gc():通知JVM执行垃圾回收。
@Override
    protected void finalize() throws Throwable{
        System.out.println(this.name + "对象被回收了");
    }
public static void main(String[] args) {
        Student s1 = new Student("aaa", 20); //不是垃圾
        Student s2 = new Student("bbb", 20); // 是垃圾
        new Student("ccc", 30); //是垃圾垃圾 会被回收
        System.out.println("---回收垃圾---");
        //回收垃圾
        System.gc();
        //ccc对象被回收了
    }

二、包装类

  • 基本数据类型(存储在栈空间)所对应的引用数据类型。
  • Object 可统一所有数据,包装类的默认值是null。

基本数据类型

包装类型

byte

Byte

short

Short

int

Integer

long

Long

float

Float

double

Double

boolean

Boolean

char

Character

类型转换与装箱、拆箱

  • 8种包装类提供不用类型间的转换方式。
  • Number父类中提供的6个共性方法。
  • parseXXX( )静态方法
  • valueOf( )静态方法
  • 注意:需保证类型兼容,否则抛出NumberFormatException异常。

装箱:基本类型转换为引用类型,栈里面的数据拿到堆中;拆箱:引用类型转换为基本类型,堆里面的数据拿到栈中;

public static void main(String[] args) {
        //基本类型
        int num1 = 18;
        //装箱:基本类型 → 引用类型
        //使用Integer类创建对象
        Integer integer1 = new Integer(num1);//构造方法
        Integer integer2 = Integer.valueOf(num1);//valueOf()方法

        //拆箱:引用类型 → 基本类型
        Integer integer3 = new Integer(100);//构造方法
        int num2 = integer3.intValue();

        //上述为jdk1.5之前的方法,在jdk1.5之后就提供了自动装箱和拆箱
        int age = 30;//基本类型
        //自动装箱 编译器自动转换Integer integer4 = Integer.valueOf(age);
        Integer integer4 = age;
        //自动拆箱  int age2 = integer4.intValue();
        int age2 = integer4;

        //parseXXX 基本类型和字符串之间转换
        //1 基本类型转成字符串
        int n1 = 15;
        //1.1使用+号
        String s1 = n1 + "";
        //1.2使用Integer中的toString()方法
        String s2 = Integer.toString(n1);
        //重载方法 toString(n1, x); // x为进制要求
        String s3 = Integer.toString(n1, 16);//把15转换为16进制的形式 f
        //Integer.toBinaryString(n1); 转换为二进制形式
        //Integer.toHexString(n1); 转换为十六进制形式

        //2 字符串转成基本类型
        String str = "150";
        //使用Integer.parseXXX(); 不能出现非数字的符号!
        int n2 = Integer.parseInt(str);

        //补充:boolean字符串形式转成基本类型,"true" ---> true 非“true“ ———> false
        String str2 = "true";
        String str3 = "treu";
        boolean b1 = Boolean.parseBoolean(str2);//true
        boolean b2 = Boolean.parseBoolean(str3);//false
    }

整数缓冲区

  • Java预先创建了256个常用的整数包装类型对象。
  • 在实际应用当中,对已创建的对象进行复用,节省内存的消耗。
public static void main(String[] args) {
        //面试题
        Integer integer1 = new Integer(100);
        Integer integer2 = new Integer(100);
        System.out.println(integer1 == integer2); //false

        Integer integer3 = 100;//自动装箱
        //自动装箱相当于调用 Integer.valueOf(100);
        Integer integer4 = 100;
        System.out.println(integer3 == integer4); //true

        Integer integer5 = 200;//自动装箱
        Integer integer6 = 200;
        System.out.println(integer5 == integer6); //false

        //valueOf()方法
        //有一个缓存区数组(在堆空间中) [-128, 127] 256个 在这之内的地址一样
        //在这个范围的数值都会直接给出地址值,若超出这个范围就会new Integer(200);
    }

三、String类

  • 字符串是常量,创建之后不可改变。
  • 字符串字面值存储在字符串池中,可以共享
  • String s = "Hello"; 产生一个对象,在字符串池中存储。
  • String s = new String("Hello"); 产生两个对象,在堆、字符串池各一个。
String name = "Hello";
	name="zhangsan";//赋值,并不是修改数据,而是重新开辟了一个空间

java常用类的常用方法有哪些 java中的常用类总结_System

String name2 ="zhangsan";

java常用类的常用方法有哪些 java中的常用类总结_System_02

String str = new String("java");
	//实际上程序运行时堆中的和字符串池中的是同一个,真正运行时,堆中值向字符串池中的

java常用类的常用方法有哪些 java中的常用类总结_java_03

//面试题
        String str = new String("java");
        String str1 = new String("java");
        System.out.println(str==str1);//false
        System.out.println(str.equals(str1));//true
        //字符串的比较用equals

java常用类的常用方法有哪些 java中的常用类总结_java_04


注:在jdk8之前字符串池是存在方法区,jak8之后移到了堆中。

常用方法

public static void main(String[] args) {
        //字符串方法的使用
        //1 length(); 返回字符串长度
        //2 charAt(int index); 返回某个位置的字符 角标是从0开始
        //3 contains(String str); 判断是否包含某个字符串

        //String content = "java是最好的语言";
        String content = "java是最好的语言java,java真香";
        System.out.println(content.length()); //10 空格也算一个字符
        System.out.println(content.charAt(content.length() - 1)); //言
        System.out.println(content.contains("java")); //true

        //4 toCharArray(); 返回字符串对应的数组
        //5 indexOf(); 返回子字符串首次出现的位置
        //6 lastIndexOf(); 返回字符串最后一次出现的位置

        System.out.println(content.toCharArray());//java是最好的语言
        System.out.println(Arrays.toString(content.toCharArray()));//[j, a, v, a, 是, 最, 好, 的, 语, 言]
        System.out.println(content.indexOf("java")); // 0
        System.out.println(content.indexOf("java", 4)); // 从索引4开始找 返回10
        System.out.println(content.lastIndexOf("java")); // 15

        //7 trim(); //去掉字符串前后的空格
        //8 toUpperCase(); 小写转换为大写 toLowerCase(); 大写转换为小写
        //9 endWith(str);判断是否以str 结尾 startWith(str);判断是否以str开头

        String content2 = " hello world ";
        System.out.println(content2.trim()); // "hello world"
        System.out.println(content2.toUpperCase()); // HELLO WORLD
        System.out.println(content2.toLowerCase()); // hello world
        String file="hello.java";
        System.out.println(file.endsWith(".java")); // true
        System.out.println(file.startsWith("hello")); // true

        //10 replace(char old, char new); 用新的字符或字符串替换旧的字符或字符串
        //11 split(); 对字符串拆分
        System.out.println(content.replace("java", "php")); //php是最好的语言php,php真香
        String say = "java is the best language";
        String[] arr = say.split(" ");
        System.out.println(arr.length); // 5
        for(String string : arr){
            System.out.print(string+" ");//java is the best language
        }
        String say1 = "java is the best language,java xiang";
        String[] arr1 = say1.split("[ ,]");//[ ,] 表示根据空格和逗号进行切分 ;+号表示切分可以多个 比如多个空格
        for(String string : arr1){
            System.out.print(string+" ");//java is the best language java is the best language java xiang
        }
        String say2 = "java is the   best language,java xiang";
        String[] arr2 = say1.split("[ ,]+");

        //补充两个equals()、compareTo();比较大小
        String s1 = "hello";
        String s2 = "HELLO";
        System.out.println();//换行
        System.out.println(s1.equals(s2));//false
        System.out.println(s1.equalsIgnoreCase(s2));//忽略大小写的比较 true
        //compareTo(); 比的是在编码表中的位置  两字符不同时比较字符字典序的ascii码
        String s3="abc";//a 97
        String s4="xyz";//x 120
        //首先拿s3的"a"跟s4的"x"进行比较 97-120=-23
        //如果s3的第一个字符和s4的第一个字符相等,就比较第二个!
        System.out.println(s3.compareTo(s4));//-23


        //字符相同时比较长度 返回长度的差值
        String s5="abc";
        String s6="abcxyz";
        System.out.println(s5.compareTo(s6));//3-6=-3
    }

案例:

  1. 已知String str = “this is a text”;
  2. 将str中的单词单独获取出来
  3. 将str中的text替换成practice
  4. 在text前面插入一个easy
  5. 将每个单词的首字母改为大写
public static void main(String[] args) {
        String str = "this is a text";
        //2.将str中的单词单独获取出来
        String[] arr = str.split(" ");
        for(String s : arr){
            System.out.println(s);
        }
        //3.将str中的text替换成practice
        String str2 = str.replace("text", "practice");
        //4.在text前面插入一个easy
        String str3 = str.replace("text", "easy text");
        //5.将每个单词的首字母改为大写
        for(int i = 0; i < arr.length; i ++){
            char first = arr[i].charAt(0);
            char upperfirst = Character.toUpperCase(first);
            String news = upperfirst + arr[i].substring(1);//substring(int begin);从begin开始接触截取
            System.out.println(news);
        }
    }

可变字符串

  • StringBuffer : (相当于包含了一个缓冲区)可变长字符串,JDK1.2提供,运行效率慢、线程安全。
  • StringBuilder : 可变长字符串、JDK5.0提供,运行效率快、线程不安全

效率都比String高且节省内存!

public static void main(String[] args) {
        /*和String的区别
          1 StringBuffer和StringBuilder比String效率高
          2 比String节省内存
         */
        //StringBuffer 和 StringBuilder 用法一致!!!
        StringBuffer sb = new StringBuffer();
        //StringBuilder sb = new StringBuilder(); //推荐
        //1 append(); 追加
        sb.append("java世界第一");
        System.out.println(sb.toString());//java世界第一
        //2 insert(); 添加、插入
        sb.insert(0, "在第一个位置添加");//在第一个位置添加java世界第一
        System.out.println(sb.toString());
        //3 replace(); 替换 可以指定位置
        sb.replace(0, 4, "hello"); // 左闭右开 
        System.out.println(sb.toString());//hello位置添加java世界第一
        //4 delete(); 删除
        sb.delete(0, 5); // 左闭右开
        System.out.println(sb.toString());//位置添加java世界第一
        //5 清空
        sb.delete(0, sb.length());
    }

四、BigDecimal 类

  • 位置 java.math 包中
  • 作用:精确计算浮点数
  • 创建方式 BigDecimal bd = new BigDecimal("1.0");
public static void main(String[] args) {
        //思考?
        double d1=1.0;
        double d2=0.9;
        //1.0/0.9=0.1
        System.out.println(d1-d2);//0.09999999999999998 ?

        double result=(1.4-0.5)/0.9;//1
        System.out.println(result);//0.9999999999999999 ?
        //因为浮点数存储的是近似值,在经过运算后,结果可能会出现误差

        //BigDecimal 用于大的浮点数的精确运算
        BigDecimal bd1 = new BigDecimal("1.0"); //需要用字符串,字符串是最准确的!
        BigDecimal bd2 = new BigDecimal("0.9");

        //减法
        BigDecimal r1 = bd1.subtract(bd2);
        System.out.println(r1); //0.1

        //加法
        BigDecimal r2 = bd1.add(bd2);
        System.out.println(r2);//1.9

        //乘法
        BigDecimal r3 = bd1.multiply(bd2);
        System.out.println(r3);//0.90

        //除法
        BigDecimal r4 = new BigDecimal("1.4").subtract(new BigDecimal("0.5")).divide(new BigDecimal("0.9"));
        System.out.println(r4);//1
        //要注意除不尽的情况!!
        BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP);
        System.out.println(r5);//3.33
        //divide(new BigDecimal("3"),x,BigDecimal.ROUND_HALF_UP);x填保留几位数 后面为四舍五入的意思
    }

五、Date类

  • Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代
  • 时间单位:1秒 = 1000毫秒(ms),1毫秒= 1000 微妙(μs), 1微妙 =1000纳秒( ns)
public static void main(String[] args) {
        //1 创建Date对象
        Date date1 = new Date();//今天的时间
        System.out.println(date1.toString()); //Tue Aug 17 18:30:00 CST 2021
        System.out.println(date1.toLocaleString()); // 已过时 但也能用 2021-8-17 18:30:00

        Date date2 = new Date(date1.getTime() - (60*60*24*1000));//创建昨天的时间
        System.out.println(date2.toLocaleString());//2021-8-16 18:30:00

        //2 方法 after before
        boolean b1 = date1.after(date2);
        System.out.println(b1); //true
        boolean b2 = date1.before(date2);
        System.out.println(b2); //false

        //3 比较compareTo(); 比毫秒值
        int d = date1.compareTo(date2);
        System.out.println(d); //多的为1 少的为-1 相等为0 

        //4 比较是否相等 equals()
        boolean b3 = date1.equals(date2);
        System.out.println(b3); // false
    }

Calendar

  • Calendar提供了获取或设置各种日历字段的方法。
  • 构造方法protected Calendar(); 由于修饰符是protected, 所以无法直接创建该对象。
  • 其他方法:

方法名

说明

static Calendar getInstance()

使用默认时区和区域获取日历

void set(int year, int month, int date, int hourofday, int minute, int second)

设置日历的年、月、日、时、分、秒

int get(int field)

返回给定日历字段的值,字段比如年、月、日

void setTime(Date date)

用给定的Date设置此日历时间 Date—Calendar

Date getTime()

返回一个Date表示此日历的时间 Calendar—Date

void add(int field, int amount)

按照日历的规则,给指定字段添加或减少时间量

long getTimeInMilles()

毫秒为单位返回该日历的时间值

public static void main(String[] args) {
        //1 创建 Calendar 对象
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getTime().toLocaleString());//2021-8-17 18:37:38
        //2 获取时间信息
        //获取年
        int year = calendar.get(Calendar.YEAR);//可以写1代表年
        System.out.println(year);//2021
        //获取月 从 0 - 11 比实际的小1
        int month = calendar.get(Calendar.MONTH);
        //日
        int day = calendar.get(Calendar.DAY_OF_MONTH);//DATE
        //小时
        int hour = calendar.get(Calendar.HOUR_OF_DAY);//HOUR 12小时 HOUR_OF_DAY 24小时
        //分钟
        int minute = calendar.get(Calendar.MINUTE);
        //秒
        int second = calendar.get(Calendar.SECOND);
        //3 修改时间
        Calendar calendar2 = Calendar.getInstance();
        calendar2.set(Calendar.DAY_OF_MONTH, 5);
        System.out.println(calendar2.getTime().toLocaleString());//2021-8-5 18:41:53
        //4 add修改时间
        calendar2.add(Calendar.HOUR, 1); //add(Calendar.HOUR, x); x为正就加 负就减
        System.out.println(calendar2.getTime().toLocaleString());//2021-8-5 19:42:40
        //5 补充方法
        int max = calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);//当前月数的最大天数 31
        int min = calendar2.getActualMinimum(Calendar.DAY_OF_MONTH);//当前月数最小的天数 1
    }

SimpleDateFormat

  • SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。
  • 进行格式化(日期→文本)、解析(文本→日期)。
  • 常用的时间模式字母:

字母

日期或时间

示例

y


2019

M

年中月份

08

d

月中天数

10

H

一天中小时(0-23)

22

m

分钟

16

s


59

S

毫秒

367

public static void main(String[] args) throws Exception{
        //1 创建SimpleDateFormat对象
        //SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//2021/08/17 18:47:30
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");//2021/08/17
        //2 创建Date对象
        Date date = new Date();
        //格式化date(日期→字符串)
        String str = sdf.format(date);
        System.out.println(str);//2021/08/17
        //解析(字符串→时间)
        Date date2 = sdf.parse("1948/03/12");//这里字符串格式要和上面规定(yyyy/MM/dd)的一样才能正常解析!
        System.out.println(date2.toLocaleString());//1948-3-12 0:00:00
    }

六、System类

  • 主要用于获取系统的属性数据和其他操作,构造方法私有的(使用的时候不需要创建对象)。

方法名

说明

static void arraycopy(…)

复制数组

static long currentTimeMillis();

获取当前系统时间,返回毫秒值

static void gc();

建议JVM赶快启动垃圾回收期器回收垃圾

static void exit(int status);

退出JVM,如果参数是0表示正常退出JVM,非0表示异常退出JVM

public static void main(String[] args) {
        //arraycopy 数组的复制
        //arraycopy(src, srcPos, dest, destPos, length);
        //src:原数组 srcPos:从哪个位置开始复制0 dest:目标数组 destPos:目标数组的位置 length:复制的长度
        int[] arr = {20, 18, 15, 8, 35, 26, 45, 90};//长度为8
        int[] dest = new int [8];
        //System.arraycopy(arr, 0, dest, 0, arr.length);
        //for (int i = 0; i < dest.length; i++) {
        //    System.out.print(dest[i]+" ");//20 18 15 8 35 26 45 90
        //}
        System.arraycopy(arr, 4, dest, 4, 4);
        for (int i = 0; i < dest.length; i++) {
            System.out.print(dest[i]+" ");//0 0 0 0 35 26 45 90
        }
        // Arrays.copyOf(original, newLength);用的就是System.arraycopy(arr, 0, dest, 0, arr.length);

        //currentTimeMillis() 从1970开始到现在的毫秒数 计时
        System.out.println(System.currentTimeMillis());//1629197832583
        long start=System.currentTimeMillis();
        for (int i = -9999999; i < 99999; i++) {
            for (int j = -9999999; j < 99999; j++) {
                int result=i+j;
            }
        }
        long end=System.currentTimeMillis();
        System.out.println(end-start);//可以计算出循环用的时间 7

        //System.gc();//告诉垃圾回收器回收垃圾  案例在内部类的时候有
        
        System.exit(0);//退出JVM
        System.out.println("程序结束了");//没有被执行!
    }