码迷,mamicode.com
首页 > 编程语言 > 详细

java初学集合

时间:2015-05-08 01:42:23      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

最近在培训班的进度比较快,这段时间学习了集合、异常、文件、和网络4个方面的内容。都比较浅显,属于基本用法,主要是总结一下,为以后深入学习打下基础。

 

集合:

按照我目前的理解水平。集合是重要的数据结构类型,使用集合可以将数据集中起来,方便管理。这种管理主要是指:增加,删除,查询,修改,插入。

集合有两大家族:collection和map家族:他们的关系如下:

技术分享技术分享技术分享

其中第一张图是collection图,描述的是collection主要成员。collection有两个主要成员,set(接口)、list(接口),继承set的类内部数据存储都是无序的,继承list接口的类内部数据都是有序列的。list及其继承类是有序的,类似数组,list于数组的区别是,数组定长的,而list是不定长的,list继承了collection,collection数据有增、删、查、改,分别是方法add、remove、get、set,常用的子类是Arrylist类。set的数据结构是无序的,set按照数据是否相等存储,后面的数据覆盖前面的数据。无须结构的数据遍历可以使用标准迭代器或者foreach循环来实现,set下面主要使用的类是hashset。

第二张图是map接口及其子类。map内的数据结构是键值对(key-value)的结构。键是不可以重复的,存储的键值有点像set结构,map内的数据结构也是无序的。取map内的数据有点麻烦,因为map的数据是一对一对出现的,取map数据要先将key值转化为set结构,然后通过key值读取map内的数据。这种方式就是第三章图所绘画的,map隐隐的连着collection,collection隐隐的连着interater(迭代器)。

这里需要指出的一个初学者可能犯的错误是:集合只是将一堆数据储存起来以方便管理,它并没有产生新的数据。这话的意思是我们仅仅创建了一个对象,不断的修改这个对象,并将修改后的对象添加到集合中,结果是所有集合内的数据都是一样的,都是我们最后修改的那个。例子代码如下:

import java.util.List;
import java.util.ArrayList;

public class T002 {
    public static void main(String[] args) {
        Student std1 = new Student();
        std1.set("a", 20, false);
        List list = new ArrayList();
        list.add(std1);
//下面注释掉的代码是正确添加元素的代码
        // std1 = new Student();
//Student的set方法没有重新创建对象,仅仅是修改了std1的值,其实是仅仅创建一个对象    
        std1.set("b", 21, true);
        list.add(std1);
        for (Object o : list) {
            System.out.println((Student) o);
        }
    }
}

//写在一个文件中,其他外类不能带有public
class Student {
    public String name;
    public int age;
    boolean sex;
//建一个设置值的方法方便设定值
    public void set(String name, int age, boolean sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

//重写打印方法,方便打印
    @Override
    public String toString() {
        return "My name is "+name+",I am "+age+" years old"+",I am a "+(sex?"man":"girl");
    }
}

上面这段代码打印出来的是两行(list中有两个元素嘛),但是输出的结果却是一样,跟我们预想的不一样。这里就是上面说的,集合并不创建对象|数据,它仅仅是管理对象|数据,不要妄想集合帮你创建新的对象。

在集合中还有一个需要注意的是就是集合继承object中的equal方法,在实际项目中常常需要我们重写。那么这是就根据我们的需求重写,这个每个人根据自己的需求设计。有点要指出,当我们重写equals方法的时候,还必须要重写Object的另一个方法:hashcode()。equals方法并直接需要hashcode的支持,但是hashcode对于对象在今后的查询等操作时意义巨大,所以在JDK文档中有这样两句话:equals “注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。”,hashcode:“如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 ”就是说当设计者的意图是当hashcode不同时,equals也一定不同,这样就提高了程序的效率。这个是一个约定,两者病没有死的关联,但是大家都认为hash不同,这两个对象一定不相等,所以在修改equals也必须修改hashcode。比如下面两个hash不同,但是他们是equal的:

class Exemple {
    public void show(){
        System.out.println("Hello world!");
    }
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return true;
    }
    
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return super.hashCode();
    }
}

public class T002{
    public static void main(String[] args) {
        Exemple E=new Exemple();
        Exemple e=new Exemple();
        System.out.println(E.hashCode());
        System.out.println(e.hashCode());
        System.out.println(E.equals(e));
    }
}

java初学集合

标签:

原文地址:http://www.cnblogs.com/ILoveLinux/p/4486578.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!