集合学习笔记

来源:互联网 发布:淘宝十大黑店 编辑:程序博客网 时间:2024/06/07 01:22
学习集合需要掌握哪些知识点
1、集合的结构图collection map集合
2、list和set子类的使用
3、hashcode和equals的重写
4、三种遍历集合的方法
4、迭代器的使用

1.什么是集合?
    集合就是用来存储一组对象的容器
2.集合和数组的区别
    2.1:数组的长度是不可变的,集合的长度是可变的
    2.2:数组可以存储基本数据类型,而集合只能存储引用类型,也就是说只能存储对象
    2.3:数组只能存同一种数据类型的数据,而集合可以存储不同类型的对象
3.集合最上层的接口是Collection
Collection有两个子接口,分别是:List和Set
List:存储一组有序的并且可重复的对象
Set:存储一组无序的并且唯一的对象
Collection接口常用的方法:
add(Object o): 往集合里添加元素
remove(Object o):移除集合里的元素
size():得到集合里元素的个数
clear():清除集合里所有元素
contain(Object o):判断集合里包不包含指定元素
addAll(Collection c):把一个指定集合里的所有元素添加到现在集合里
removeAll(Collection c):移除现有集合里指定集合里的所有元素
isEmpty():判断集合是不是空的

List集合常用的方法:
add(int index,Object o); 在指定位置添加元素
remove(int index);移除指定位置的元素
set(int index,Object o);重新设置指定位置的元素
get(int index); 得到指定位置的元素
subList(int from,int to);在现有的集合上截取一个新的集合,包含开始的位置,不包含结束的位置
indexOf(Object o);得到指定元素在集合中第一次出现的位置,找到了返回实际的位置,没找到返回-1
lastIndexOf(Object o);得到指定元素在集合中最后一次出现的位置,找到了返回实际的位置,没找到返回-1

