关于Java(11)
第10章(集合类)
- Collection, list, Set之间的联系和区别?
Collection:Java.util下的一个接口,是各种集合结构的父接口,List和Set是继承自它的子接口。
List:List接口是有序的,会精确的将元素插入到指定的位置(允许有相同元素)。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素。常用的实现类有 ArrayList、LinkedList 和 Vector。
Set:是一种不包含重复元素的Collection接口,只关心元素是否属于Set(不允许有相同元素),而不关心它的顺序。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。 - 遍历一个集合对象都有哪些方法?
可以用for循环,Iterator迭代和forEach循环。
- 以list为例:
//for循环
for( int i = 0 ; i < list.size() ; i++) {
System.out.println(list.get(i));
}
//迭代器
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
//for each
for(String str : list) {
//其内部实质上还是调用了迭代器遍历方式,这种循环方式还有其他限制,不建议使用。
System.out.println(str);
}
- 同数组相比,vector有何特点?
vector是向量类型,可以容纳许多类型的数据,因此也被称为容器,是可实现自动增长的对象数组。 - Vector与ArrayList,LinkedList与ArrayList,Hashtable与HashMap,TreeMap与HashMap之间的共同点和区别。
(图源Java课PPT)
- Hashtable与HashMap:
Map的实现类有Hashtable(已淘汰), HashMap, TreeMap
Hashtable是基于哈希表实现的,每个元素是一个key-value对,内部通过单链表解决冲突问题,当容量不足(超过了阀值)时,会自动增长。Hashtable可以在多线程环境中使用,是线程安全的。包含了两个繁琐的方法elements()和keys(),现在已经很少使用这两个方法。
HashMap的实现不是同步的,这意味着它不是线程安全的。HashMap的key、value都可以为null。此外,HashMap中的映射不是有序的。
- Map、Collection、Iterator之间的关系如何?
Map接口实现者调用接口方法values()返回一个实现collection接口的集合对象的引用,collection接口的实现者有可调用iterator()方法返回一个实现Iterator接口的对象引用。 - Collection和Collections各自的功能是什么?
Collection是集合类的基本接口,它用来说明作为一个集合类应有的结构特征属性和带有共性的操作方法。子接口主要包含List, Set, Queue。
collections是一个util包下的工具类,其类不能被实例化,提供了许多实用的static方法。 - 现需要选择集合类,它存储的对象集合可以被多个线程维护(增加、删除),请问应该选择什么样的集合类,为什么?如果多个线程只是读取,而不维护,应该选择什么样的集合类,为什么?
选择 Vector类,因为 Vector类的方法是同步的,是线程安全的
选择 ArrayList类,因为 ArrayList的方法不是线程同步的,其性能更高 - 如何实现集合对象排序?定义一个复数类并按照复数的实部大小对复数对象进行排序。
//方法一:实现自身比较器Comparable
import java.util.*;
public class Complex implements Comparable<Complex>{
private int real, imagin;
public Complex(){
real =0;
imagin =0;
}
public Complex(int r , int i){
real = r;
imagin = i;
}
@Override
public int compareTo(Complex o) {
// TODO Auto-generated method stub
return this.real-o.real;
}
@Override
public String toString(){
if(imagin>0)
return real+"+"+imagin+"i";
else if(imagin==0)
return real+"";
else return real+""+imagin+"i";
}
public static void main(String[] args){
List<Complex> al = new ArrayList<Complex>();
al.add(new Complex(1,3));
al.add(new Complex(-1,0));
al.add(new Complex(10,-5));
System.out.println(al);//排序前
//用Collections类的静态方法排序
Collections.sort(al);
System.out.println(al);//排序后
}
}
- 编写程序测试Java集合框架中各种常用类的 基本操作(包括添加元素,删除元素,查找元素,遍历集合元素等)
import java.util.*;
class TestSort {
public static void main(String[] args) {
List<Integer> al = new ArrayList();
al.add(1);
al.add(4);
al.add(3);
for (int i = 0; i < 3; i++) {
Integer inte = (Integer) al.get(i);
System.out.println(inte);
}
Iterator<Integer> iterator = al.iterator();
while (iterator.hasNext()) {
int i = iterator.next();
if (i == 1) {
iterator.remove(); //正确
}
}
for (int i = 0; i < al.size(); i++) {
Integer inte = (Integer) al.get(i);
System.out.println(inte);
}
}
}
// 1 4 3
//4 3
import java.util.*;
class Testsort {
Map<String,String> calendar = new HashMap<String,String>();
public Testsort(String d[], String i[]){
for (int x=0; x<d.length; x++)
calendar.put(d[x], i[x]);
}
public static void main(String args[]) {
String [] dates = {"10/31/01", "01/01/01", "03/05/01", "02/04/01"};
String [] items = {"Halloween", "New Years", "Birthday", "Anniversary"};
Testsort example = new Testsort(dates, items);
System.out.println("map= " + example.calendar);
Set<Map.Entry<String,String>> mappings = example.calendar.entrySet();
System.out.println("object \t\t\tkey\t\tvalue");
for (Map.Entry<String,String> map : mappings) {
System.out.print( map + "\t");
System.out.print(map.getKey() + "\t");
System.out.println(map.getValue());
}
}
}
//map= {03/05/01=Birthday,01/01/01=New Years,10/31/01=Halloween,02/04/01=Anniversary}
//object key value
//03/05/01=Birthday 03/05/01 Birthday
//01/01/01=New Years 01/01/01 New Years
//10/31/01=Halloween 10/31/01 Halloween
//02/04/01=Anniversary 02/04/01 Anniversary