一、集合是保存一系列对象的容器,数组可以保存对象和基本数据类型,但是集合只能保存对象。
看代码和注释:
package CollectionList;
import java.util.ArrayList;
import java.util.List;
/**
* @author lenovo
*
*/
public class ListTest {
public static void main(String[] args) {
List list1 = new ArrayList(); //多态,ArrayList是底层以数组写的实现的类
/*
*
*/
list1.add(new String("yangchengju"));//盛装对象
list1.add(new Integer(3));
list1.add("我是杨成举"); //自动装箱!
System.out.println(list1);
System.out.println(list1.size());
//list1.isEmpty();
//list1.clear();//清空
System.out.println(list1);
List list2 = new ArrayList();
list2.add(333);
list2.add(444);
list1.add(list2);//[333,444]
System.out.println(list1);
}
}
- 1
以上代码是ArrayList接口的一些常用的举例,可以看到其中往集合里面丢进去一个字符串或者基本类型也是可以的,是因为利用了Java包装类的自动装箱和自动封箱原则
二、Java中的集合由两个接口派生出,Map和Collection两个接口,这两个接口各自派生出一些子接口或者一些已经实现的类。Collection接口是List、Set、Queue的父类,Map类保存的是具有映射关系的数据,每个数据由key-value对这两个值组成。Map中的Key不可以重复,所以Key可以用于作为集合里每项数据的标志(如同学生编号独一无二)。而Value可以重复。
三、对HashSet分析:
HashSet类是Set接口的一个子类特点:1、顺序可以发生变化。2、不同步,3、集合元素可以存储null。
当向HashSet里面存储一个元素时,会先调用该对象的hashCode()来得到一个hashCode值,通过这个值决定该对象在内存中的位置,如果在这个位子上本来就放着一值的话那么就调用equals函数比较这两个值是否相同如果相同那么久不会把这个元素存进来,如果不相同就会以链式的形式接在原有的值得后面。
package setpackage;
import java.util.HashSet;
import java.util.Set;
public class HashSet01 {
public static void main(String[] args) {
Set s = new HashSet();
s.add(1234);
s.add(1234);//调用hashCode(),equals()相同,所以重复,容器里不存这个数
System.out.println(s.contains(1234));//传入形参调用形参对象的equals函数看是否在容器里存在与之想等的值
System.out.println(s);
}
}
- 1
再看代码
package setpackage;
import java.util.HashSet;
import java.util.Set;
class A {
int a;
public A(int a) {
this.a = a;
}
}
public class SetTest {
public static void main(String[] args) {
Set set1 = new HashSet();
set1.add(1234);
set1.add(1234);//不可重复,语句作废
set1.add(new A(23)); //存入
set1.add(new A(23));//存入
System.out.println(set1.contains(new A(23)));//查询不到
System.out.println(set1);
}
}
- 1
上面三个new出来的A对象在堆中是不同的地址所以存入时的到不同的hashCode值,当我们对A类的hashCode、equals重写时会得到如下情况
package setpackage;
import java.util.HashSet;
import java.util.Set;
class A {
int a;
public A(int a) {
this.a = a;
}
public boolean equals(Object obj) {
return true;
}
public int hashCode() {
return 1;
}
}
public class SetTest {
public static void main(String[] args) {
Set set1 = new HashSet();
set1.add(1234);
set1.add("vsdvsdv");
set1.add(1234);//不可重复,语句作废
set1.add(new A(23));
set1.add(new A(23));//不存入
System.out.println(set1.contains(new A(23)));//查询的返回true
System.out.println(set1);
}
}
- 1
所以存入时比较的hashCode、equals函数是存入对象的类的函数,不是比较集合set1对象里面继承Object类的这两个函数。