黑马程序员——集合二

来源:互联网 发布:360 手机网络收藏夹 编辑:程序博客网 时间:2024/06/05 09:33

点击打开链接 点击打开链接 点击打开链接 <a href="target=" _xhe_href="target=" blank"="">.Net培训、期待与您交流!">点击打开链接 点击打开链接



                                                                                                            集合二

              昨天写了两个自定义类,实现了自动扩充和存储任意类型的数据功能。其实在java中就已经提供了这样功能的类,就是集合。
简单来说,集合就是一个容器,能够存储多种数据的容器。而且这个容器像像气球一样,能够自动扩大。听起来就非常的牛叉啊。

            常用的集合有  ArrayList  、LinkedList 他们是有序的,都是从第0个索引处开始添加,而Hashset  和 Treeset是无序的,他们不会记录元素添加的顺序。并且Hashset  和 Treeset是不能存放重复的元素的。

            ArrayList是基于数组拓展出来的集合,他拥有数组的所有优势。同时在数组的基础上, 增加了可以自动拓展他的长度,同时在一个ArrayList中,可以存放任意一种数据类型 的元素,因为我们把这些元素统统当做是一个对象来进行存储的。他的实现方式是在类中创建
 一个object类的数组,增加了扩容的方法,当存储数据时先判断容量是否存满,如过不是,则  不自动增加容量,如果是则自动增长。这样就实现了自动扩容和存储任意类型的数据。
  
      
   LinkedList是基于链表方式拓展的集合,他拥有链表的优势,同样利用java特有的继承体系。object可以实现任意元素的存放,在存取的方式和ArrayList略有不同。但是在功能上是完全相同的。LinkedList存储数据的方式是将数据封装成特定的对象,这个对象拥有可以存储这个对象 地址的字段,从而实现对象存储另一个对象的地址,达到数据相互依存的另一种关系,就像锁链一样一扣环一扣,对象只和他相邻的对象发生关系,依托这种关系,达到顺藤摸瓜找到数据的原理。
   
   
   简单来说 ArrayList 和 LinkedList 的区别就是。ArrayList就像是一个大箱子,里面可以存放各种各样的小箱子,当大箱子装满时会自动将原来的大箱子里面的所有小箱子换成另一个更大的箱子来存放。 ArrayList对数据的查找替换数据优于LinkedList。  而LinkedList就像是串联关系,一个接一个,老鹰捉小鸡,老母鸡后面跟着一串儿小鸡。存储数据时,会把数据封装成一个对象 用上一个对象的某个字段存储该对象的地址,一个串一个,使对象间发生串联关系。LinkedList对数据 的添加删除要优于ArrayList。在选用时,考虑查询居多还是添加删除居多,来选择其一。

           Hashset具有良好的存储和查找功能。允许存放null,但是最多只能存放一个,因为 
Hashset 认为两个null是相等的,而他是不能存放重复元素的。那么Hashset的判断重复标准是什么呢?
           1、先判断两个元素对象的hashCode:如果不相等就直接认为两个是不同的元素
            2、 如果两个元素对象的hashCode相等,然后在判断equals方法,如果返回false说明两个是不同的元素,如果返回true,则不会添加到HashSet中。

           当然,根据我们以往的经验, 
hashCode和equals都是object的方法,所以要达到我们所需要的需求,就需要对这两个方法进行复写。代码如下:

/**
 * 5.请使用代码的形式验证 HashSet 中添加元素是通过
     *   hashCode 和 equals 两个方法来判断元素重复的
 * 
 * 代码测试:
 */

public static void main(String[] args) {
HashSet hash = new HashSet();
Person p1 = new Person("侯玉东1", 25);
Person p2 = new Person("侯玉东", 25);
Person p3 = new Person("侯玉东", 25);
hash.add(p1);
hash.add(p2);
hash.add(p3);
// 没有复写hashCode 和 equals 两个方法来
// 利用他本身判断元素重复的
// System.out.println(hash);//[name=侯玉东, age=25, name=侯玉东, age=25]
// System.out.println(p1.hashCode() == p2.hashCode());//false
// System.out.println(p2.equals(p1));//false
// 复写hashCode方法,让hashCode相同,用equals来判断
System.out.println(hash);//[name=侯玉东, age=25, name=侯玉东, age=25]
System.out.println(p1.hashCode() == p2.hashCode());//true
System.out.println(p2.equals(p1));//false
// 复写equals方法,让equals相同,用hashCode来判断
System.out.println(hash);//[name=侯玉东, age=25, name=侯玉东1, age=25]
System.out.println(p1.hashCode() == p2.hashCode());//false
System.out.println(p2.equals(p1));//false
}
}

class Person{
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

 
@Override
public String toString() {
return "name=" + name + ", age=" + age;
}

 
@Override
public int hashCode() {
return this.age + this.name.hashCode();
}

 
@Override
public boolean equals(Object obj) {
Person p = (Person)(obj);
return (this.age == p.age) && (this.name.equals(p));
}
}

点击打开链接 点击打开链接 点击打开链接 <a href="target=" _xhe_href="target=" blank"="">.Net培训、期待与您交流!">点击打开链接 点击打开链接

0 0