一些java的基础知识

一、关于final常量

  1. 不能使用默认初始化;
  2. 可以显式赋值、代码块、构造器赋值;
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里的全部元素时有很好的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值