集合

Collection集合

在collection接口之上还有一个Iterable接口,也就意味着这一组集合全部都可以通过迭代器来操作。
继承了Collection的抽象类abstractCollection实现了大部分通用的操作,以便于子类的使用.

List集合

list作为有序集合,定义了多个可以随机访问的接口,list集合可以通过两种方式来访问

  • 迭代器访问,必须顺序访问
  • 整数索引访问,随机访问
    链表更适合迭代器访问,数组适合索引访问,java1.4引入了RandomAccess接口,用来标识是否支持高效随机访问.
    不得不提Iterator接口,LIstIterator是Iterator的子接口,定义了在迭代器之前增加add()方法以及可以反向遍历的两个方法:previous() ,hasPervious(),列表迭代器有保持位置的计数器

LinkedList

链表数据结构,LinkedList虽然提供了随机访问的方法,但是其实是"虚假的",例如:

public static void main(String[] args) {
        LinkedList<String> link = new LinkedList<String>();
        link.add("小汪汪");
        link.add("小张张");
        link.add("小黄黄");
        for (int i = 0; i < link.size(); i++) {
            System.out.println(link.get(i));
        }
    }

在语法上支持随机访问,其实并不是,每一次遍历元素都要从头开始,linkedlist不存储位置信息.因此,进行随机访问使用arraylist.

Arraylist

数组集合,封装了一个动态再分配的对象数组,支持高速随机访问.

Vector

Vector极少使用,不过多赘述,可以理解为线程安全的ArrayList。

  • List常见实现类
    ArrayList,LinkedList,Vector
  • ArrayList ,LinkedList的区别
    数组,访问速度快,便于查询。链表,插入删除快,访问慢,不支持随机访问。
  • List集合的扩容机制
    ArrayList:初始长度为10,可指定长度。未添加数据前为0,添加一个数据增长到10。通过grow()方法按照原来数据的1.5倍增长。最大长度为Integer.MAX_VALUE或者Integer.MAX_VALUE-8.
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

Vector:grow()方法,按照原来数据长度的两倍增长。
LinkedList:链表,节点增加数据即可。

Set集合

HashSet

散列表:
为了能够快速查找到指定元素,但是又不知道元素的位置,就需要遍历全部数据,当数据过多时,就会消耗大量的时间.散列表就可以快速访问数据,不同的数据对象就有不同的散列码.注意:要与equals方法保持一致,如果两个数据相同,那么散列码也要保持相同.
散列表基于链表数组实现,每个列表被称为,计算散列码,与桶的总数取余,插入对应的桶中,这个操作可能会发生散列冲突。在java8以后,当桶满时从链表转化为平衡二叉树,提高性能。
如果想更多控制性能,大致知道有多少个元素,通常将桶数设定为元素个数的75%到150%。
当然大部分并不知道有多少个元素,装填因子可以确定什么时候散列表再散列,通常设定为0.75,如果表中元素填满了75%以上,就再散列,是原来的2倍。
contains()方法已经被重新定义,只查看一个元素不再遍历,迭代器依次按顺序遍历所有元素,并非随机访问。不关心元素顺序使用Hashset。

TreeSet

树集是一个有序集合,可将数据自动排序,添加数据效率比散列表稍,但查找速度要快,速度为Log以2为底的N次方。结合Compareable接口或提供comparetor方法实现排序。

Map

HashMapTreeMaphashSettreeSet底层是相同的,散列映射将键进行散列,树映射根据键的顺序组织为一个搜索树。散列与比较函数只能作用于键。

映射视图

集合框架并不认为映射本身就是一个集合,但是可以得到视图。
三种视图:
Set<K> keySet()
Collection<V> values()
Set<Map.Entry(k,v)> entrySet<>
利用lamda表达式,遍历Map集合:

HashMap<String, String> map = new HashMap<String, String>();
        map.put("f","f");
        map.put("x", "x");
        map.forEach((k,v)->System.out.println(k+v))
链接散列集映射

LinkedHashset和LinkedHashMap会记住插入元素项的顺序。在表中插入元素时,就会并入到双向链表。

HashTable

与HashMap作用一样,接口也基本相同。与vector一样,方法是同步的,如果对兼容性没要要求,就使用HashMap。如果需要并发访问,应该使用ConcurrentHashMap。
扩容机制:初始容量为11,每次扩容变为原来的2n+1.

  • HashMap 的长度为什么是2的幂次方?
    在散列表中,进行取余操作,使用的是hash%length=hash&(length-1)。两个操作相同,&运算的效率更高,但是长度必须是2的n次方。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355