10.26Java学习进度

泛型机制,Queue集合,Set集合,Map集合:

泛型机制基本概念:
通常情况下集合中可以存放不同类型的对象,本质上是将这些对象全部看做Object类型放入的,因此从集合中取出元素时也是Object类型,为了表达元素最真实的数据类型就需要强制类型转换,而强制类型转换可能发生类型转换异常。
为了避免上述错误的发生,从jdk1.5开始提出泛型机制,也就是在集合名称的右侧使用<数据类型>的方式明确要求该集合可以存放的元素类型,若放入其它类型则编译报错

如:

List lt1 = new LinkedList();   - 可以放入任意类型对象,取出麻烦
List<String> lt1 = new LinkedList<String>(); - 只能放入String类型,取出方便

原理分析:
泛型的本质就是参数化类型,也就是让数据类型作为参数传递,集合定义中的E相当于形式参数负责占位,而使用集合时<>中的数据类型相当于实际参数负责给形式参数初始化,当初始化完毕后所有E被替换为实际参数表示的类型进行使用。
由于E支持的数据类型非常广泛,因此得名为”泛型”.
如:

 // 其中i叫做形式参数,负责占位                
 // 其中E叫做形式参数,负责占位
   // int i = 5;    
    E = String;
   // int i = 10;
    E = Student;
   public void show(int i) {
       public interface List<E> {
       ...
       }
   }
   // 其中5叫做实际参数,用于给形式参数初始化
   其中String叫做实际参数
    show(5); 
    List<String> lt1 = ...;
    show(10);                                    
    List<Student> lt2 = ...;

Queue集合:
基本概念:

java.util.Queue集合是Collection集合的子集合,与List集合是平级关系。
该集合的主要实现类是:LinkedList类,因为该类在增删方面有一定的优势。
该集合用于描述具有先进先出特征的数据结构,叫做队列。

Queue接口中主要方法如下:

Queue接口的常用方法 功能描述
boolean offer(E e) 将一个对象添加至对位,若成功则返回true
E poll() 从队首删除并返回一个元素
E peek() 返回队首的元素(但并不删除)

Set集合:
基本概念:
java.util.Set集合是Collection集合的子集合,与List集合以及Queue集合平级关系
该集合与List集合的主要区别在于:元素没有先后次序并且不允许重复的元素。
该集合的主要实现类有:HashSet类 和 TreeSet类。
其中HashSet类的底层采用哈希表进行数据管理的。
其中TreeSet类的底层采用二叉树进行数据管理的。

HashSet集合放入元素的过程:
1.先调用元素的hashCode()方法得到哈希码,通过算法计算在哈希表中的位置。
2.如果该位置没有元素,直接放入即可。
3.如果该位置有元素,调用元素的equals()方法比较是不是相等。
4.如果相等,则保留旧元素丢弃新元素。
5.如果不相等,则放入该位置的链表中下一个元素

使用迭代器来访问集合中所有元素:

Iterator<String> it = s1.iterator();
while(it.hasNext()) {
    System.out.println("获取到的元素是:" + it.next());
}

使用StringBuilder类和迭代器实现toString方法的效果:

// 构造StringBuilder类型的对象用于拼接
        StringBuilder sb1 = new StringBuilder();
        // 使用迭代器取出集合中的每个元素并拼接到StringBuilder对象中
        sb1.append("集合中的元素有:[");
        // 重新获取迭代器,或者叫重置迭代器[one, two, three]
        it = s1.iterator();
        while(it.hasNext()) {
            //sb1.append(it.next()).append(",").append(" ");
            String ts = it.next();
            // 当条件成立时证明该元素不是最后一个元素
            if(it.hasNext()) {
                sb1.append(ts).append(",").append(" ");
            } else {
                sb1.append(ts).append("]");
            }
        }
        // 最后多余的逗号和空格删除
        //sb1.delete(sb1.length()-2,sb1.length()).append("]");
        // 打印最终的拼接结果
        System.out.println(sb1); //[one, two, three]

注意:
当使用迭代器迭代集合中的所有元素时,若使用集合中的remove方法来删除元素,则会出现ConcurrentModificationException并发修改异常,以后的开发中应该使用迭代器的remove方法来删除元素。

增强版的for循环(for each结构):

(1)语法格式

   for(元素类型 变量名 : 数组名/集合名) {
      循环体;
   }

(2)执行流程
不断地从数组或集合中取出一个元素并赋值给变量并执行循环体,直到处理完毕所有元素为止。

总结:
遍历Set集合的方式有三种:toString()、for each结构、迭代器方式
遍历List集合的方式有四种:除了上述3种方式外,还有get方法。

Map集合基本概念:

java.util.Map<K,V>集合中操作元素的基本单位是:单对元素,其中类型参数如下:
K - 此映射所维护的键(key)的类型
V - 映射值(value)的类型
该集合中不允许出现重复的键,每个键最多只能映射到一个值。
该集合的主要实现类有:HashMap类 和 TreeMap类。
其中HashMap类的底层是采用哈希表进行数据管理的。
其中TreeMap类的底层是采用二叉树进行数据管理的。

Map集合的遍历方式:
迭代方式一: 迭代Key

map = ...//初始化map
Set<Character> keySet = map.keySet();
for(Iterator<Character>i=
    keySet.iterator();i.hasNext();){
        Character key = i.next();
        Integer value = map.get(key);
        System.out.println(key+":"+value);
    }

迭代方式二: 迭代Entry

map = ...//初始化map
Set<Entry<Character,Integer>>
    entries=map.entrySet();
for(Entry<Character,Integer> e:entries){
    Character kry = e.getKey();
    Integer value = e.getValue();
    System.out.println(key+":"+value);
}