java基础系列(四):基础知识点之间的区别
持续更新中。。。。
1.String,StringBuffer与StringBuilder的区别?
String底层是final修饰的byte数组,属于不可变的对象,但是可以通过反射改变它的值。操作String时会生成新的String对象,不仅效率低下,而且会浪费有限的内存空间。为了应对经常的字符串操作,就引入了StringBuilder类和StringBuffer类。
StringBuilder与StringBuffer类的方法和功能完全是等价的,都继承于AbstractStringBuilder。StringBuffer是线程安全的,里面的方法大都采用synchronized关键字进行修饰。StringBuilder不是线程安全的。StringBuilder和StringBuffer的字符操作都是通过调用System.arraycopy()来实现的,String的方法是通过new 一个新对象来实现的。三者的速度上:StringBuilder>StringBuffer>String。
2.Round,ceil与floor函数的区别?
round方法,在Math中有重载的,一个参数是float,一个是double,对应返回int和long值。返回值是当前值+0.5向下取整(-0.5 ---> 0);ceil方法,没有重载,参数就是double,返回值也是double,但是这个时候就有区别了,向上取整(-0.5 ---> -0.0),注意一下,负号是保留的,和round有区别的; floor方法,和ceil一样,没有重载,参数和返回值都是double,向下取整(-0.5 --> -1.0)。
3.System.arraycopy(), clone()和Arrays.copyOf的效率比较?
arraycopy()是本地方法,clone()也是本地方法,Arrays.copyOf()底层调用的是arraycopy()方法,效率比较:System.arraycopy>clone>Arrays.copyOf()
4.==,obj.equals()和Arrays.equals()方法的比较?
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。所以一般可以重写equals方法, 选取"内容"进行比较。
5.类的修饰符的作用范围
6.接口和抽象类
接口:
- 可以多继承(extends)
- 变量类型默认且只能为public static final,可以被继承
- 函数默认类型为public abstract,可以被 default修饰,且default只能用在接口中,有方法体,可以被继承,不可以被重写,可以有静态成员函数,但是静态函数不能被继承
- 没有构造器,可以new一个接口(匿名函数)
- 接口的修饰符可以默认不写和public,普通类的修饰符也是public和不写
抽象类:
- 跟普通类一样,除了是由abstract修饰
- 子类可以不覆写父类的抽象方法,但是子类也要声明成抽象类
- 可以有构造器,但是不可以new一个抽象类
7.文件名与类名的关系
一个文件中可以有多个类,如果没有public类,则可以与任意类名相同,如果有public类则文件名必须与此类名相同,因为一个文件中只能有一个public类。如果文件中只有一个类,则文件名不必与类名相同。