Java集合框架

集合:

1,是可以存储很多元素的容器。
2,这个容器用于存储对象。
3,而且该容器的长度是可变的。

集合和数组的区别:

1,
数组是固定长度,
集合是可变长度。
2,
数组可以存储引用类型,也可以存储基本类型。
集合只能存储引用类型。

集合框架的由来:

集合有很多种,因为每一个集合中的数据结构(数据在容器中存取的具体的方式)都不一样。
但都具备共性功能,就不断地向上抽取。就形成了集合框架。该框架的顶层Collection接口。

学习框架原则:看顶层,用底层。

了解一下api中的Collection中的共性方法。
Collection中的共性方法:

1,添加:
   add(Object)
   addAll(collection)
2,删除:
   remove(object)
   removeAll(collection)
   clear();
   retainAll(collection);
3,判断:
   contains(object)
   containsAll(collection)
   isEmpty();
4,获取:
   size();
   iterartor();获取迭代器。每一个集合都具备。
5,转换 
   toArray(); 将集合转成数组。  

迭代器的使用:

 for(Iterator it = collection.iterator(); it.hasNext() ; ){
   System.out.println(it.next());
 } 

迭代器:是容器中的一个内部类,因为该类要直接访问容器中的元素。
同时对外提供了公共的访问规则Iterator接口。
这样的好处,不需要知道具体的容器,只要是Collection中的容器
都可以通过该种取出方法取出体系中的所有容器中的元素。
降低了具体容器和取出方式的耦合性。
想要获取集合中的迭代器对象,就可以通过iterator方法来完成。

Collection

  • List :有序的(存入的顺序和取出的顺序保持一致),该集合中的元素都有索引,可以有重复元素。
  • Set :不允许有重复元素。

List:特有方法:都是围绕的索引展开的。

 1,添加:
  add(index,element);
  add(index,collection);
 2,获取:
  get(index):通过角标获取元素。
  indexOf(object);
  lastIndexOf(object);
  subList(fromindex,toindex);
 3,删除:
  remove(index):通过角标删除元素,并返回被删除的元素。
 4,修改:
  set(index,element); 
 5,特有的迭代器。ListIterator。可以在迭代时进行元素的增删改查。

List具备着对容器中的元素进行增删改查的功能。只有该集合有。为啥呢?因为索引。

List
  • Vector:底层数据结构是一个数组。 而且数组可以增长。其实数组增长的原理:存储元素时,超出数组角标,会创建新数组,将原数组的数据复制到新数组中,并将新元素存储到新数组中。它是同步的。效率非常低。
  • ArrayList:底层数据结构也是可变长度的数组,是不同步的,比Vector效率高。查询元素的速度很快。
  • LinkedList:底层数据结构是链表数据结构,是不同步的。对元素的增删操作很快。
Set
  • HashSet:数据结构是哈希表,是不同步的。
  • TreeSet:数据结构是二叉树结构。是不同步的。可以对Set集合中的元素进行指定方式的排序。默认用的元素的自然排序。

Collection集合的子类对象阅读技巧。

具体的容器是什么结构?是否是同步?

通过名称就可以获得。容器的前缀名是数据结构的名字。后缀名是所属体系的名字。
凡是后缀名是体系名的集合,通常都是不同步的。

  • ArrayList:数据结构是数组。所属于List体系。看到数组必须想到索引,必须要知道查询速度快。
  • LinkedList:数据结构是链表,看到链表就要想到,增删速度快,而且要接的 add,get,remove的first last方法。
  • HashSet:数据结构是哈希表,看到哈希就必须想到对元素进行hashCode和equals方法的复写。
  • TreeSet:数据结构是二叉树,看到树,就要想到比较排序,就要想到两个接口,Comparable Comparator。

(二叉树结构也叫红黑结构左红右黑)默认元素的自然排序。可以对Set集合中的元素进行指定方式的排序。TreeSet判断元素唯一性的方式是比较方法的返回值是否为0,如果是0视为元素相同,不存。如果比较时主要条件相同就要看次要条件。弊端是不能存重复的

