==String类==
从类的声明,我们看出,String类继承了Serializable,Comparable和CharSequence接口
主要的属性有:value 和 hash
value是一个字符数组,用来存储字符串
hash是String的hash值缓存,方便比较
String是不可以修改对象的。
StringBuilder和StringBuffer可以修改对象的。
String是不可变的,如果尝试去修改,会新生成一个字符串对象,StringBuffer和StringBuilder是可变的
StringBuffer是线程安全的,StringBuilder是线程不安全的,所有在单线程环境下StringBuilder的效率会高一点
是否可变 | 是否安全 | 性能 | |
---|---|---|---|
String | 不可变 | 安全 | 低 |
StringBuilder | 可变 | 不安全 | 高 |
StringBuffer | 可变 | 安全 | 较高 |
数组是一个空对象
int[] array = null; 数组为空,此时array不指向任何对象;
数据里面的元素为0
int[] array = new array[0]; // 定义一个长度为0的数组; int[] array = new array[2]; // 定义一个长度为2的数组,此时如果数组没有被初始化,默认的值为null;
两者如果在一句代码中,则要先判断是否为空,否则可能会出现空指针异常
if(array == null || 0 == array.length) {...} // 这种写法正确
==面试题:==和equals的区别==
====:==
可以使用在基本数据类型变量和引用数据类型变量中
如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等(不一定类型要相同)
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
String s1 = new String("atguigu"); String s2 = new String("atguigu"); System.out.println(s1 == s2); //false String s1 = "atguigu"; String s2 = "atguigu"; System.out.println(s1 == s2); //true
==equals()方法==
是一个方法,而非一个运算符
基本数据类型没有方法调用,只能使用引用数据类型来调用
Object类中的equals()方法的定义:
public boolean equals(Object obj){ return (this == obj); }
说明:Object类中的定义的==equals()== 和 == 定义是相同的,是比较两个对象的地址值是否相等
String、Data以及其他类型的equals()方法并不是像3中那样定义的,而是进行了重写Object中的equals(),比较的不是地址值了,而是比较的两个对象的“实体内容”是否相同
通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”是否相同。那么,我们就需要对Object中的euqals()方法进行重写,具体的重写方法如下:Customer是一个类
@Override public boolean equals(Object obj){ if(this == obj){ return true; } if(obj instanceof Customer){ Customer cust = (Customer)obj; //比较两个对象的每个属性是否相同 return this.age = cust.age && this.name.equals(cust.name); } return false; }
其实就是比较对象里面的所有的属性是否一致,一致就返回true,不一致就返回false
修饰类:表示类不可被继承
修饰方法:表示方法不可被子类覆盖(override),但是可以重载(overload)
修饰变量:表示变量不可以被修改
为什么 局部内部类 和 匿名内部类 只能访问局部final变量?
因为:因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效
finally:异常捕获的时候需要用到的,try中return后的代码会执行吗?会的,调用finally的时机是try块真的要return时。
finalize:是Object类中的一个方法。垃圾回收机制中 如果想被回收的时候不是真的被回收,第二次被gc回收的时候才能回收。finalize()只会在对象内存回收前被调用一次
抽象类可以存在普通成员函数,而接口中只能存在public abstract方法
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final
抽象类只能继承一个,接口可以实现多个
接口的设计目的,是对类的行为进行约束 like a
抽象类的设计目的,是代码复用,现有子类,再有父类,对子类的共同部分进行提取,抽象类是不可以实例化的。