昨天学习了java中的集合框架,通过集合的学习,不但了解了java中的集合框架,而且对之前的数组、自定义队列有了更深刻的理解。
java中存储数据的有以下几种:
数组:是存放同一类型的数据的集合
链表:有单向链表和双向链表
单向链表中存储子节点的地址
双向链表既存储子节点的地址,也存储父节点的地址
集合:跟数组一样是存储同一类型的数据,但是又有不同,常用的集合有三种List、Set、Map
java中的所有集合都是Collection的子类,在Collection定义了如下方法,它是Set、List、Map的顶层接口,里面的方法 它的实现类都可以直接使用Collection的方法:
boolean add(E e) :
向集合中加入一个对象,如果集中己有这个对象,则返回false;
boolean addAll(Collection<? extends E> c)
将另外一个集合中的所有对象加入这个集合
void clear()
清除集合中的所有对象,执行过后,集合中不在装有对象
boolean contains(Object o)
判断集合是是否存在某个对象
boolean containsAll(Collection<?> c)
判断集合中是否全部存在另外一个集合中的对象
boolean equals(Object o)
比较指定的对象与列表是否相等
int hashCode()
可重写的来自父类的方法
boolean isEmpty()
判断集合是否为空,在执行clear()后调用这个方法,返回true
Iterator<E> iterator()
得到这个集合的一个迭代对象
boolean remove(Object o)
从集合中移除掉一个对象
int size()
返回集合内元素的个数
Object[] toArray()
将集合转变一个数组对象
1、List:是一个接口
List是集合框架中跟数组最相似的,它跟数组一样是一个有序的集合,并且里面存储的元素允许出现重复
List接口实现的子类常见的有:
java.util.ArrayList,
java.util.LinkedList,
java.util.Vector
除从Collection中继承来的方法,ArrayList还增加了一些方法:
boolean addAll(int index, Collection<? extends E> c)
向一个List列表中插入一个对象 ,index必须小与getSize()返回的值。
E get(int index)
取得list列表中指定位置的一个对象,如果index值大于getSize()返回的值,调用将抛出异常。
List的简单测试:
package cn.netjava.testMap;
import java.util.ArrayList;
/**
* 对List进行测试,并且利用List进行除重排序
*
*/
public class testList {
public static void main(String[] args) {
//主函数
ArrayList<Student> al = createArrayList(10);
printList(al);
}
//创建一个List集合,并初始化
public static ArrayList<Student> createArrayList(int length){
ArrayList<Student> al = new ArrayList<Student>();
java.util.Random random = new java.util.Random();
for(int i=0;i<length;i++){
int value = random.nextInt(15)+6;
Student st = new Student("学生"+i,value);
al.add(st);
}
return al;
}
//打印List集合
public static void printList(ArrayList<Student> al){
for(int i=0;i<al.size();i++){
Student st = al.get(i);
System.out.println(st.getName()+"\t"+st.getAge());
}
}
}
运行结果:
学生0 7
学生1 16
学生2 8
学生3 6
学生4 6
学生5 9
学生6 10
学生7 15
学生8 20
学生9 15
2、Set:是一个接口
Set是一个无序的集合,它就像一个箱子一样,把东西放进去,再取出来时无法按照放入的顺序去取,即取出是无序的,
它与List一个不同的地方是:Set里存放的元素不允许重复,若新加入的元素Set中已存在,则已存在的元素将会被新加入的覆盖
由于Set是无序的,取出时不能用for循环一次取出,要利用迭代器iterator()方法,具体实现见代码
Set接口实现的子类常见的有:
java.util.HashSet、
java.util.TreeSet、
java.util.Iterator
java.util.HashSet实现的方法常用的有:
boolean add(E e)
如果此 set 中尚未包含指定元素,则添加指定元素。
void clear()
从此 set 中移除所有元素。
Object clone()
返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。
boolean contains(Object o)
如果此 set 包含指定元素,则返回 true。
boolean isEmpty()
如果此 set 不包含任何元素,则返回 true。
Iterator<E> iterator()
返回对此 set 中元素进行迭代的迭代器。
boolean remove(Object o)
如果指定元素存在于此 set 中,则将其移除。
int size()
返回此 set 中的元素的数量(set 的容量)。
Set的简单实现:
package cn.netjava.testMap;
import java.util.HashSet;
public class testSet {
/**
* 测试Set集合,并用Set实现除重排序
* @param
* @author 谢云
*/
public static void main(String[] args) {
HashSet<Student> hs = createHashSet(10); printSet(hs);
}
//创建一个学生类的集合对象,并初始化
public static HashSet<Student> createHashSet(int length){
HashSet<Student> hs = new HashSet<Student>();
java.util.Random random = new java.util.Random();
for(int i=0;i<length;i++){
int value = random.nextInt(15)+6;
Student st = new Student("学生"+i,value);
hs.add(st);
}
return hs;
}
//打印哈希集合,利用迭代器
public static void printSet(HashSet<Student> hs){
java.util.Iterator<Student> iterator = hs.iterator();
while(iterator.hasNext()){
Student st = (Student) iterator.next();
System.out.println(st.getName()+"\t"+st.getAge());
}
}
}
运行结果:
学生5 13
学生3 14
学生8 11
学生9 11
学生0 11
学生4 16
学生2 19
学生7 14
学生6 15
学生1 15
3、Map:是一个接口
Map是存储键值对(映射)的集合,即key(名、键)和value(key相应的值)是一一对应的关系
key好比是身份证号码,value则是身份证对应的人名
key又好比是IP地址,value则是相应的计算机
Map中的key(键)是唯一的,不可重复的,我们的身份证也是唯一的,
但是value(值)是可以重复的,因为人是可以重名的
Set接口实现的子类常见的有:
java.util.HashMap
java.util.Hashtable
java.util.HashMap中实现的常用的方法
void clear()
从此映射中移除所有映射关系。
Object clone()
返回此 HashMap 实例的浅表副本:并不复制键和值本身。
boolean containsKey(Object key)
如果此映射包含对于指定键的映射关系,则返回 true。
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>> entrySet()
返回此映射所包含的映射关系的 Set 视图。
V get(Object key)
返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
boolean isEmpty()
如果此映射不包含键-值映射关系,则返回 true。
Set<K> keySet()
返回此映射中所包含的键的 Set 视图。
V put(K key, V value)
在此映射中关联指定值与指定键。
void putAll(Map<? extends K,? extends V> m)
将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。
V remove(Object key)
从此映射中移除指定键的映射关系(如果存在)。
int size()
返回此映射中的键-值映射关系数。
Collection<V> values()
返回此映射所包含的值的 Collection 视图。
Map的具体实现:
package cn.netjava.testMap;
import java.util.HashMap;
import java.util.Iterator;
public class testMap {
/**
* @param args
*/
public static void main(String[] args) {
HashMap<String, Student> hs = createHashMap( );
print(hs);
}
//创建Map集合,并初始化
public static HashMap<String,Student> createHashMap( ){
HashMap<String,Student> map = new HashMap<String,Student>();
//向map中添加数据
for(int i=0;i<10;i++){
Student st = new Student("学生"+i, 10+i);
map.put("a"+i, st);
}
return map;
}
//打印集合
public static void print(HashMap<String,Student> map){
Iterator<String> iterator= map.keySet().iterator();
while(iterator.hasNext()){
//得到集合中的key值
String key = iterator.next();
// 通过Map提供的get方法来获取对应的value
Student stu = map.get(key);
System.out.println("Key:" + key + " Value:" + stu.getName()
+ "\t" + stu.getAge());
}
}
}
运行结果:
Key:a9 Value:学生9 19
Key:a0 Value:学生0 10
Key:a1 Value:学生1 11
Key:a2 Value:学生2 12
Key:a3 Value:学生3 13
Key:a4 Value:学生4 14
Key:a5 Value:学生5 15
Key:a6 Value:学生6 16
Key:a7 Value:学生7 17
Key:a8 Value:学生8 18
我觉得学习集合框架主要是搞清Set、List、Map三者的区别,千万不要弄混淆了,使用时想想之前的数组和自定义队列,注意区别
还有就是熟悉它们实现的接口中常用的方法,这个就要多看看JDK API包了
由于这三种集合没有一种同时实现了元素即不能重复又能排序的功能,我用List和Map分别实现了除重排序的功能,以下是具体实现:
package cn.netjava.testMap;
import java.util.ArrayList;
/**
* 对List进行测试,并且利用List进行除重排序
*/
public class testList {
public static void main(String[] args) {
//主函数
ArrayList<Student> al = createArrayList(10);
//新创建学生对象,并添加入集合中
for(int i=3;i<5;i++){
Student st = new Student("学生"+i,i+20);
al.add(st);
}
System.out.println("除重排序前:-----------------");
printList(al);
System.out.println("除重排序后:-----------------");
print(al);
}
//创建一个List集合,并初始化
public static ArrayList<Student> createArrayList(int length){
ArrayList<Student> al = new ArrayList<Student>();
java.util.Random random = new java.util.Random();
for(int i=0;i<length;i++){
int value = random.nextInt(15)+6;
Student st = new Student("学生"+i,value);
al.add(st);
}
return al;
}
//打印List集合
public static void printList(ArrayList<Student> al){
for(int i=0;i<al.size();i++){
Student st = al.get(i);
System.out.println(st.getName()+"\t"+st.getAge());
}
}
//对List集合进行除重排序
public static void print(ArrayList<Student> al){
//将集合转换为数组
Object[] integer = al.toArray();
for(int i=0;i<integer.length;i++){
for(int j=i+1;j<integer.length;j++){
Student st1 = (Student) integer[i];
Student st2 = (Student) integer[j];
//比较名字时不可用==
if(st1.getName().equals(st2.getName()) || st1.getAge()== st2.getAge()){
al.remove(st1);
}
}
}
integer = al.toArray();
//对新数组按年龄属性进行排序
for(int i=0;i<integer.length;i++){
for(int j=i+1;j<integer.length;j++){
Student st1 = (Student) integer[i];
Student st2 = (Student) integer[j];
if(st1.getAge() > st2.getAge() ){
Student temp = (Student) integer[i];
integer[i] = (Student) integer[j];
integer[j] = temp;
}
}
}
//打印排序后的数组
for(int i=0;i<al.size();i++){
Student st =(Student) integer[i];
System.out.println("姓名:"+ st.getName()+"\t"+st.getAge());
}
}
}
运行结果是:
除重排序前:-----------------
学生0 14
学生1 15
学生2 19
学生3 20
学生4 8
学生5 7
学生6 16
学生7 15
学生8 8
学生9 15
学生3 23
学生4 24
除重排序后:-----------------
姓名:学生5 7
姓名:学生8 8
姓名:学生0 14
姓名:学生9 15
姓名:学生6 16
姓名:学生2 19
姓名:学生3 23
姓名:学生4 24