1. HashSet
HashSet内部的数据结构是哈希表。在存储元素时,要使用hashcode方法确定位置。如果位置相同,再根据元素的equals来确定是否相同。
注:在String中,复写了equals方法,比较的是字符串的内容。
@Override
public int hashCode()
{
return name.hashCode() + age;
}
@Override
public boolean equals(Object obj) {
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
以上代码是在HashSet中自定义Person对象,在Person对象中,要覆盖两种方法。
补充:LinkedHashSet内部有双向链表确保有序。
2.Map.Entry
想要输出Map集合中的key和value,一般采用先使用keySet获取key值,返回的是一个key的set集合,再通过迭代器get(key)获取对应的value值。而Map.Entry可以一次性获取键值对。
HashMap<Integer,String> hm = new HashMap<Integer,String>();
hm.put(1, "a");
hm.put(2, "aa");
hm.put(3, "aca");
hm.put(4, "bab");
Iterator<Map.Entry<Integer, String>> it = hm.entrySet().iterator();
while(it.hasNext())
{
Map.Entry<Integer, String> map =(Map.Entry<Integer, String>) it.next();
Integer key = map.getKey();
String value = map.getValue();
System.out.println(key+"..."+value);
}
以上代码是在HashMap中通过Map.Entry获取键值对。
3.TreeSet & TreeMap
TreeSet和TreeMap 具备排序功能
实现Tree集合,必须实现比较方法:
1.新建Class 实现Comparator接口,覆盖compare方法,并new一个该类的对象,作为参数传递给Tree集合。
注:String字符串自带CompareTo功能,实现两个字符串比较,大于返回正数,小于返回负数,等于返回0.
public class CompareByName implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Student st1 = (Student)o1;
Student st2 = (Student)o2;
int t = st1.getName().compareTo(st2.getName());
return t == 0? st1.getAge()-st2.getAge():t;
}
}
以上代码为在TreeMap集合中实现自定义对象Student(String name, int age),自定义比较函数,实现根据名字(内置compareTo)比较字符串的大小。当两个字符串相同时,再比较两个对象的年龄。由于Tree集合中字符不能重复,所以当两个字符串比较之后相同时,后一个将覆盖前一个。
TreeMap<Student,String> tm = new TreeMap<Student,String>(new CompareByName());
新建TreeMap对象时,实现该比较函数即可。
2.自定义对象时,实现Compareable接口,并覆盖compareTo方法,即让元素本身具备比较方法。
public class Person implements Comparable {
@Override
public int compareTo(Object o) {
Person p = (Person)o;
int t = this.age-p.age;
return t==0?this.name.compareTo(p.name):t;
}
以上代码是在TreeSet集合实现自定义对象Person时,让Person实现Comparable接口,并复写compareTo方法,通过比较年龄实现比较。当年龄相同时,再比较字符串name,如果age和name都相同,只输出一次。
TreeSet ts = new TreeSet();
ts.add(new Person("john",22));
ts.add(new Person("zoe",20));
ts.add(new Person("allen",19));
ts.add(new Person("jack",27));
ts.add(new Person("lily",20));
输出为:
allen…19
lily…20
zoe…20
john…22
jack…27
补充:LinkedHashMap可实现有序输出。
4.List和Set
List中元素有序且可重复,可使用set方法修改某个位置上的元素。
而Set中元素无序且不能重复,不能使用set方法修改某个位置上的元素。
想要遍历Set中的元素,只能使用Iterator和Foreach方法,不能使用List的get方法。