特点
- List 存储的值可以重复, 集合 按照对象的进入的顺序保存对象,不会做额外的排序操作,是一种有序的存储。
- Set 存储的值不可以重复,是一种无序的存储,遍历较慢,随机插入较快。
- Map 存储的键 不可以重复,但是值可以重复,是一种无序的存储。
- ArrayList List接口的实现类,允许对 集合中的对象随机访问,但是随机插入较慢,推荐用来遍历。
- LInkedList 插入和删除的开销非常少,但是随机访问较慢。
- HashSet Set 接口的实现类 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
- HashMap 采用散列存储 通过 【键】来获得值,【键】 不可以重复。
ArrayLIst
常用方法
- get() 获取指定位置的对象
- size() 获取集合的大小
- add() 向集合最后追加元素
- clear() 清空集合中的所有的元素
Demo
public static void dmeoOfList() {
ArrayList<String> sList = new ArrayList<String>();
//想集合中添加一些元素
for (int i = 0; i < 10; i++) {
sList.add(String.valueOf(i));
}
System.err.println("集合中对象当前的数量为:" + sList.size());
// 清空所有的元素
sList.clear();
System.err.println("集合中对象当前的数量为:" + sList.size());
}
LinkedList
LinkedList 是一种双向的链表
常用方法
addFirst() 在链表的头部插入对象
addLast() 在链表的尾部插入对象
remote() 移除对象 , 有多个重载形式
Demo
public static void demoOfLinkedList() {
LinkedList<String> linkedList = new LinkedList<String>();
// 在链表的头部插入内容
linkedList.addFirst("第一位");
// 在指定的位置插入指定的内容
linkedList.add(1, "中间插入的");
// 在链表的尾部插入内容
linkedList.addLast("最后一位");
//移除指定位置的元素
linkedList.remove(0);
//遍历所有内容
for (String item : linkedList) {
System.out.println(item);
}
}
HashSet
HashSet 是不允许有重复的值的,判断的依据是, 集合中是否相同的 通过 hashCode方法来检查是否有相同的 哈希值 ,如果对象的哈希值相同那么,就执行对象的 equals() 方法进行判断 如果 equals()方法返回的同样是true 那么就认为这两个对象相同。
验证
package Program;
import org.omg.CORBA.ORBPackage.InconsistentTypeCode;
public class Person {
private String idNumber;
private String name;
private int age;
public Person(String idNumber, String name, int age) {
super();
this.idNumber = idNumber;
this.name = name;
this.age = age;
}
public Person() {
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
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;
}
/*
* 因为我们每一个人的身份证号是唯一的所以,如果身份证号相同那么就认为,两个person对象是一个person对象
* */
@Override
public boolean equals(Object obj) {
System.out.println("equals");
Person person = (Person) obj;
return person.idNumber.equals(this.idNumber);
}
/*
* 为了验证方法的执行将所有的 对象的hashCode方法都返回一个相同的值
*/
@Override
public int hashCode() {
System.out.println("hashCode Method");
return 1;
}
}
调用
public static void demoOfHashSet() {
Person firstPerson = new Person("123456","firstPerson",11);
Person secondPerson = new Person("123456","secondPerson",11);
HashSet<Person> hashSet = new HashSet<Person>();
hashSet.add(firstPerson);
hashSet.add(secondPerson);
System.out.println("当前集合对象的数量:"+hashSet.size());
for (Person person : hashSet) {
System.out.println("IdNumber: "+person.getIdNumber()+" Name "+person.getName()+" Age "+person.getAge());
}
}
//输出结果
hashCode Method
hashCode Method
equals
当前集合对象的数量:1
IdNumber: 123456 Name firstPerson Age 11
以为我们重写了,我们的 hashCode 和 equals 方法 ,每一次插入的时候都会 执行 hashCode 方法 ,当我们插入第二条记录的时候,我们看到,因为我们的hashCode方法都返回了相同的值,第一次插入数据的是时候是没有问题的, 但我们插入第二条记录的时候,因为 hashCode方法是相同的就会执行 equals 方法 ,我们重写了equals 方法 通过 idnumber 来判断 对象是不是 相同,随意第二条记录别没有被插入进去。
Map
public static void demoOfHashMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "1");
map.put("2", "2");
//这里会将原来的值覆盖掉
map.put("1", "1.1");
//通过 键-值 的set集合遍历
for (Map.Entry<String, String> item : map.entrySet()) {
System.out.println("Key " + item.getKey() + " value " + item.getValue());
}
//通过 key 的set集合遍历
for (String item : map.keySet()) {
System.out.println("Key "+item +" vluae "+map.get(item));
}
//这种方式仅仅能获取值
for (String item : map.values()) {
System.out.println("value "+item);
}
}