Java常用类

一、 Object

  1. Object 类的介绍
    (1) Object 类位于 java.lang 包中,是继承关系的根类、超类,是所有类的父类 ( 直接的父类或是间接父类 )
    (2) Object类型的引用可以用于存储任意类型的对象。
    (3) Object类中定义方法,所有类都可以直接使用。
  2. 8Object 类中常用方法:
    (1) getClass() : 返回引用中实际存储的对象类型。【理解】
    开发实际应用:用于判断两个引用中实际存储的对象类型是否一致,一致-true;不一致- false。
  3. class Animal {}
  4. class Dog extends Animal {}
  5. class Cat extends Animal {}
  6. 案例: Animal a1 = new Cat ();
  7. Animal a2 = new Dog ();
  8. System . out . println ( a1 . getClass () == a2 . getClass ());
    (2) int hashCode() : 返回对象的整数哈希码值。对象的哈希码值来源是将 十六进制的地址,转换十进制的整数的结果。
    注意:由于不同的对象在堆空间中有不同的十六进制的地址,所有不同的对象具有不同哈希码值。
    (3) String toString() : 返回该对象字符串的变现形式。【开发重点】
    a. 作用:方便展示对象的信息,子类通常将 toString 方法覆盖。 toString 方法覆盖的原则如下:
    通常将所有的属性拼接为一个 字符串进行结果返回。
    b. 案例: public String toString(){
    return "name="+name+",age="+age; // this. 省略
    }
    c. get 方法和 toString 方法 区别:
    I. get方法是返回对象的单个属性的信息,并且不会改变属性对应数据类型
    II. toString 方法获取所有属性的信息,并且将 所有属性拼接为 一个 String 类型的结果进行返回。
    (4) boolean equals(Object o) :用于比较对象内容是否相同。【开发应用重点】
    a. == 的应用
    I. 如果 == 两端 为基本数据类型的变量,则判断变量中数值是否相同
    如果 == 两端 为引用类型的变量,则判断引用中存储的地址是否相同。
    II. 开发中 == 两端为引用类型的实际应用:通常用于判断两个引用是否指向同一个对象。
    引用名1 == 引用名 2 : 结果为 true ,代表两个引用指向同一个对象;
    结果为false,代表两个引用指向不同的对象。
    b. equals 方法的应用:
    I. 父类 Object 类中 equals 方法实现原理如下:
    public boolean equals(Object obj) {
    return (this == obj);
    }
    注意:父类中的equals方法是用于比较两个引用是否同一个对象,但是开发时,通常用equals方法比 较对象的内容,所以父类中equals方法不足以满足子类的 需求,则需要覆盖父类 Object 中
    equals 方法。
    II. equals 方法覆盖的原则:
  9. public boolean equals ( Object obj ){
  10. // 1. 自反性:判断当前对象和要比较的对象是否指向同一个对象 : this 和 obj
  11. if ( this == obj ){
  12. return true ;
  13. }
  14. // 2. 判断 obj 是否 空
  15. if ( obj == null ){
  16. return false ;
  17. }
  18. // 3. 判断 两个引用中实际存储的对象类型是否一致
  19. if ( this . getClass () != obj . getClass ()){
  20. return false ;
  21. }
  22. // 4. 强制类型转换: 为一一比较对象属性做准备
  23. Student s = ( Student ) obj ;
  24. // 5. 将对象中属性一一进行比较: 基本数据类型的属性: == ; 引用类型: equals 比较
  25. if ( this . age == s . age && this . score == s . score && this . name . equals ( s . name )){
  26. return true ;
  27. } else {
  28. return false ;
  29. }
  30. }
    面试重点: == 和 equals 方法的区别。
    解析:
    (1) ==的应用
    == 两端为基本数据类型,比较变量中数值是否相同
    == 两端为引用类型的变量,比较引用存储地址是否相同
    (2) equals 方法: Object 类中方法用于实现用 (==) 实现,比较对象地址;但是实际开发时,需要将 equals 方法进行覆盖,用于比较对象的内容是否相同。
    (5) finalize() : JVM进行垃圾回收时 , 自动调用的方法。 ( 垃圾回收器回收垃圾对象 )(JVM 性能调优时关注 )
    【面试】
    a. 垃圾对象:没有任何引用指向的对象。
    Student s= new Student();
    s = null ; // 将 s 指向的对象设置为 垃圾对象
    b. 垃圾回收器:用于 JVM 回收垃圾对象。简称为 gc / GC
    c. 垃圾回收的目的:清除垃圾对象,释放空间,提高空间利用率。
    d. 垃圾回收器回收垃圾对象时机:
    ① 自动回收机制:当 JVM 内存耗尽时,不能再为新创建的对象分配空间时, JVM 中垃圾回收器会自动 将所有的垃圾对象一次性进行回收,垃圾回收器进行回收垃圾对象时,自动调用finalize方法。
    ② 手动回收机制:利用 System.gc() ; 通知 垃圾回收器 (GC) 进行垃圾回收,如果 GC 空闲,则进行垃圾回收,如果GC繁忙,则暂不回收。
    注意:开发时, finalize 方法中不写任何重要代码, finalize 方法的执行节点不可控
    二、包装类 ( 位于 java.lang 包中 )
  31. 概念:基本数据类型对应引用类型,称之为基本数据类型的包装类。
  32. 基本数据类型对应的包装类:【重点】
    基本数据类型 包装类类名
    byte Byte
    short Short
    int Integer
    long Long
    float Float
    double Double
    char Character
    boolean Boolean
  33. 数据之间转换【了解】
    (1) int 和 Integer 之间的转换
    int -----> Integer
    a. Integer i1 = new Integer(12); // 借助构造方法
    b. Integer i2 = Integer.valueOf(12); // 借助 Integer 类中的静态方法
    Integer ----> int
    a. int a1 = i1.intValue() ; // 借助 Integer 类中的成员方法 intValue()
    (2) String 和 Integer 之间的转换
    String ----> Integer
    a. Integer i3 = new Integer("123"); // 借助 Integer 类中的构造方法
    b. Integer i4 = Integer.valueOf("123"); // 借助 Integer 类中的静态方法
    Integer ----> String
    a. String s1 = i4.toString();
    b. String s2 = i4+""; // 借助字符串的拼接
    (3) int 和 String 之间的转换
    int ---> String
    a. int a = 3;
    String s3 = a+"";
    String ----> int 【开发应用重点】
    int a = Integer.parseInt("123"); // 借助 Integer 类中静态方法
    注意:将 String 类型的数据转换为 int/Integer 类型的数据,要求要转换的 String 数据类型必须是纯数字,否则运行报错,错误信息如下:
    java.lang.NumberFormatException ( 数字格式转换异常 )
  34. 自动装箱、自动拆箱
    (1) JDK5.0之后提供自动装箱和自动拆箱的功能,基本数据类型和对应包装类型之间可以相互自动转换
    (2) 自动装箱:基本数据类型可以直接赋值给其对应的包装类型。
    自动拆箱:包装类型的引用可以直接赋值给其对应的基本数据类型的变量。
    (3) 案例: Integer i = 12; // 自动装箱
    int a = i ; // 自动拆箱
    (4) 自动装箱实现的原理:自动装箱底层调用的时 Integer 类中 静态的 valueOf 方法: 【面试难点】
    public static Integer valueOf(int i) {
    if (i >= -128 && i <= 127)
    return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i); // 如果 传入数据不在 -128~127 之间,则 new Integer 类型对象
    }
    注意: Java 中将 -128~127 常用数据段的内容进行了预先的包装处理,转换数据只要在 -128~127 之间不
    需要每次创建对象,而是从处理结果中直接获取即可, -128~127 处理结果存储在缓冲区中、常量池。
    面试题目: Integer i1 = 12;
    Integer i2 = 12;
    System.out.println(i1==i2); // true
    Integer i3 = 150;
    Integer i4 = 150 ;
    System.out.println(i3==i4); // false
  35. 包装类实际开发应用【开发重点】
    (1) 可以用于区分有效数据和无效数据:例如 0 和 null , 0.0 和 null.
    (2) 场景:开发时,通常将类中属性定义为基本数据类型对应包装类型。 --> 区分有效数据和无效数据的
    三、 String 类【开发重点】
  36. 创建字符串的方式:【面试重点】
    (1) String s1 = "hello"; // 只会创建一个对象,在串池中产生
    (2) String s2 = new String("world"); // 产生两个对象。一个在堆空间中,一个在串池中产生。
    注意:如果串池中已经存在的字符串对象,不会重复创建。
  37. String 类中常用方法:
    (1) char charAt(int index):根据下标获取对应的字符。
    注意: String 类中封装了一个 char 类型数组,下标范围 0~ 字符串的长度 -1 ,如果指定的下标超出下标 范围,则运行报错,错误信息为:java.lang.StringIndexOutOfBoundsException( 数组下标越界 )
    (2) boolean contains(String str):判断一个字符串中是否包含 str 子串,包含 -true; 否则 -false.
    (3) boolean equals(String str):比较两个字符串内容是否相同,相同 -true; 否则 -false.
    注意:开发时,比较字符串内容,需要用 equals 方法比较。
    (4) int length() : 获取字符串的长度。
    注意:获取数组的长度:数组名 .length ;
    // 思考:如何遍历字符串????
    (5) String trim() : 去除字符串前后的空格。
    注意:应用场景结合 :将 String 转换 int/Integer 时应用
    String age = "18 ";
    int n = Integer.parseInt(age.trim());
    (6) String[] split(String str) : 将当前字符串进行拆分,拆分结果封装为一个 String 类型的数组。
  38. String 的不可变性【面试题目】
    (1) String的字面值是字面常量,如果在字符串上进行操作,在原有字符串的基础上拷贝一个副文本,在副 文本上完成操作( 字符串拼接 ) 。
    (2) 由于 String 具有不可变性,所以在完成字符串拼接时,效率较低。
    注意: String s = "a" + "b";
    上面的字符串的拼接只创建一个对象。原因:如果 + 两端都为字符串常量时,编译器在编译阶
    段将 "a"+"b" 直接编译为 "ab", 称为编译器可知。
    四、可变长的字符串 ( 位于 java.lang )
  39. StringBuffer: JDK1.0 版本,线程安全,运行效率慢
    StringBuilder: JDK5.0 版本,线程不安全,运行效率快。
  40. 常用的构造方法:
    (1) public StringBuilder() : 无参数的构造方法
    (2) public StringBuilder(String str) : 带有字符串类型参数的构造方法
  41. 常用功能方法:
    StringBuilder append(String str) :字符串的拼接
  42. 注意: StringBuilder 是可变长字符串,所有拼接效率远远高于 String 。
    面试题目: String 和 StringBuilder 、 StringBuffer 的区别。
    解析:
    (1) String 是不可变长的字符串,在完成字符串拼接时效率较低。
    String 线程安全。
    (2) StringBuilder是可变长的字符串,在完成字符串拼接时效率较高。
    StringBuilder 线程不安全。
    (3) StringBuffer是可变长的字符串,在完成字符串拼接时效率较高
    StringBuffer 线程安全。
    五、 BigDecimal 类【了解】
  43. BigDecimal 类:位于 java.math 包中
  44. 作用:精确的表示、计算浮点数
  45. 常用的构造方法:
    public BigDecimal(String n) : 带有字符串类型构造方法
  46. 常用的方法:
    (1) BigDecimal r1 = bd1.add(bd2); // 加法 bd1 + bd2
    (2) BigDecimal r2 = bd1.subtract(bd2); // 减法 : bd1 - bd2
    (3) BigDecimal r3 = bd1.multiply(bd2); // 乘法 : bd1*bd2
    (4) BigDecimal r4 = bd1.divide(bd2,2,BigDecimal.ROUND_HALF_UP); // 除法: bd1/bd2
    参数说明:
    第一个参数:分母数据
    第二个参数:指定保留到小数点后几位
    第三个参数:取舍模式,通常采用四舍五入 (BigDecimal.ROUND_HALF_UP)