集合类
课本P167 1.Collection、List、Set之间的联系和区别是什么?
Collection 是集合类的基本接口,用来说明一个集合类应有的结构特征属性和共性操作方法。它的直接继承接口有List和set。
List(有序可重复) 有三个常用的实现类ArrayList,LinkedList和Vector
ArrayList
- 集合底层数据结构是数组。非线程安全。适合查询,不适合频繁的随机增删元素。
- 默认初始化容量是10,扩大之后的容量是原容量的1.5倍。
LinkedList
- LinkedList 的底层数据结构是双向链表,链表适合频繁的增删元素,不适合查询操作,不支持随机访问。
Vector
- Vector集合底层是数组,线程安全。
- 默认初始化容量是10,扩大之后的容量是原容量的2倍。
Set(无序不可重复)
常用的有两个实现类HashSet和LinkedHashSet
HashSet
- 底层是由 Hash Map 实现,不允许集合中有重复的值,存储在HashSet集合或者HashMap集合部分的元素使用该方式时需要重写 equals()和hashCode()方法
LinkedHashSet
- 继承于 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap
2.遍历一个集合对象都有哪些方法?
3.同数组相比,Vector有何特点?
4.Vector与ArrayList、LinkedList与ArrayList、Hashtable与Hashmap、Treemap与Hashmap之间的共同点和区别是?
5.Map、Collection、Iterator之间的关系如何?
6.Collection和Collections各自的功能是什么?
7.现需要选择集合类,他存储的对象集合可以被多个线程维护(增加、删除),请问应该选择什么样的集合类,为什么?如果多个线程知识读取,而不维护,应该选择什么样的集合类,为什么?
8.如何实现集合对象排序?定义一个复数类并按照复数的实部大小对复数对象进行排序。
解法一:实现自身比较器Comparable
import java.util.*;
public class Complex implements Comparable<Complex>{
private int real,imag;
public Complex(){
real=0;
imag=0;
}
public Complex(int r,int i){
real=r;
imag=i;
}
@Override
public int compareTo(Complex o){
return this.real-o.real;
}
@Override
public String toString(){
if(imag>0)
return real+"+"+imag+"i";
else if(imag==0)
return real+"";
else return real+""+imag+"i";
}
public static void main(String[] args){
List<Complex> list=new ArrayList<Complex>();
list.add(new Complex(1,3));
list.add(new Complex(-1,0));
list.add(new Complex(10,-5));
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
}
解法二:实现自定义比较器Comparator
import java.util.*;
public class Complex{
private int real,imag;
public Complex(){
real=0;
imag=0;
}
public Complex(int r,int i){
real=r;
imag=i;
}
@Override
public String toString(){
if(imag>0)
return real+"+"+imag+"i";
else if(imag==0)
return real+"";
else return real+""+imag+"i";
}
public static void main(String[] args){
List<Complex> list=new ArrayList<Complex>();
list.add(new Complex(1,3));
list.add(new Complex(-1,0));
list.add(new Complex(10,-5));
System.out.println(list);
Collections.sort(list,new Comparator<Complex>(){
public int compare(Complex o1,Complex o2){
return o1.real<o2.real?-1:1;
}
});
System.out.println(list);
}
}
补充:随机生成5个复数排序
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Iterator;
public class Complex{
int real;
int imag;
public void print(Complex c){
System.out.print(((Integer)c.real).toString()+"+"+((Integer)c.imag).toString()+"i ");
}
public Complex(int real, int imag){
this.real=real;
this.imag=imag;
print(this);
}
public static void main(String[] args){
List<Complex> list=new ArrayList<Complex>();
System.out.println("排序前:");
for(int i=0;i<5;++i){
int real=(int)(Math.random()*10);
int imag=(int)(Math.random()*10);
list.add(new Complex(real,imag));
}
System.out.println();
System.out.println("排序后:");
Collections.sort(list,new Comparator<Complex>(){
public int compare(Complex a,Complex b) {
return a.real-b.real;
}
});
for(Iterator<Complex> it = list.iterator(); it.hasNext(); ) {
Complex object=(Complex)it.next();
object.print(object);
}
}
}
输出结果:
排序前:
6+1i 8+3i 2+1i 7+2i 8+7i
排序后:
2+1i 6+1i 7+2i 8+3i 8+7i
10.对第7章第6题进行适当改造,将异常类型与中文提示存储在一个集合类当中,从而实现相应的功能。
补充题目: 1.编写程序测试Java集合框架中各种常用类的基本操作(包括添加元素,删除元素,查找元素,遍历集合元素等)
|