
一、Object类1.Object类介绍(1) Object类位于java.lang包中是继承关系的根类、超类是所有类的父类直接父类或是间接父类(2) Object类型的引用可以用于存储任意类型的对象。(3) Object类中定义方法所有类都可以直接使用。2.Object类中常用方法(1) getClass()返回引用中实际存储的对象类型。应用用于判断两个引用中实际存储的对象类型是否一致一致返回true不一致返回false。class Animal{}class Dog extends Animal{}class Cat extends Animal{}//案例Animal a1 new Cat();Animal a2 new Dog();System.out.println(a1.getClass() a2.getClass());(2) int hashCode()返回对象的整数哈希码值。对象的哈希码值来源是将十六进制的地址转换为十进制的整数结果。注意不同对象在堆内存中有不同十六进制地址所以不同对象一般具有不同哈希码值。(3) String toString()返回该对象字符串的表现形式。【开发重点】a. 作用方便展示对象信息子类通常需要重写toString方法。重写原则一般将对象所有属性拼接为一串字符串返回。b. 重写示例public String toString(){return namename,ageage;}c. get方法和toString区别Ⅰ.get方法返回对象单个属性不会改变属性数据类型Ⅱ.toString获取对象全部属性信息统一拼接为String类型返回(4) boolean equals(Object o)用于比较对象内容是否相同。【开发应用重点】a. 的应用Ⅰ. 两端为基本数据类型变量比较变量存储的数值是否相同两端为引用类型变量比较引用存储的内存地址是否相同。Ⅱ.开发场景引用类型使用一般用来判断两个引用是否指向同一个对象。引用名1 引用名2true代表指向同一个对象false代表指向不同对象。b. equals方法应用Ⅰ.Object父类中equals底层源码public boolean equals(Object obj){return (this obj);}说明父类原生equals本质还是用比较地址只能判断是否为同一个对象开发中大多需要对比对象属性内容因此子类必须重写equals。Ⅱ.equals标准重写模板public boolean equals(Object obj){//1.自反性判断当前对象和传入对象是否为同一个if(this obj){return true;}//2.判断传入对象是否为空if(obj null){return false;}//3.判断两个对象实际类型是否一致if(this.getClass() ! obj.getClass()){return false;}//4.强制向下转型准备对比属性Student s (Student)obj;//5.逐一对比属性基本类型用引用类型调用equalsif(this.age s.age this.score s.score this.name.equals(s.name)){return true;}else{return false;}}面试重点 和 equals区别1. • 基本数据类型比较值是否相等• 引用数据类型比较内存地址是否相等2. equals• Object原生equals等价于只比较地址• 子类重写后equals用来比较对象属性内容是否相同(5) finalize()JVM执行垃圾回收时自动调用的方法。【面试了解】a.垃圾对象没有任何引用指向的对象Student s new Student();s null; //该对象变为垃圾对象b.垃圾回收器简称GC用来回收堆中的垃圾对象c.回收目的清除无引用对象释放堆内存提升空间利用率d.两种回收时机①自动回收JVM内存不足、无法分配新对象空间时GC自动回收所有垃圾对象回收前自动执行finalize()②手动提醒回收System.gc();仅通知GC执行回收GC空闲才会执行繁忙则暂缓回收⚠注意finalize执行时机不可控不要在该方法编写核心业务代码。二、包装类java.lang包1.概念八种基本数据类型各自对应的引用类型就是包装类。2.基本类型与对应包装类对照表基本数据类型 包装类类名byte Byteshort Shortint Integerlong Longfloat Floatdouble Doublechar Characterboolean Boolean3.数据互相转换(1) int ↔ Integerint转Integer//方式1构造方法Integer i1 new Integer(12);//方式2静态方法valueOf()Integer i2 Integer.valueOf(12);Integer转intint a1 i1.intValue();(2) String ↔ IntegerString转IntegerInteger i3 new Integer(123);Integer i4 Integer.valueOf(123);Integer转StringString s1 i4.toString();String s2 i4 ; //字符串拼接方式(3) int ↔ Stringint转Stringint a 3;String s3 a ;String转int【开发常用】int a Integer.parseInt(123);⚠注意转换的字符串必须是纯数字格式否则抛出NumberFormatException数字格式转换异常。4.自动装箱、自动拆箱(1) JDK5.0新增特性基本类型和对应包装类可以自动互相转换• 自动装箱基本类型 → 包装类型• 自动拆箱包装类型 → 基本类型Integer i 12; //自动装箱int a i; //自动拆箱(2) 底层原理自动装箱本质调用Integer.valueOf()public static Integer valueOf(int i){//缓存范围-128 ~ 127if(i -128 i 127){return IntegerCache.cache[i (-IntegerCache.low)];}return new Integer(i);}常量池缓存说明-128~127之间的数据提前存入缓存池该范围数据装箱直接复用缓存对象超出范围每次都会new新Integer对象。面试案例Integer i1 12;Integer i2 12;System.out.println(i1i2); //true在缓存区间内Integer i3 150;Integer i4 150;System.out.println(i3i4); //false超出缓存区间创建两个不同对象5.包装类实际开发作用(1) 区分有效值和空值比如区分0 和 null、0.0 和 null基本类型默认值不为null包装类默认值为null。(2) 开发中实体类属性一般定义为包装类用来区分未赋值(null)和赋值为0的场景。三、String类【开发重点】1.两种创建字符串方式(1) String s1 hello;仅在字符串常量池创建1个对象(2) String s2 new String(world);创建2个对象堆内存常量池各1个⚠常量池已有相同字符串时不会重复创建。2.String常用方法(1) char charAt(int index)根据下标获取对应字符底层封装char数组下标范围0 ~ 字符串长度-1下标越界抛出StringIndexOutOfBoundsException下标越界异常。(2) boolean contains(String str)判断当前字符串是否包含子串str包含返回true。(3) boolean equals(String str)比较两个字符串内容是否完全相同开发比较字符串内容必须使用equals不能用。(4) int length()获取字符串字符长度区分数组长度数组名.length字符串长度字符串.length()字符串遍历写法String s hello;for(int i 0; i s.length(); i){char c s.charAt(i);System.out.println(c);}(5) String trim()去除字符串首尾两端空格常用场景接收前端输入内容去除多余空格再转数字String age 18 ;int n Integer.parseInt(age.trim());(6) String[] split(String str)按照指定分隔符拆分字符串返回String数组。3.String不可变性【面试题】(1) String字面量属于常量字符串拼接操作不会修改原有字符串而是拷贝一份副本在副本上完成拼接。(2) 因为不可变性频繁字符串拼接运行效率很低。补充String s ab;编译期优化编译器直接识别为ab只会创建1个常量池对象。四、可变字符串java.lang包1.两个类区别• StringBufferJDK1.0诞生线程安全执行效率偏慢• StringBuilderJDK5.0诞生线程不安全执行效率更快2.常用构造方法//无参构造public StringBuilder()//带字符串参数构造public StringBuilder(String str)3.核心方法StringBuilder append(String str)完成字符串拼接返回自身对象支持链式拼接。4.三者面试总结区别1. String不可变字符串拼接效率低线程安全2. StringBuilder可变字符串拼接效率高线程不安全单线程优先使用3. StringBuffer可变字符串拼接效率较高线程安全多线程环境使用五、BigDecimal类【了解】1.包路径位于java.math包2.作用用来精准存储、运算浮点型小数解决double/float浮点运算丢失精度问题。3.常用构造方法public BigDecimal(String n)推荐使用字符串格式创建对象避免精度丢失。4.四则运算方法BigDecimal r1 bd1.add(bd2); //加法 bd1 bd2BigDecimal r2 bd1.subtract(bd2); //减法 bd1 - bd2BigDecimal r3 bd1.multiply(bd2); //乘法 bd1 * bd2//除法参数1除数参数2保留小数位数参数3取舍模式ROUND_HALF_UP四舍五入BigDecimal r4 bd1.divide(bd2,2,BigDecimal.ROUND_HALF_UP);