**Android成长系列 Java篇 **
博客创建时间:2022.04.01
博客更新时间:2022.04.02
以Android studio build=7.0.0,SdkVersion 31来分析讲解。如图文和网上其他资料不一致,可能是别的资料版本较低而已
前言
Java基础是Android开发成长阶梯,基础越牢固高楼才能建的越高。该博客将是自身知识体系的基石部分,不断地学习总结才能构建自身心中的那颗Android技能树。
java中==和equals和hashCode的区别?
1. ==
1)在8种基本数据类型中,使用比较的是值
2)在引用类型中使用,比较的是内存中的存放地址
2. equals
1)如果equals()方法没有重写,都是调用Object类的equals方法,比较的是内存地址
2)如果重写了equals()方法,则根据重写设定的条件判断
3. hashCode
通过hash算法获取到的对应物理地址值,hashCode()与equals()需要同步进行重写与否,否则报错。(一般判断两个类equals,其实暗藏一个条件就是hashCode也需要相等)
为什么equal 与hashcode 方法需要同步重写?
如在一个HashMap中两个元素A、B,若果A.equal(B),那么两者的HashCode必定相同,不然不会判定为equal。 所以equal与hashCode方法需要同步重写
内部类及其作用
将一个类定义在一个类或者一个方法里面,这样的类称着内部类
- 成员内部类
- 静态内部类
- 匿名内部类
- 局部内部类
内部类与普通类相比最大的作用其实封装性,限制此类的访问权限。 内部类其他的作用其实普通类都能达到。
抽象类和接口区别?
- 抽象类要被子类继承,接口要被类实现。
- 接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
- 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
- 抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。
- 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。
- 一个类可以实现多个接口,但只能继承一个抽象类。
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。
而抽象类在代码实现方面抽象类别,可以实现代码的重用
java多态的理解
从字面上理解,多态就是一个事物在不同情况下有多种状态。
从多态的3个前提:
- 存在继承关系
- 重写方法
- 父类引用指向子类
作用:理清层级关系、减少代码
String、StringBuffer、StringBuilder区别
- 三者都是final类,不允许被继承
- StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能。StringBuilder的方法中使用大量的synchronized 同步锁
- 运行速度:StringBuilder > StringBuffer > String。String为字符串常量,执行中不断创建新变量及进行垃圾回收
- String实现了三个接口:Serializable、CarSequence、Comparable,
StringBuilder 与 StringBuffer 只实现了前两个接口,仅String可以使用compareTo方法
String为什么要设计成不可变的?
-
字符串常量池(String pool,String intern pool, String保留池) 是Java堆内存中一个特殊的存储区域,当创建一个String对象时假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象
-
String 使用非常频繁,如下地址URL、各种路径path、反射机制参数等,都希望字符串的hashcode是唯一不可变的,否则会带来其他安全隐患。
Math常用的几种方法
- Math.round():四舍五入,+0.5后向下取整Math.round(11.5)=12,
Math.round(-11.5)= -11,float返回int,double返回long - Math.sqrt():开方
- Math.rint():四舍五入,遇0.5则取偶数(Math.rint(11.4)=11.0, Math.rint(11.5)=12,Math.rint(10.5)=10)
- Math.floor():不大于它的最大整数(Math.floor(11.5)=11, Math.floor(-11.5)=-12)
- Math.ceil():不小于他的最小整数(Math.ceil(11.5)=12,Math.ceil(-11.5)=-11)
- Math.abs():绝对值(Math.abs(11.5)=11.5,Math.abs(-11.5)=11.5)
- Math.max():最大值(Math.max(-11.5, -11.4)=-11.4)
- Math.min():最小值(Math.min(-11.5, -11.4)=-11.5)
- Math.random():0.0-1.0之间的随机数
- Math.pow(x, y):x的y次幂
- Math.sqrt():开方
静态属性和静态方法是否可以被继承?是否可以被重写?
想一想,静态方法是类所有,所有的子类都是共有的,所以今天方法是不能被重写的。
静态方法和属性是可以被继承的。
final,finally,finalize的区别
final:
修饰符,修饰后的类不可被继承。修饰的变量或方法不能被改变,只读。
finally:
try catch 的最终处理标识字段。
finalize:
Java Object类中提供的一个方法,该方法确保垃圾回收执行前触发,可以在该方法中编写一些代码,进行保活、监控等操作。
Serializable 和Parcelable 的区别
Parcelable是android特有的序列化API,一般只用于内存数据的序列化或反序列化,如果强制适用于网络传输或本地保存,因不同Android版本的Parcelable实现也是不一样的,序列化和反序列化会有问题。(将数据拆分为多个Intent支持的基本数据类型)
Serializable 将Java对象转换成二进制文件进行网络通信或本地保存。但是它的序列化和反序列化效率较低,使用了反射机制,过程中会创建很多临时对象。
相关链接:
博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !