JAVA--------集合(一)

来源:互联网 发布:好运通超市软件 编辑:程序博客网 时间:2024/05/18 13:42

JAVA--------集合(一)

      像我么懒得人竟然想起来做笔记,真是不可思议中的不可思议。哎!实在是今天不知道该干些什么好。对于我来说给别人讲东西,或者花大量时间来做笔记之类的收获都是及其少的或者压根就没有收获。我更加喜欢的是听别人讲或者自己看。但是事实不断的告诉我,人是健忘的,做笔记写博客也是必要的。好了,不扯淡的直接进入主题。

一、集合的接口。

      当我们需要用到集合的相关类时我们需要import java.util.*;    JAVA给我们提供了一些集合的接口给我们使用,如Collection、Set、list,Map。这些接口都定义了很多对集合操作的方法的定义,但是没有具体实现。当然JAVA也给我们提供了一些它们的实现类,但是我们先不去看那些具体的实现类,先来看看这些接口的关系以及它们的特征。

现在我们可以看到Set与List两个接口都是继承自Collection,而Map却不是。它们都有着各是的实现类,这些类是可以直接使用的。当然了,还有其他的实现类,这里我们只给出这几个常用的实现类。

Set:实现Set接口的类有一个最大的特征,无序且不能重复。

List:实现List接口的类的特征是有序且可以重复。

二、常见的实现类

     HashSet:底层是用Hash表实现的。里面保存的对象无序且不能重复。
     LinkedList:底层是用链表来实现的,里面保存的对象有序且可以重复。
     ArrayList:底层是用数组来实现的,里面保存的对象有序且可以重复。

我们先来看一个代码:

import java.util.*;
public class CollectionDemo {

public static void main(String[] args) {

Collection collection =new HashSet();//Set是一种无序的且不可以重复的容器

collection.add("hellow");

//              collection.add("hellow");
collection.add(new String("world"));
collection.add(new Name("li","wenzhuo"));
//              collection.add(new Name("li","wenzhuo"));      
// collection.remove("hellow");
// collection.remove(new String("world"));
// collection.remove(new Name("li","wenzhuo"));

System.out.println(collection);
}


}
class Name{
private String firstName,lastName;

public Name(String mfirstName,String mlastName){
this.firstName=mfirstName;
this.lastName=mlastName;
}


public String getFirstName() {
return firstName;
}

public String getLastName() {
return lastName;
}

public String toString() {
return "Name [firstName=" + firstName + ", lastName=" + lastName + "]";
}

     这里我们定义了一个内部类Name,保存firstName,lastName这两个变量。并提供了相应的get方法以及一个toString方法便于打印。

    首先我们创建了HashSet对象。通过对象的add()方法往里面添加了三条数据, add方法接受的参数就是我们需要添加的对象。前两条是String类型的对象,最后添加的一条是我们自己定义的对象。

最后我们来看下打印的结果:

[world, Name [firstName=li, lastName=wenzhuo], hellow]

果然里面的数据并不是按照我们添加的顺序打印的,它是无序的。

我们再看下下面的代码,我们仅仅改动两句代码。这里我们仅仅解除 //collection.add("hellow")和
//collection.add(new Name("li","wenzhuo"));的注释。分别添加两个相同的"hellow"和Name对象。这里我添加的都不是引用,为了方便我们看到内部的一些原理。
import java.util.*;
public class CollectionDemo {


public static void main(String[] args) {

Collection collection =new HashSet();//Set是一种无序的且不可以重复的容器

collection.add("hellow");
                collection.add("hellow");
collection.add(new String("world"));
collection.add(new Name("li","wenzhuo"));
        collection.add(new Name("li","wenzhuo"));
// collection.remove("hellow");
// collection.remove(new String("world"));
// collection.remove(new Name("li","wenzhuo"));

System.out.println(collection);
}


}
class Name{
private String firstName,lastName;

public Name(String mfirstName,String mlastName){
this.firstName=mfirstName;
this.lastName=mlastName;
}


public String getFirstName() {
return firstName;
}

public String getLastName() {
return lastName;
}

public String toString() {
return "Name [firstName=" + firstName + ", lastName=" + lastName + "]";

}

好了,我们再打印下结果:

[world, Name [firstName=li, lastName=wenzhuo], Name [firstName=li, lastName=wenzhuo], hellow]

咦...好奇怪。不是说HashSet类里保存的数据不能重复吗,我们发现我们添加的两个"hellow"对象确实没有重复,但是Name对象却重复了,这是为什么呢?

其实在我们观察String类的内部,发现里面封装了两个方法equals方法和hashCode方法,我们重点理解equals方法,当我们将对象放入集合时,JAVA首先做的是将该对象和集合中的每一个对象做比较,判断两个对象是否equals,如果equals则两个对象相同,不放入,否则放入。而我们自己写的Name类却没有给出判断equals的方法,我们可以自己写该方法。这里我为了方便直接获取JAVA提供的。

代码如下:

import java.util.*;
public class CollectionDemo {


public static void main(String[] args) {

Collection collection =new HashSet();//Set是一种无序的且不可以重复的容器

collection.add("hellow");
collection.add("hellow");
collection.add(new String("world"));
collection.add(new Name("li","wenzhuo"));
   collection.add(new Name("li","wenzhuo"));
// collection.remove("hellow");
// collection.remove(new String("world"));
// collection.remove(new Name("li","wenzhuo"));

System.out.println(collection);
}


}
class Name{
private String firstName,lastName;

public Name(String mfirstName,String mlastName){
this.firstName=mfirstName;
this.lastName=mlastName;
}


public String getFirstName() {
return firstName;
}

public String getLastName() {
return lastName;
}

public String toString() {
return "Name [firstName=" + firstName + ", lastName=" + lastName + "]";
}


@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
return result;
}


@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Name other = (Name) obj;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
return true; 
}
}

我们只是在原代码基础上添加了这两个方法。观察结果:

[world, Name [firstName=li, lastName=wenzhuo], hellow]

发现现在确实不会重复了。
此外我们可以调用集合对象的remove()方法,该方法用于将一个对象从集合中移除。我们想要移除哪个对象就将该对象或对象的引用作为参数传递给该方法。这个方法在移除时,会将我们传递的对象和集合中的对象一一计较。判断是否equals如果存在两个对象相等,则移除。
      好了,笔记先写到这里。下一篇笔记重点讲解集合类的迭代器(Iterator)。
原创粉丝点击