Java基础知识
重载与重写的区别
重载指的是在同一个类中,函数的方法必须一样但是参数顺序不同,个数不同,类型不同,返回值和访问修饰符可以不一样,发生在编译时。
重写发生在父子类中,方法名必须一样,参数列表必须一致。返回值类型范围必须小于等于父类,抛出异常范围小于等于父类,访问修饰符的范围必须大于父类。private类型的方法不可以被重写。子类对父类中的方法功能不满意,对该方法进行功能修改。
问题:
- 为什么返回值的范围和抛出异常的范围必须小于等于父类?
- 为什么访问修饰符的范围必须大于父类?
String,StringBuffer,StringBuilder之间的区别,String为什么是不可变的?
多变性
String类中使用final关键字字符数组保存字符串 private final char value[],所以String是对象是不可变。
StringBuffer和StringBuilder都是继承于AbstractStringBuilder类,它们的源码定义是char []value;
线程安全性
String中的对象是不可变的,也就可以理解为常量,线程安全。在StringBuffer中这些操作是添加了线程锁,所以线程是安全的。StringBuilder的并没有对方法进行同步锁,所以使非线程安全。
性能
每次对String类型进行改变的时候,都会生成一个新的String对象,然后引用指向新的地址。
StringBuffer每次都对自身进行操作,相同情况下,StringBuilder和相比StringBuffer性能提升了15%~20%,但是要冒着线程不安全的风向。
三者使用的选择:
- 操作少量的数据使用String;
- 在单线程下操作大量数据则使用StringBuffer;
- 在多线程下操作大量数据则使用StringBuilder。
自动装箱与拆箱
装箱:将基本类型转换为引用类型。
拆箱:将引用类型转换为基本类型。
equals 与 == 的区别
==对于基本类型比较的是数据的值,对于引用类型比较的是存储地址。
equals有两种用法:
- 对于未被类覆盖的equals方法使用方式和==一样;
- 对于类覆盖了的方法(即重写)equals比较的是两个对象的内容是否相等。
请注意以下几种情况:
- String中的equals已经被重写了,所以比较的是内容。Object中的equals方法是比较的对象的内存地址。
- 创建一个String对象,JVM会现在常量池中寻找相同的内容,如果有则把引用指向该内容,反之则创建一个新的内容。
关于Final关键字的一些总结
Final一般用于变量、方法、类
Final修饰基本类型的变量以后该值无法改变。对于引用类型的常量来说,一旦被指定该应用无法指向其他内存地址。
Final修饰类,这该类无法被继承。对应的该类里面的方法则被隐式的变为Final方法。
Final修饰方法,1.这样做是为了锁定该方法,无法被任何继承类修改2.提升效率,早期的Java,会将Final方法转为内嵌调用。如果方法过于庞大,内嵌式函数对于效率的提升并没有多少(现在的Java已经做出了优化,不在使用Final优化方法),类中所有的Private方法都隐式的指定为Final。