Java数据结构

本文深入解析Java集合框架,包括List、Queue、Deque、Set、Map等接口及其具体实现类如ArrayList、LinkedList、HashSet、HashMap的特点与用法。探讨了ArrayList的扩容机制、LinkedList的双向链表结构以及HashMap的工作原理。

1.集合
集合与数据结构基本框架。

2.List,Queue,Deque,Set,Map是接口。
AbstractList是抽象类,实现了List接口。
Vector,ArrayList,LinkedList均继承自AbstractList抽象类,而不是直接实现的List接口。
Deque接口继承自Queue接口,相比List具体实现类还增加了PriorityQueue类。
HashSet继承自AbstractSet抽象类且实现了Set接口,AbstractSet抽象类继承了AbstractCollection抽象类,另有TreeSet实现类。
HashMap继承自AbstractMap抽象类且实现了Map接口,另有TreeMap实现类。

3.ArrayList实现类:
可以看出实现了List接口,Cloneable接口等
重要的方法有:get,set,add,remove(具体下标或者对象),subList,indexOf,contains,size,isEmpty,colne返回object对象(深复制)
初始化及扩容机制:无参构造方法创建的是空数组,此时容量为0,当放入元素时,容量为10,之后的扩容都是1.5倍扩容。如果使用有参数的构造方法那么会初始化为该参数大小的容量,但是这个参数小于10的话数组容量依然是10.数组最大容量为Integer.MAX_VALUE-8;get元素时超出数组长度才会抛异常。

4.LinkedList实现类:
因为其实现了Deque接口,并且Deque接口实现了Queue接口,所以LinkedList比ArrayList实现功能更多。没有任何长度限制及初始化,主要方法有:get,set,add,remove(具体下标或者对象),getFirst,getLast,addFirst,addLast,以及队列和栈的基础方法。对于LinkedList的get方法,只要访问下标越界都会抛异常,与ArrayList不同。

5.Queue和Deque是接口,使用LinkedList等其他类实现的时候调用实现类重写的方法去实现相关功能,重要方法:offer,poll,peek(看队首元素)。

6.HashSet其实内部仍然是HashMap,只不过key就是添加的元素,而value值是内部定义好的私有Object对象。

7.Stack继承自Vector类,重要方法:push,pop,peek(看栈顶元素)。

9.HashMap实现Map接口,手动实现简易哈希表一定要重写hashcode和equals方法。对于无参数的构造方法,默认负载因子为0.75,初始容量大小为16,有一个参数的构造方法则是设置初始容量的,即便设置了初始容量,map数组的大小仍是0,只有插入元素时才会扩容为大于等于所给值且满足是2的倍数,有两个参数的构造方法是设置初始容量和负载因子大小的。扩容机制为当已使用数组容量除以总容量大于0.75就会触发扩容机制,当数组中的链表长度大于8且数组长度大于等于64会将链表变为红黑树,当链表长度小于6,红黑树又会退化成链表。HashMap和HashTable的区别,HashMap是异步的,也就是线程不安全,继承自AbstractMap,实现了map接口,允许将null作为键和值,遍历时使用Iterator。另外还会重新计算hash值,而不是直接使用原来的hashcode值。 对于HashTable,其中方法是同步的,也就是线程安全的,继承自Dictionary类,也实现了map接口,遍历时使用不仅使用Iterator,还使用Enumeration。哈希值直接使用的是hashcode计算的值。默认初始大小为11。扩容时使用oldCap*2+1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值