您的位置:首页 > 编程语言 > Java开发

java集合的简要体系结构

2016-07-06 19:08 567 查看
Iterator
--ListIterator
ListIterator列表迭代器的由来:
当我想在迭代器迭代时添加元素,如果使用集合类对象的add方法就会出现并发修改异常 ConcurrentModificationException
而继承Iterator的ListIterator就有增删改查的功能

Collection
--List
----ArraryList 数组列表(查询快,修改慢)
----LinkedList链接列表(查询慢,修改快)
----Vector 底层是数组被ArrayList替代了
--Set
--HashSet
--LinkedHashSet
--SortedSet
--TreeSet

Map
--HashMap哈希映射
--TreeMap树映射
工具类
Collections 是操作Collection类和子类的工具类,提供了很多封装好的函数
Arrays  Array类及子类的工具类
比较类
Comparable  使类的不同实例之间具有可比性
Comparator 比较器,定义类比较的规则


List是列表,有索引,所以list集合中的元素是可以重复的,而且顺序存储,也就是说迭代的顺序和元素插入集合的顺序是一致的。

Set类似于数学中的集合,具有互异性,确定性,无序性。如果你想要集合中的元素具有唯一性,那么Set是不二选择。那么Set如何保证元素的唯一性的呢?

当集合中保存的是自定义类型时,调用对象的hashCode()方法得出对象的hash码,如果两个对象的hash码相同,就会调用对象的equals()方法

如果再相同就不会把对象插入集合容器。

那么问题来了

如果两个对象的内容是相同的,那么hash码肯定是相同的,这时就会调用equals()方法,然而Object对象的equals()是比较引用,也就是说类的实例只和自身相等。equals()肯定会返回false,这时内容相同的两个对象就会插入集合容器

解决方案

重写equals()方法

package cn.com.oracle;

public class Student {

private String name ;
private int age;

public Student() {
}
public Student(String name, int age) {

this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}

/**
* 可以看到hash码值和对象的内容有关,内容相同的对象,hash值肯定相同
*/
@Override
public int hashCode() {
System.out.println("调用了hashCode()");
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
System.out.println("调用了equals()");
if (this == obj)//如果内存地址相等,肯定相等
return true;
if (obj == null)//null不与任何对象相等
return false;
if (getClass() != obj.getClass())//如果类型不同,肯定不同
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

}


package cn.com.oracle;

import java.util.HashSet;
import java.util.Set;

/**
*
* @author 格拉.香农
*
*/
public class SetTest {

public static void main(String[] args) {
Set<Student> set=new HashSet<Student>();
set.add(new Student("wangwu",20));
set.add(new Student("lisi",19));
set.add(new Student("zhangsan",23));
set.add(new Student("zhangsan",23));

for(Student stu:set)//使用for each代替迭代器,代码更简洁
{
System.out.println(stu);//打印一个对象,会调用这个对象的toString()方法
}
}

}




TreeSet类会强制对容器中的对象排序但需要对象所属的类实现Compareable接口,重写compareTo方法给出排序的方式,往容器中存储对象时编译器会自动调用compareTo方法。比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

( a)元素具备比较性 b)定义比较器,传给Set的构造函数)



Comparator比较器



Map集合

遍历key

遍历value

遍历k/v

package cn.com.oracle;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class MapTest {

public static void main(String[] args) {

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("哇哈哈", 3);
map.put("健力宝", 4);
map.put("东方树叶", 5);

// 遍历key
Set<String> keySet = map.keySet();
for (String str : keySet)
System.out.println(str);

// 遍历value
Collection<Integer> values = map.values();
for (Integer str : values)
System.out.println(str);

// 遍历key/value
Set<Entry<String, Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> str : entrySet)
System.out.println(str);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 迭代器