标签:
最近在培训班的进度比较快,这段时间学习了集合、异常、文件、和网络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)); } }
标签:
原文地址:http://www.cnblogs.com/ILoveLinux/p/4486578.html