框架梳理
知识的获得在于形成在框架,尤其是像Java中的类集框架纷繁复杂,在实际应用中如何使用,各自有什么注意点?必须梳理清楚!
两大阵营的选择
类集框有Collection 和 Map两大阵营,在实际开发中如何选择哪个,或者说他们的主要区别是什么?
- 数据存储的区别:Collection旗下类集存储的是单值数据,Map旗下的类集存储的是二元偶数据,以key 和 value成对存储
- 功能的区别:Collection一般实现的时输出操作,Map一般是根据key查找
Collection旗下的类集
Collection接口主要靠其两个子类接口子类实例化对象,一般不直接出现。
List 和 Set的区别:
- List允许数据重复,Set不允许保存重复数据
————————————————————————————————
List三个子类的区别:
- ArrayList看名字就可以知道,它的内部是依靠动态开辟数组实现。
- LinkedList的内部是依靠链表实现,数据较多时使用
- Vector是线程安全的,可实现线程同步
Set两个子类的区别:
- HashSet存储是无序的,和添加的顺序无关
- TreeSet存储时有序的,可以将数据升序输出
————————————————————————————————
List主要的使用的方法有:
- add()
- contains()
- Iterator()
- remove()
- get()
注意:若数据的数据类型是自定义类,需要在自定义类中覆写equals方法才能正确使用remove()和contains 方法
Set主要的使用的方法有:
- add()
- remove()
- contains()
注意:若数据的数据类型是自定义类,需用在自定义类中覆写Comparable接口的中的ComparTo方法才能使TreeSet的对象正确排序,需要在自定义类中覆写equals()和 hashCode()方法才能使HashSet 的对象不保存重复数据
————————————————————————————————
我们可以看到Set和List都有一个iterator()方法,该方法可以返回一个Iterator对象对集合进行迭代输出。
Iterator类(向后迭代输出)有两个主要方法:
- hashNext():判断迭代类中是否还有数据
- next():获得对象
LinkedIterator类不同于Iterator类,LinkedIterator类是一个双向迭代仅适用与List接口实现类,实现与Iterator相似,多了一个向前迭代,只有使用过了向后迭代才能使用向前迭代
代码演示:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class Demo1 {
public static void main(String[] args) {
Set<Person> set = new HashSet<Person>();
set.add(new Person("入云龙",21));
set.add(new Person("穿天猴",23));
set.add(new Person("白日鼠",34));
set.add(new Person("金毛鼠",12));
set.add(new Person("金毛鼠",12));
set.remove(new Person("入云龙",21));
Iterator<Person> itr = set.iterator();
while(itr.hasNext()) {
Person person = itr.next();
System.out.println(person);
}
}
}
class Person{
private String name;
private int age;
public Person() {}
public Person(String name,int age) {
this.age = age;
this.name = name;
}
public String toString() {
return "姓名:"+this.name+",年龄:"+this.age;
}
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj == null) {
return false;
}
if(!(obj instanceof Person)) {
return false;
}
Person data = (Person)obj;
return this.name.equals(data.name)&&this.age == data.age;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result +age;
result = prime * result + ((name == null)?0:name.hashCode());
return age;
}
}
Map旗下的类集
hashMap 和 Hashtable 的区别:
- 两者都是以节点保存
- hashtable是线程安全的,hashtable 中key 和 value都不能存储null
————————————————————————————————
hashMap 和 LinkedHashMap 的区别:
- hashMap 当数据过大时可以转换成红黑树存储查询,数据不多时作为链表存储,LinkedhashMap只能以链表存储
- hashMap是无序的,而LinkedHashMap 是有序的
————————————————————————————————
Map的主要方法:
- put()
- entrySet()
注意:因为Map类集中的put方法调用了生成了hash码,所以当数据的数据类型为自定义类要覆写hashCode() 和 equals() 方法
————————————————————————————————
Map类集的输出,实际上Map类集并没有继承Iterator接口,但是提供了一个entrySet方法将Map类集转换成Set类集,再进行迭代
代码演示:
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Demo1 {
public static void main(String[] args) {
Map<Person,Integer> map = new HashMap<Person,Integer>();
map.put(new Person("入云龙",21),1);
map.put(new Person("穿天猴",23),2);
map.put(new Person("白日鼠",34),3);
map.put(new Person("金毛鼠",12),4);
map.put(new Person("金毛鼠",12),5);
map.remove(new Person("入云龙",21),1);
Set<Map.Entry<Person,Integer>> set = map.entrySet();
Iterator<Map.Entry<Person,Integer>> itr = set.iterator();
while(itr.hasNext()) {
Entry<Person,Integer> me = itr.next();
System.out.println(me.getKey()+" "+me.getValue());
}
}
}
class Person{
private String name;
private int age;
public Person() {}
public Person(String name,int age) {
this.age = age;
this.name = name;
}
public String toString() {
return "姓名:"+this.name+",年龄:"+this.age;
}
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj == null) {
return false;
}
if(!(obj instanceof Person)) {
return false;
}
Person data = (Person)obj;
return this.name.equals(data.name)&&this.age == data.age;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result +age;
result = prime * result + ((name == null)?0:name.hashCode());
return age;
}
}