java基础专题
包装类缓存问题
在 JDK 5 以后,几种包装类对象在内部实现中通过使用相同的对象引用实现了缓存和重用。
例如:Integer类型对于-128-127之间的数字是在缓冲区取的,所以对于在这个范围内的数值用双等号(==
)比较是一致的,因为对应的内存地址是相同的。但对于不在这区间的数字是在堆中 new 出来的,所以地址空间不一样,也就不相等
- Byte、Short、Integer、Long 缓存范围:[-128,127]
- Character 缓存范围:[0,127]
- Boolean 直接返回 True Or False
注意:浮点数类型的包装类 Float 和 Double 并没有实现常量池技术
Boolean部分源码
1 | // 一开始就定义 TRUE FALSE 两个常量 |
character部分源码
1 | // 此方法通常优先于构造函数, 原因也是产生更好的时间和空间性能 |
Byte部分源码
1 | public static Byte valueOf(byte b) { |
Short部分源码
1 | public static Short valueOf(short s) { |
Integer部分源码
valueOf方法源码
1 | // 该方法缓存的值总是在-128到127之间,并可能缓存该范围之外的其他值 |
IntegerCache源码
1 | /** |
总结:
1、引用类型的==是比较对应的引用地址
2、Integer中使用的默认缓存是-128到127。但是可以在JVM启动的时候进行设置。
3、Integer b=Integer.valueOf(8);和Integer b=8;是一样的效果
4、Integer.valueOf()方式,比较是否在缓存范围之内,在就直接从缓存中获取,不在new一个Integer对象
5、每次使用new来创建Integer对象,是用不到Integer Cache缓存的
6、Integer中的使用缓存的方式也可以理解为享元模式
面向对象的特征有哪些方面?
四大基本特征:封装,继承,多态,抽象
封装
将对象封装成一个高度自治和相对封闭的个体,对象的状态由这个对象自己的行来读取和改变,即:类的属性私有化,对外提供改属性的获取或改变的方法
优势:
- 通过隐藏对象的属性来保护对象内部的状态
- 提高了代码的可用性和可维护性,因为对象的行为可以被单独地改变或扩展
- 禁止对象之间的不良交互提高模块化
抽象
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处
对比:抽象关注对象的行为,而封装关注对象行为的细节
继承
子类继承父类,拥有父类的基本属性和方法,通过重写父类方法实现代码复用,也可以对自身方法进行扩展,达到功能的增强
多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
多态可以分为 编译时多态 和 运行时多态
编译时多态:方法的重载编译时多态
运行时多态:子类继承父类,类实现接口
多态存在的三个必要条件
- 要有继承
- 要有重写
- 父类引用指向子类对象
多态的作用:消除类型之间的耦合关系
成员变量(全局变量)和局部变量的区别?
定义的位置
- 局部变量定义在函数中,语句内
- 成员变量定义在类中
内存中的位置
- 局部变量存储在栈内存中
- 成员变量存储在堆内存中
初始化值
- 局部变量没有默认初始化值,必须赋值才可以使用
- 成员变量有默认初始化值
生命周期
- 局部变量一旦作用区域结束,就立刻释放
- 成员变量也称为实例变量,随着对象创建而创建,随着对象回收被回收
HashSet和TreeSet的区别是什么?
HashSet
- 不能保证元素的排列顺序,顺序有可能发生变化
- 集合元素可以是null,但只能放入一个null
- HashSet底层是采用HashMap实现的
- HashSet底层是哈希表实现的
TreeSet
- TreeSet中的数据是排好序的,不允许放入null值。
- TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
- TreeSet的底层实现是采用二叉树(红-黑树)的数据结构
用什么方法来区分Set里的元素是否重复?
Set 里的元素是不能重复的,用iterator()方法来区分重复与否,equals()是判读两个Set是否相等。
equals()和 ==方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值
对Error和Exception的理解
首先两者继承自Throwable类,Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。 Error 是指程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM出现的问题
异常分为 运行时异常 与 其他异常。
运行时异常(不受检异常):空指针异常、数组索引越界异常
其他异常(受检异常):例如 IOException
使用 try catch finally 进行处理