List集合的两个常用实现类:ArrayList和LinkedList
ArrayList:底层的数据结构使用的是数组结构,特点,查询速度快,但是增,删稍慢,元素少体现不出来,元素越多赵明显
ArrayList的用法
 * 需求:往集合里存对象,如果这个对象已经存在了,就不能再存
 * 思路,每次在往集合里存对象时,先判断集合里有没有这个对象,如果有,就不存,如果没有,就存
 * 判断集合里有没有这个对象,是通过contains方法来判断的,该方法的返回值是布尔类型,如果返回true,表示该对象已经存在,就不能存,如果返回false
 * 表示该对象不存在,就可以存
 * 跟踪源码我们发现,contains方法里的实现过程是调用了indexOf(Object o)这个方法,而这个方法的作用是查找指定对象在集合中的位置
 * 如果找到了,就返回实际的位置,这个位置肯定是大于等于0数,如果没找到,就返回-1
 * indexOf(Object obj)方法的的实现主要是通过equals方法来比较对象是否存在的
 * 而equals方法是Object类定义的方法,该方法的默认实现是判断两个对象的引用地址是否是相等的
 * 总结:contains方法判断对象是否存在的依据是通过equals方法来实现的
 *
 * 加深需求:判断两个对象是否相等通过引用地址没有意义,我们认为两个对象的各个属性值相等,就表示这两个对象确实是同一个对象了
 
 LinkedList:底层的数据结构是一个双向链表的结构,后一个元素记录了前一条元素的地址,也记录后后元素的地址,特点,查询速度稍慢,但是增删速度稍快
 它比ArrayList多出来以下几个方法:
    offerFirst()
 * offerLast()
 * 相当于 addFirst() addLast()
 *
 * pollFirst()
 * pollLast()
 *相当于 removeFirst() removeLast()
 *如果集合里没有元素的时候,用removeFirst()或者removeLast()会报一个异常叫 NoSuchElementException
 * 用pollFirst()或者 pollLast(),就会返回一个null
 *
 * peekFirst()
 * peekLast()
 * 相当于getFirst() getLast()
 * 如果集合里没有元素的时候,用getFirst()或者getLast()会报一个异常叫 NoSuchElementException
 * 用peekFirst()或者 peekLast(),就会返回一个null
 Vector与ArrayList的区别
 * 相同点:
 *  1.他们都实现了List接口
 *  2.他们底层的数组结构都是数组结构
 *
 * 不同点:
 *     1.Vector线程安全,ArrayList线程不安全
 * 所以效率上ArrayList更快
 *  2.Vector当装元素的数组长度满了的时候,新数组的长度按照原数组的百分之百增长
 *  ArrayList当装元素的数组长度满了的时候,新数组的长度按照原数组的百分之五十增长
 *  3.遍历的时候,ArrayList返回的是一个Iterator迭代器
 *  Vector返回的是一个枚举
 
  <>:是泛型的一个标志
 * 泛型集合:就是在创建集合对象的时候,在<>号里指定一种类型,那就表示这集合只能存储<>指定的类型的对象
 * 好处:
 * 1.把运行时期的异常提升到编译时期来了
 * 2.避免了强制类型的转换
 *
 * 总结JAVA中用的的符号:
 * ():表示方法
 * []:表示数组
 * {}:结构体
 * <>:表示泛型
 *
 * 迭代器:专门用于遍历集合的一个对象
 * 里面主要用三个方法:hasNext(),next(),remove()
 * 如果用迭代器在遍历集合的时候,想删除集合里的某个元素,不能用集合对象的remove来删除,只能用迭代器对象的remove()方法来删除,不然会报一个
 * ConcurrentModificationException
    -----------------------------------------------------
    set集合:
        set接口没有提供collection提供接口额外的方法,但实现set接口的集合类中的元素是不可重复的
        无序的唯一的
        常用的实现类:HashSet;散列存放
                      TreeSet(二叉数);有序存放
                      LinkedHashSet:
        HashSet存放对象原理:
            实现Set接口的集合HashSet存对象时:
            根据每个对象的哈希码值(调用hashCode()获得)用固定的算法算出它的存储索引,把对象存放在一个叫散列表的相应位置(表元)中:
            如果对应的位置没有其它元素,就只需要直接存入。
            如果该位置有元素了,会将新对象跟该位置的所有对象进行比较(调用equals()),以查看是否已经存在了:还不存在就存放,已经存在就放弃加入。
            取对象时:
            根据对象的哈希码值计算出它的存储索引,在散列表的相应位置(表元)上的元素间进行少量的比较操作就可以找出它。
            Set接口存、取、删对象都有很高的效率。

        
            该集合中存在一个哈希表。
                当往集合里存对象的时候,先调用该对象的hashcode的方法,返回该对象的hashcode值(指该对象在内存中的地址)
                然后拿这个hashcode值和已经存在集合里的对象的hashcode值比较,如果相等,就比较对象的引用地址,如果相等就不存,
        -----------------------------------------------------------------
        TreeSet(二叉数);有序存放
            底层使用二叉树的数据结构来存数据
            可以排序,所以集合必须要有可比较性
            所以自定义的类要实现Comparable,并重写compareTo方法。方法返回值为int类型。
        自定义比较器:
            当一个类不具备可比性,或这个类的比较性不满足你的业务需求,
            可自定义一个比较器,然后在创
        
    ---------------------------------------------------
    collection只能用迭代器和foreach遍历,因为它没有下标
    System.indetityHashcode(obj):得到对象在内存中最原始的地址,参数表示要得到指定的对象的内存地址
    ArrayList判断数据是否重复的依据是equals方法
    HashSet判断数据是否重复的依据是hashcode方法和equals方法
    所以使用自定义类的时候要重写equals方法和hashcode方法
    compareTo<T>方法,比较此对象与指定对象的顺序
    TreeSet(二叉数)集合判断重复的方法是:comperTo。
    把int类型的num转成对应的保证类:Integer.valueOf(int num);
0 0