一、关于final常量
- 不能使用默认初始化;
- 可以显式赋值、代码块、构造器赋值;
class Test{
final int I = 0;
final String NAME;
final double PI;
{
NAME = "china";
}
public Test(){
PI = 3.14;
}
public Test(double d){
this();//每个构造器都需要给final 变量赋值,
// PI = d;//可调用无参构造器赋值,或者显示赋值
}
}
二、关于方法throws的Exception
1.一个方法调用了使用throws抛出异常的另一个方法,调用者必须对异常进行处理,或者继续throws;
public void throw1() throws Exception{
int i = 1;
}
public void throw2(){
throw1();//必须方法内try catch 处理,或者方法申明时继续throws
}
三、关于HashSet和LinkedHashSet
1 . Set中的元素在底层存储的位置是无序的;
2 . Set中的元素是不可重复的;
String str1 = new String("abc");
String str2 = new String("abc");
//要求对象各属性值均不同。即使是new的对象,只要属性值相同,也视为重复的。如str1和str2
//因为String重写了Object的hashcode()方法,根据属性值计算hash值,因此属性值相同,hash值就相同。
3 . 因此,要求存入Set中的自定义对象要重写hashCode()和equal()方法,保证Set中元素的不可重复性;
当向Set中添加对象时,会首先调用对象的hashcode()方法,计算此对象的hash值,此hash值决定了此对象存在Set中的位置。若此位置之前没有对象,则该对象直接存储到此位置。若此位置已有对象,再通过equal()方法比较两个对象是否相同。若相同,后一个对象就不能再添加进去。(要求最好保证hashCode比较的结果要与equal比较的结果一致)
class Person{
int age;
String name;
//常用重写hashCode的方法
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
}
4 . 使用哈希算法,降低了比较的复杂性,若不使用哈希算法,每次向Set中存入元素,都要与Set中已有的所有元素进行比较,过于复杂。
5 . HashSet按hash算法来存储集合中的元素,因此具有很好的存取和查找性能。但是不能保证元素的排列顺序。
6 . LinkedHashSet是HashSet的子类,在根据hashCode值决定元素存储位置的同时,使用链表为元素建立前向和后向索引,来维护元素的词序,这使得元素是以插入顺序保存的。
7 . 因此,LinkedHashSet的插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。