黑马程序员--Java学习日记之集合(集合体系&迭代器)

------- android培训、 java培训、期待与您交流! ----------

黑马程序员--Java学习日记之集合(集合体系&迭代器)_第1张图片

Collection

              List:元素是有序的,元素允许重复,因为该集合体系都具有索引

                     ArrayList:底层数据结构是数组,查询速度快,增删操作较慢,线程不同步

                     LinkedList:底层数据结构是链表,查询效率较低,增删操作快,线程不同步

                     Vector:功能同ArrayList类似,底层也是数组,不同是线程是同步的,效率较低

              Set:元素是无序的,元素不允许重复,底层用到了Map

                     HashSet:底层hash表,存储的对象最好复写hashCode和equals方法,保证元素不会重复

                     TreeSet:底层二叉树,存储的对象具备比较性,有两种方法

Map:数据是以键值对的形式存储的,有的元素存在映射关系就可以使用该集合,元素不允许重复

              HashMap:允许有null键或值,线程不同步

              TreeMap

              HashTable:类似HashMap,不允许有null键或值,线程同步

数组和集合的区别
     区别1 : 
         数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
         集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
     区别2:
         数组长度是固定的,不能自动增长
         集合的长度的是可变的,可以根据元素的增加而增长


迭代器原理
     迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可 

迭代器源码解析
     1,在eclipse中ctrl + shift + t找到ArrayList类
     2,ctrl+o查找iterator()方法
     3,查看返回值类型是new Itr(),说明Itr这个类实现Iterator接口
     4,查找Itr这个内部类,发现重写了Iterator中的所有抽象方法


package com.heima.list;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Demo4_ListIterator {
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("a");									//Object obj = new String();
		list.add("b");
		list.add("world");
		list.add("c");
		list.add("d");
		list.add("e");
		
		ListIterator lit = list.listIterator();			//获取迭代器
		while(lit.hasNext()) {
			System.out.println(lit.next()); 			//获取元素并将指针向后移动
		}
		
		System.out.println("-----------------");
		
		while(lit.hasPrevious()) {
			System.out.println(lit.previous()); 		//获取元素并将指针向前移动
		}
	}

}

List的三个子类的特点 
        ArrayList:
            底层数据结构是数组,查询快,增删慢。
            线程不安全,效率高。
        Vector:
            底层数据结构是数组,查询快,增删慢。
            线程安全,效率低。
        Vector相对ArrayList查询慢(线程安全的)
        Vector相对LinkedList增删慢(数组结构)
        LinkedList:
            底层数据结构是链表,查询慢,增删快。
            线程不安全,效率高。

        Vector和ArrayList的区别
            Vector是线程安全的,效率低
            ArrayList是线程不安全的,效率高
        共同点:都是数组实现的
        ArrayList和LinkedList的区别
            ArrayList底层是数组结果,查询和修改快
            LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
        共同点:都是线程不安全的

HashSet原理
     我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数
     当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
         如果没有哈希值相同的对象就直接存入集合
         如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
将自定义类的对象存入HashSet去重复
     类中必须重写hashCode()和equals()方法
     hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
     equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储


TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
使用方式
     a.自然顺序(Comparable)
         TreeSet类的add()方法中会把存入的对象提升为Comparable类型
         调用对象的compareTo()方法和集合中的对象比较
         根据compareTo()方法返回的结果进行存储
     b.比较器顺序(Comparator)
         创建TreeSet的时候可以制定 一个Comparator
         如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
         add()方法内部会自动调用Comparator接口中compare()方法排序
         调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
     c.两种方式的区别
         TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
         TreeSet如果传入Comparator,就优先按照Comparator


List
    a.普通for循环, 使用get()逐个获取
    b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
    c.增强for循环, 只要可以使用Iterator的类都可以用
    d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
Set
    a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
    b.增强for循环, 只要可以使用Iterator的类都可以用

.普通for循环,迭代器,增强for循环是否可以在遍历的过程中删除 




你可能感兴趣的:(黑马程序员--Java学习日记之集合(集合体系&迭代器))