您的位置:首页 > 编程语言 > Java开发

一些java的基础知识

2017-03-30 16:34 274 查看

一、关于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里的全部元素时有很好的性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: