| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> JavaSE——Day10 -> 正文阅读 |
|
[数据结构与算法]JavaSE——Day10 |
1、Collection 接口Collection是单例集合的顶层接口,它表示一组对象,这些对象被称为Collection元素,JDK不提供此接口的任何直接实现,它提供更加具体的子接口Set和List实现。创建Collection集合的对象采用多态的方式、具体实现类ArrayList。(Collection单例集合有:ArrayList、LinkedList、TreeSet、HashSet)(Map双例集合有:HashMap、Hashtable、ConcurrentHashMap) 常用方法: boolean add(E e) void clear() boolean contains(Object o) boolean remove(Object o) Object[] toArray() Iterator iterator() boolean equals(Object o) int hashCode() int size() 1.1 List接口list集合是有序集合,也被成为序列,用户可以精确控制每个元素在列表中的插入位置。用户可以通过它们的整数索引(在列表中的位置)访问元素,并在列表中搜索元素。与set集合不同,列表通常允许重复元素。 List集合特点:可重复,有序 常用子类:ArrayList、LinkedList 和 Vector(不推荐使用) 1.1.1、ArrayList 集合(优先考虑)概念:List接口的可调整大小的数组实现。实现所有可选的列表操作,并允许所有元素,包括null. 除了实现List接口之外,该类还提供了操作内部用于存储列表的数组大小的方法。 特点:基于数组实现,查找效率高,但新增和删除效率低;线程不安全。 特有方法 void add(int index, E element) E get(int index) int indexOf(Object o) int lastIndexOf(Object o) E remove(int index) E set(int index, E element)
1.1.2 LinkedList概念:LinkedList同时实现了List接口和Deque接口,也就是收它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack) 特点:底层数据结构是链表,查询慢,增删快。线程不安全,效率高。 特有方法: void addFirst(E e) 在此列表的开头插入指定的元素。 void addLast(E e)将指定的元素附加到此列表的末尾。 E getFirst() 返回此列表中的第一个元素。 E getLast() 返回此列表中的最后一个元素。 E removeFirst() 移除并返回此列表中的第一个元素。 E removeLast() 从此列表中删除并返回最后一个元素。 1.1.3 Vector概念:Vector类实现可增长的对象阵列。像数组一样,它包含可以使用整数索引访问的组件 特点:线程安全,但是效率低 1.2 Set 接口与List集合不同,Set接口的实现类创建的集合都是不包含重复元素的集合 Set集合特点:不包含重复元素的集合、没有带索引的方法所以不能使用普通遍历 常用子类:TreeSet(排序使用)、HashSet(效率高)、LinkedHashSet 1.2.1 TreeSet概念:底层是二叉树算法实现。被用作排序 特点:元素不重复、排序根据传入参数进行排序(无参构造函数进行自然排序,带参构造函数根据参数排序接口排序)。没有索引,只能使用迭代器或增强for循环遍历 无参构造函数排序(需要Student类实现 Comparable接口,重写public int compareTo(Student s)方法;方法内容为排序规则)
带参构造函数排序(1、用匿名内部类)
(2、使用 static void sort(T[] a, Comparator<? super T> c) 1.2.2 HashSet概念:底层数据结构是哈希表,对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的顺序一致、没有带索引的方法,所以不能使用普通for循环遍历、由于是Set集合,所以不包含重复元素的集合 原理:利用了哈希算法,在调用add方法时计算出对象的哈希值,用计算出的哈希值在集合中对比,没有相同则存入,如果有则用equals一个一个比较,比较结果为false则存入,true则不存。 使用HashSet时要重写类里面的hashCode和equals方法。
1.2.3 LinkedHashSet特点:哈希表和链表实现Set接口具有可预测的迭代性、链表保证元素的有序、哈希表保证元素的唯一 初始容量为16,散列因子0.75。继承于HashSet,又基于LinkedHashMap存储所有元素,并用双向链表记录插入顺序 2、Map接口? Map接口下常用的子类有HashMap 、TreeMap 、Hashtable 和 ConcurrentHashMap 实现类,Map集合可以存储一对对象,即会一次性保存两个对象,存在key = value 结构,其最大的特点还是可以通过key 找到对应的value 值。 2.1 HashMap(常用)实现原理:
常用方法: V put(K key, V value) boolean containsKey(Object key) boolean containsValue(Object value) Set<Map.Entry<K,V>> entrySet() Set keySet() Collection values()
2.2 Hashtable很多映射的常用功能与HashMap类似,不同的是它继承自Dictionary类,并且是线程安全的,任一时间只有一个线程能写Hashtable 2.3 TreeMap(推荐需要排序时使用)TreeMap实现SortedMap<K,V>接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的结果是排过序的。 使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常。 2.4 ConcurrentHashMap(推荐需要线程安全时使用)线程安全原理:采用分段锁机制 很多映射的常用功能与HashMap类似 2.5 LinkedHashMapLinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。 2.6 HashMap、Hashtable、ConcurrentHashMap的区别相同点:都是数据容器 不同点: HashMap 线程不安全、效率高 、不保证存储顺序 Hashtable 线程安全、效率低 、不保证存储顺序 ConcurrentHashMap 线程安全、效率比较高(采用分段锁机制)不保证存储顺序 TreeMap 不保证存储顺序,但是会自动排序 LinkedHashMap 既保证存储顺序也保证查找方便 PS:将对象当成key存储时一定不要更改它,特别是自定义对象,容易发生数据结构错乱,会改变哈希值,导致查找的时候找不到。 3、哈希表概述哈希表是一种数据结构,由对象数组+链表组成。根据哈希值对数组长度取余获取数组下标。对数据进行操作。默认哈希桶是16,散列因子0.75(当哈希桶存在数据75%时会进行扩容,扩容2倍,重构数据结构)。 PS: 在创建哈希表要思考好初始的桶数,过小容易多次重构数据结构,浪费性能,过大容易浪费空间。 散列因子过大虽然会减少空间的消耗,但是会增加查找成本,过小则会浪费大量空间。 哈希冲突 如果在计算哈希值得到数组下标后发现数组内存在数据,会生成一个链表,将数据存放到原数据后。 1.8版本新特性: 存放数据的数组空间被称为哈希桶 当哈希桶中的数据量大于8时,桶中的链表转换为红黑二叉树 当哈希桶中的数据量减少到6时,红黑二叉树转换为链表 4、迭代器和增强for循环4.1 迭代器4.1.1 IteratorIterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。 使用方法如下:
4.1.2 ListIteratorListIterator列表的迭代器,允许程序员沿任一方向遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。它继承于Iterator接口,只能用于各种List类型的访问。 常用方法 E next() E previous() int nextIndex() int previousIndex() void remove()
4.2 增强for循环目的:简化数组和Collection、Map集合的遍历 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/29 8:06:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |