Day11:集合

集合是Java语言中最重要的一个工具类,这个工具类涉及到Java所有的数据结构,是一个Java程序的数据容器。

Collection接口中的共性功能。
1,添加。
boolean add(Object obj);一次添加一个。
boolean addAll(Collection c);将制定容器中的所有元素添加。

2,删除。
void clear();
boolean remove(object o)
boolean removeAll(Collection c):
boolean retainAll(Collection c);
3,获取长度。
int size();

4,判断。
boolean isEmpty();
boolean contains(Object o)
boolean containsAll(Collection c)

5,将集合转成数组。
toArray();
toArray([]);

6,取出集合元素。
Iterator iterator()
获取集合中元素上迭代功能的迭代器对象。
迭代:取出元素的一种方式。有没有啊?有!取一个。还有没有啊?有!取一个。还有没有啊?没有。算了。
迭代器:具备着迭代功能的对象。
而迭代器对象不需要new。直接通过 iterator()方法获取即可。
迭代器是取出Collection集合中元素的公共方法。

-----------------------
Collection
|--List:有序(存入的顺序和取出的顺序一致)。有索引,允许重复元素。
|--Set:不允许重复元素。


重点List接口中的特有方法:它的特有方法都是围绕索引定义的。

支持增删改查。
增:
add(index ,element)

删:
remove(index);

改:
set(index,newelement);

查:
int indexOf(element);
element get(index);

List集合的具体子类。子类之所以区分是因为内部的数据结构(存储数据的方式)不同。
|--Vector:数据结构是数组。数组是可变长度的(不断new新数组并将元数组元素复制到新数组)。线程同步的。增删和查询都慢!
|--ArrayList:也是数组结构,也是长度可变的。线程不同步的,替代了Vector。增删速度不快。查询速度很快。
|--LinkedList:链表结构,线程不同步的。增删速度很快。查询速度较慢。


作业:
1,往ArrayList中存储自定义对象。Person(name,age)

2,去除ArrayList集合中的重复元素(String)
去除ArrayList集合中的重复元素(Person,同姓名同年龄视为同一个人)

3,自己查阅LinkeList xxxFirst() xxxLast(),并写demo
实现一个队列数据结构。

--------------------------------



Set集合:不允许重复元素。和Collection的方法相同。Set集合取出方法只有一个:迭代器。
    |--HashSet: 哈希(散列)表结构,不同步的。
        如何保证唯一性?
        元素必须覆盖hashCode和equals方法。
        覆盖hashCode方法是为了根据元素自身的特点确定哈希值。
        覆盖equals方法,是为了解决哈希值的冲突。
    |--TreeSet: 二叉树数据结构。可以对元素进行排序。不同步的。
        如何保证元素唯一性?
        参考的就是比较方法的返回值是否是0.是,就是重复元素,不存。
        排序方式:需要元素具备比较功能。所以元素需要实现Comparable接口。
                 覆盖CompareTo方法。
                 
        需求中也有这样一种情况,元素具备的比较功能不是所需要的,也就是说不想按照
        自然排序的方法,而是按照自定义的排序方式,对元素进行排序。
        而且,存储到TreeSet中的元素万一没有比较功能,该如何排序呢?
        这时,就只能使用第二种比较方式--是让集合具备比较功能,定义一个比较器。
        
        实现Comparator接口,覆盖compare方法。将Comparator接口的对象,
        作为参数传递给TreeSet集合的构造函数。
        
        比较器更为灵活。自然排序通常作为元素的默认排序。
        

技巧:
jdk1.2以后出现的集合框架中的常用子类对象,存在的规律。
前缀名是数据结构名,后缀名是所属体系名。

ArrayList: 数组结构。看到数组,就知道查询快,看到list,就知道可以重复。可以增删改查。

LinkedList: 链表结构,增删快。xxxFirst xxxLast. xxx:add get remove

HashSet: 哈希表, 就要想到元素必须覆盖hashCode equals,不保证有序。看到Set,就知道不可以重复。

LinkedHashSet: 链表+哈希表。可以实现有序,因为有链表。

TreeSet:二叉树,可以排序。就要想要两种比较方式:一种是自然排序Comparable,一种是比较器Comparator。


--------------------------------------------
泛型:
    在jdk1.4版本之前,容器什么类型的对象都可以存储。但是在取出时。需要用到对象的特有内容时,需要做向下转型。
    但是对象的类型不一致,导致了向下转型发生了ClassCastException异常。
    为了避免这个问题,只能主观上控制,往集合中存储的对象类型保持一致。
    
    JDK1.5以后解决了该问题,在定义集合时,就直接明确集合中存储元素的具体类型。
    这样,编译器在编译时,就可以对集合中存储的对象类型进行检查。
    一旦发现类型不匹配,就编译失败。这个技术就是泛型技术。
    
好处:
    1,将运行时期的问题转移到了编译时期,可以更好的让程序员发现问题并解决问题。
    2,避免了向下转型的麻烦。
    
总结:泛型就是应用在编译时期的一项安全机制。


泛型的擦除:编译器通过泛型对元素类型进行检查,只要检查通过,
            就会生成class文件,但在class文件中,就将泛型标识去掉了。


泛型的表现:泛型技术在集合集合框架中应用的范围很大。
            什么时候需要写泛型呢?1,只要看到类,或者接口在描述的时右边定义<>,就需要泛型。
            其实是,容器在不明确操作元素的类型的情况下,对外提供了一个参数<>。
            使用容器时,只要将具体的类型实参传递给该参数即可。
            说白了,泛型就是,传递类型参数。

泛型类

泛型方法,

泛型接口。


泛型的通配符 <?>


泛型的限定:
    上限:? extends E
    下限:? super E
Map:双列集合,一次存一对,键值对。要保证键的唯一性。
共性的功能:
1,添加。
    v put(key,value);
    putAll(Map<k,v> map);

2,删除。
    void clear();
    v remove(key);

3,判断。
    boolean containsKey(object)
    boolean containsValue(object);
    boolean isEmpty();

4,获取。
    v get(key);
    int size();
    

Map
    |--Hashtable:哈希表,是同步的,不允许null键,null值。
    |--HashMap: 哈希表,是不同步的,允许null键,null值。
    |--TreeMap: 二叉树,不同步的。可以对map集合中的键进行排序。
集合框架的工具类。
Collections:定义的都是操作Collection的静态方法。
    1,对list排序。
        sort(list);
    //排序方法上泛型的由来。
class Student implements Comparable<Person>
{
    public int compareTo(Person p)
    {}
}

public static <T extends Comparable<? super T>> void sort(List<T> list)
{
    
}

public static void sort(List<Student> list)
{
    stu1.compareTo(stu2)
}

    2,逆序。
    reverseOrder
    
    
    3,max min
    
    4,二分查找。
    
    5,将非同步集合转成同步集合。
    
-----------------------

Arrays:用来操作数组的工具类,方法都是静态的。

    public static <T> void swap(T[] arr,int x,int y)
    {
        T temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }
    
asList:将数组转换成集合,为了可以用集合的方法操作数组元素。不可以使用集合的增删方法。
        
集合转数组:Collection接口 toArray();



-----------------------------------

Collection 和Collections的区别?


Collection和Map的区别?
原文地址:https://www.cnblogs.com/vijay/p/3508063.html