集合框架
2017-11-20 本文已影响21人
简_笑
集合框架的概念
- 集合:存放数据的容器
- 集合框架:java中,用于表示集合,以及操作集合的类和接口的统称
数组与集合的区别
- 数组中的元素类型必须一致,集合中的元素类型没有限制
- 数组的容量是固定的,集合的容量是无限自增长
- 数组中既可以存放简单类型的数据,也可以存放复合类型的数据,而集合中只能存放复合类型的数据,更加纯粹的面向对象
集合框架的继承体系
- . Collection
-
List
- ArrayList
- LinkedList
- Vector
- Stack
-
Set
- HashSet
- TreeSet
- LinkesHashSet
-
List
-
Map
- HashMap
- TreeMap
- LinkedHashMap
- Hashtable
以上加粗的类名就是接口,Collection和Map是集合框架中的父接口
Collection接口
因为Collection是一个接口,所以不能被实例化。则有一下api
- 增:add和addAll
- 删:remove,removeAll (删除交集),clear(清空集合)
- 改:Collection没有改的方法(List分支才有)
- 查:
- contains:判断集合中是否包含某个元素
- containsAll:用于判断一个集合是否完全包含另外一个集合
- isEmpty:判断一个集合是否为空
- retainAll:计算交集
- size:计算集合中的元素
- toArray:把一个集合转换为数组,数组中元素的顺序与集合一致
- 迭代器
- Iterator用于获取迭代器,迭代器是为了一个一个按顺序取出元素
- 迭代:为了获取第n个元素,必须先获取前n - 1个元素
- 迭代器Iterator有一个hasNext方法,用于判断是否还有下一项
List接口
- List分支的特点是:有顺序,能重复
- List的api:
- 增
- add(int,Object):在指定位置添加元素
- addAll(int,Collection)
- 删
- remove(int):按下标删除元素
- removeAll
- 改
- set(int,Object):把某个位置上的元素替换成某个值
- 查
- get():按照下标任意访问元素
(List可以使用迭代器访问,因为他继承了Collection,也就继承了Collection的interator方法来获取迭代器) - indexOf() 和 lastIndextOf()
- listIterator:获取一个双向迭代器
- subList
- get():按照下标任意访问元素
ArrayList
- 特点:查询效率高,增删效率低。因为ArrayList底层是使用数组实现的!而数组的内存中的存放特点是“连续存放”。而正是因为连续存放,所以查询效率高,增删效率低
LinkedList
- 特点:查询效率低,增删效率高,因为LinkedList底层是用链表实现的!链表在内存中的存放特点是“不连续存放”,正因为不连续,所以查询效率低,增删效率高
- LinkedList的都有方法:
- addFirst ,
- addLast ,
- removeFirst ,
- removeLast
Stack
- Stack 堆栈结构 特点是:先进后出(FILO LIFO)
队列
- 队列的特点:先进先出,后进后出
set接口
- set分支的特点是:没有顺序,不能重复
- set的api几乎都是继承collection,没有自己的
HashSet(重点)
- HashSet的特点:增删,查询 效率都很高,缺点,占用空间特别大
- java中每一个对象都有一个“哈希码”(可以对比,每一个对象都有一个“对象互斥锁”),这个哈希码可以通过hashCode来获取,其实哈希码就是一个整数
- 系统内置的类的对象,如果内容相同,哈希码就相同,内容不同,哈希码不一定不同
- 自定义的类,如果内容相同,哈希码也是不同的
- 系统内置的类,都重写过hasjCode方法!保证哈希码就是根据内容计算出来的!而我们自定义的类,直接访问的就是Object的hashCode方法!Object的hashCode仅仅是简单的返回内存地址,
- 为了保证自定义的类,两个对象内容相同的前提下,哈希码也相同,则需要我们自己重写Object的hashSet方法!
- 对象的哈希码是用来散列的,所谓散列就是根据不同的哈希码,把对象分配到不同的HashSet的区域(术语上叫桶)中
- 哈希码相同的多个对象,会进入同一个区域中,只有同一个区域中的对象,才进行比较,其他区域的对象不用比较,因为哈希码是根据对象的内容产生的,哈希码不同,内容肯定不同,
- 又因为哈希码相同,对象的内容未必就相同。所以哈希码相同 的前提下,还要进一步比较,比较时会回调equals方法。Object的equals是比较地址
TreeSet
- TreeSet特点:能对加入的元素进行自然排序(数字和字符串“字符串中的unicode码”)
- 字符串比较规则:
- 先比较第一个字符,如果比出大小,就以次结果为准,如果相等,则比较第二个字符……以此类推,如果前面都相等,长度不等,则长度大者,大
- 只有TreeSet要求,添加的元素类型必须一致,否则就不能比较,进而不能排序
-TreeSet中添加自定义类的对象时,不能排序 - 系统内置的类的对象能排序的原因:因为系统内置的类都实现了一个接口:java.lang.Comparable,只有类实现了此接口,对象才能被TreeSet排序
- 比较器的优先级比comparable接口制定的比较优先级高!
LinkedHashSet
- LinkedHashSet有HashSet的所有优点和缺点。也使用了哈希算法,但LinkedHashSet也维护了顺序
Map接口
- Map分支的特点:存放键值对。存放键值—>值得映射关系。其中,键值不能重复,没有顺序,值可以重复,
- Map的api:
- 增:put,putAll
- 删:
- remove(Object key),根据键值删除整个键值对
map的remove方法,返回的是本次删除的值!如果没有删着,则返回null!
Collection的remove方法返回的是Boolean类型,true表示删除着了,false则没有 - clear
- remove(Object key),根据键值删除整个键值对
- 改:如果键值重复,则是覆盖效果(修改)
- 查:
- containsKey:判断map中是否包含某个键值
- containsValue:判断map中是否包含某个值
- get(Objetc key):传入键值,返回值,键值不存在,返回null
- getOrDefault(Object key,Object Default)
- isEmpty
- size():键值对的对数
- keySet:keySet用于获取map中所有 键的集合
- values:values用于获取map中所有值的集合
- entrySet: entrySet用于获取键值对的集合
工具类
Arrays,collections(非collection),都是工具类,方法都是静态方法
- Arrays工具类的方法:
- sort用于排序数组中的元素
- toString:用数组中的元素拼接成一个字符串
- binarySearch:在排序以后的数组中,寻找某个元素的下标
- asList:生成一个只读的List,只能获取不能删增
- collections工具类的方法:
- Swap(list,int,int)交换指定list中的两个元素的值
- Shuffle:随机打乱list元素中的顺序
- Collections.sort:用于排序list
- Reverse用于反转list中的元素顺序
- max,min
- rotate:移动元素的位置
- fill:使用一个值替换list中的所有值
- frequency判断一个元素在一个list中出现的次数
HashMap是HashSet的底层实现
TreeMap是TreeSet的底层实现
LinkedHashMap是LinkedHashSet的底层实现