哈希表提升了查询速度,并保证了元素的唯一性,元素不唯一性会破坏表结构。
如果哈希值不同,直接存。如果哈希值相同,要进一步判断内容是否相同,用的是equals方法,如果equals返回true是相同元素则不存。如果返回false,不相同,则存储
元素要往哈希表结构的容器中存储,必须具备hashCode和equals方法,Object中已经提供了这两个方法。堆内存(存数据,对象)用的数据就是哈希表。因为对象的自身特点不同,有可能哈希算法的依据也不同。所以有可能要覆盖hashCode方法。Object的hashCode方法是本地方法调用的是windows的底层算法 几乎很少有冲突,,所以就没法保证唯一性,所以要定义自己的算法来覆盖。

技巧:为了保证唯一 一般在age后乘以一个数,因为很有可能两个人名字不同年龄不同但是算出的哈希值相同,这样会多判断一次equals,equals进栈会低效,所以为保证性能与唯一
乘以个数。。。。
TreeSet 不让它自动排序 可以控制return值 存入顺序和取出顺序一致则return正数 存入顺序和取出顺序相反return负数。

TreeSet判断元素唯一性的方式,是比较方法的返回值是否为0.如果是0,视为元素相同,不存。

排序方式有两种:
1,让元素自身具备比较性,该元素需要实现Comparable接口,覆盖compareTo方法。让元素具备了自然排序。该种方式有弊端,如果元素自身具备的自然排序不是所需要的,怎么办?还有,万一元素根本就不具备自然排序怎么办?
2,可以让容器自身具备比较性,而且应该添加元素之前。所以应该在容器对象创建时,就必须明确比较性。那就应该参考该容器的构造函数。发现可以指定一个比较器,定义一个Comparator接口的子类,并覆盖compare方法。将Comparator接口的子类对象作为参数传递给TreeSet集合的构造函数。

数据结构:数据存取的方式结构

两种数据结构:
堆栈:先进后出First In Last Out (FILO)
队列:先进先出First In First Out (FIFO)

既要速度快 又要有序 可以选择LinkedHashSet


Map

Map实现类用于保存具有映射关系的数据。Map保存的每项数据都是key-value对,也就是由key和value两个值组成。Map里的key是不可重复的,key用户标识集合里的每项数据。同一个Map对象的任何两个key通过equals方法比较总是返回false。

HashMap,TreeMap是我们经常会用到的集合类。

Map集合与Set集合、List集合的关系

1.与Set集合的关系
如果 把Map里的所有key放在一起看,它们就组成了一个Set集合(所有的key没有顺序,key与key之间不能重复),实际上Map确实包含了一个keySet()方法,用户返回Map里所有key组成的Set集合。
2.与List集合的关系
如果把Map里的所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中索引不再使用整数值,而是以另外一个对象作为索引。

怎样决定何时使用HashMap何时使用TreeMap?

对 于插入、删除、定位元素频繁的操作,HashMap提供了最好的效率。如果想要按key的排序来遍历,那么TreeMap是不二选择。某些情况下,依赖集 合的大小,先向HashMap中添加元素,然后转换为TreeMap再按key的排序进行遍历也许会带来效率上的提高。

HashMap

HashMap的数据结构:

数组的特点是:寻址容易,插入和删除困难;

而链表的特点是:寻址困难,插入和删除容易。

哈希表结合了两者的优点。

哈希表有多种不同的实现方法,可以理解将此理解为“链表的数组”

HashTable与HashMap的区别

HashTable和HashMap存在很多的相同点,但是他们还是有几个比较重要的不同点。

我们从他们的定义就可以看出他们的不同,HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。

HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。如下:当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。

Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用HashTable,没有涉及就采用HashMap,但是在Collections类中存在一个静态方法:synchronizedMap(),该方法创建了一个线程安全的Map对象,并把它作为一个封装的对象来返回,所以通过Collections类的synchronizedMap方法是可以我们你同步访问潜在的HashMap。

遍历不同:HashMap仅支持Iterator的遍历方式,Hashtable支持Iterator和Enumeration两种遍历方式。

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

推荐阅读更多精彩内容