浅谈集合

1.集合和数组的区别

集合:长度可变,可以存放不同类型的元素,只能存放引用类型
  数组:长度固定,只可以存放相同的同种类型的元素,可以存放数据类型也可以存放引用类型

2.java工具类  如下图:

.

3.List、Set、Map是这个集合体系中最主要的三个接口。List和Set继承自Collection接口。 Map也属于集合系统,但和Collection接口不同。

1.Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。Set只能通过游标来取值,并且值是不能重复的。
2.List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。ArrayList 是线程不安全的, Vector 是线程安全的,这两

个类底层都是由数组实现的 LinkedList 是线程不安全的,底层是由链表实现的
3.Map 是键值对集合,其中key列就是一个集合,key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是Map的三个主要的实现类。

HashTable 是线程安全的,不能存储 null 值 HashMap 不是线程安全的,可以存储 null 值

4..Collection 集合接口(没有获取元素的方法,在其子类中有)(主要说上图带有红框的部分)

Collection中的存放的数值可以重复,有序

List 和 Set接口继承Collection接口,

LIst接口可以由Vector,ArrayList,LinkedLIst实现

Set接口可以由HashSet,SortedSet实现

  • Collection 中的主要方法有(前者为返回值类型,后面是方法)(红色的为重要的方法)

  1. boolean add(Object element):向此collection中添加元素
  2. Int size():返回此collection中的元素个数(或者是集合的长度)
  3. boolean isEmpty():判断此collection中是否包含元素
  4. boolean contains(Object obj):判断此collection是否包含指定的元素
  5. boolean containsAll(Collection c):判断此collection是否包含指定collection中的所有元素
  6. boolean addAll(Collection c):将指定collection中的所有元素添加到此collection中
  7. boolean remove(Object element):从此collection中移除指定的元素(第一个与之匹配的数值)
  8. boolean removeAll(Collection c):移除此collection中包含在指定collection中的所有元素
  9. void clear():移除collection中所有的元素
  10. boolean retainAll(Collection c); 仅保留此collection中和指定collection的交集元素
  11. Iterator iterator():返回此collection元素的迭代器
  12. Object[] toArray():把此collection转成数组
  • List集合的主要方法(Collection接口中存在的方法,list接口可调用)还额外扩充了一些常用方法:

  1. Object get(int index) 获取指定位置索引的元素
  2. void add(int index, Object element);在指定位置插入指定元素,其他元素依次后移
  3. Object set(int index, Object element) 用指定元素替换指定位置的元素
  4. List subList(int fromIndex, int toIndex) 返回列表中指定的fromIndex(包括 )和 toIndex(不包括)之间的部分列表
  5. int indexOf(Object o) 根据元素获得索引;如果此列表不包含该元素,则返回 -1。(从左到右的第一个元素)
  6. int lastIndexOf(Object o)根据元素获得索引;如果此列表不包含该元素,则返回 -1。(从右到坐的第一个元素)
  • ArrayList是List接口的实现类,底层使用数组结构实现(调用的方法可以在List中找)在这里说Arraylist的三种遍历方式

  • 先创建一个集合

  1. 使用索引遍历

2.使用Object类型的遍历

3.迭代器遍历

//hasNext()判断是否有下一个元素

//next()获取下一个元素

ArrayList排序

想要实现排序,集合中所存放的数据类型
这个类必须实现compareto接口(重写compareto方法)

在Java中数组排序的方法是java.util.Arrays.sort(数组)

  • LinkedList是List接口的另一个常用实现类,底层使用双向链表实现

  • LinkedList除了实现List接口外,还实现了Queue接口,并提供了对列表开头、结尾操作的方法,使得LinkedList具有栈、队列的双重特点。
  • 栈:后进先出,LastInFirstOut,LIFO
  • 入栈  push()(添加元素);出栈 pop()(删除栈顶元素)(弹栈);
  • 队列:后进后出,LastInLastOut,LILO
  • 入队 offer()(添加元素);  出队poll()(删除队首元素);
  1. add() 添加元素        addLast()在此时的队尾添加元素         addfirst() 在此时的队首添加元素
  2. offerLast() 在此时的队尾添加元素
  3. get(int index):返回此列表中指定位置处的元素    getFirst():返回此列表的第一个元素          getLast():返回此列表的最后一个元素
  4. peek():获取但不移除此列表的头(第一个元素)
  5. peekFirst():获取但不移除此列表的第一个元素    peekLast():获取但不移除此列表的最后一个元素
  6. pollFirst():获取并移除此列表的第一个元素      pollLast():获取并移除此列表的最后一个元素

ArrayList和LinkedList对比
 1.查找元素时,ArrayList效率高
 2.进行插入和删除元素时,LinkedList效率高

5.Set接口:set中存放的元素是无序的(存放顺序)无重复数据 无获取索引的方法

Set接口常用实现类:

HashSet:  不记录添加数据的顺序,且加入的元素不能重复,否则覆盖。(基于哈希散列,Set存、取、删 都有较高的效率)

加入HashSet集合的自定义类型的对象通常需要重写hashCode()和equals()方法。通过hashcode()获取到任何一个对象的哈希码值

hashCode()用于判断是否是同一类型的,equals()标记,根据哪个属性排序

TreeSet  同样不记录添加数据的顺序,但是可以对存入的元素进行排序(基于红黑树实现),输出也会按照排序后的顺序 (排好序的)

LinkedHashSet  根据元素的哈希码进行存放,同时用链表记录元素的插入顺序(有序的:存取数据的位置无变化)

set常用的方法:

add()添加

remove()删除

clear()清空

6.Map接口:Map接口用来存储“键-值”映射对

Map中存储的“键-值”映射对是通过键来唯一标识,Map的“键”底层采用Set来存放。 因此,存入Map中的“键”如果是自定义类,应该重写hashCode()和equals()方法,确保键的唯一 常用String作为Map的"键"。

1.常用的方法

put(K key, V value):将指定的"键-值"对存入Map中

get(Object key):返回指定键所映射的值

int size():获得此Map中"键-值"对的数量

remove(Object key):根据指定的键把"键-值"对从Map中移除

*boolean containsKey(Object key):判断Map是否包含指定的键

*boolean containsValue(Object value):判断此Map是否包含指定的值

boolean isEmpty():判断此Map中是否有元素

void clear():清空Map中的所有"键-值"对

Set<K> keySet():返回此Map中包含的键的Set集合。

Collection<V> values():返回Map中包含值的Collection集合

replace(Object key,Object values)替代指定key值得values值

2.HashMap内部对“键”使用Set进行散列存放。因此,根据“键”取“值”的效率较高,也是Map接口使用频率较高的一个实现类。

 ①通过key值  获得value值

获取集合中所有key值(get)

用foreach语句循环遍历key值    得到value值

②获取集合总所有value值

③获取map集合中成对的数据

Map.Entry是Map内部定义的一个static接口,专门用来保存key-value对的内容。

通过entrySet()方法取到Entry对象,然后使用getKey(),getValue()获取键、值 一般情况下,map多用于存放、查找数据,遍历输出的情况较少。

3.TreeMap

TreeMap内部使用红黑树结构对“key”进行排序存放,所以放入TreeMap中的“key-value”对的“key”必须是“可排序”的

4.区别

HashMap的键采取哈希值存储,不记录元素插入的位置,也不排序

TreeMap的键采取红黑树存储,不记录元素插入的位置,但是可以排序

LinkedHashMap的键采取哈希值存储,并使用链表记录元素插入的位置,不排序

5.选择使用集合

存放要求
无序,无下标,不可重复,不能随机访问-Set
有序,有下标,可重复,可以随机访问-List
“key-value”对,较多存放,较少遍历-Map
读和改(插入删除)的效率
Hash-两者都较高
ArrayList-读(指定下标随机访问)快,插入/删除元素慢
LinkedList-读(指定下标随机访问)慢,插入/删除元素快

//^_^本人新人,以上是上课记得笔记和自己的理解,如有异议,欢迎一起讨论

时间: 2024-10-11 14:30:56

浅谈集合的相关文章

浅谈集合---动态数组

集合---一个存储数据的"无底洞"\动态数组,集合的作用和数组一样可以存储多个数据.但是集合中能够存储的数据的个数是动态增长的.随着我们往集合中新增元素的增多而自动增大.那么为什么它的长度可以变化呢? 其实集合的本质就是数组,只不过当数组中存储的元素的个数等于数组长度的时候,就会自动new一个新数组,长度是原来的数组的两倍,在将原始的数据拷贝到新数组中,然后把旧数组的引用重新指向刚刚new的新数组,从而实现了动态增长! 浅谈集合---动态数组,布布扣,bubuko.com

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

浅谈Android多屏幕的事

浅谈Android多屏幕的事 一部手机可以同时看片.聊天,还可以腾出一支手来撸!这么吊的功能(非N版本,非第三方也能实现,你不知道吧)摆在你面前,你不享用?不关注它是怎样实现的?你来,我就满足你的欲望! 一部手机可以同时看片.聊天,还可以腾出一支手来撸==!就像这样: 是时候告别来回切换应用屏幕的酸爽了,还可以在分屏模式下两Activity间直接拖放数据! 好高大上的样子!这是怎么实现的?别急,我们一一道来: kitkat(4.4)版本对多任务分屏的实现 由于相关的代码和功能被封装及隐藏起来,所

浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)——requirejs + angular + angular-route>探讨了angular+requirejs的一个简单架构,这一篇继续来看看backbone如何跟requirejs结合. 相同地,项目架构好与坏不是说用了多少牛逼的框架,而是怎么合理利用框架,让项目开发更流畅,代码更容易管理.那么带着这个目的,我们来继续探讨backbone. 首

浅谈算法和数据结构

: 一 栈和队列 http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算

安卓开发_浅谈ListView(自定义适配器)

ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ,实现图片文字混合列表 1 package com.example.work; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 7 8 import android.R.in

浅谈移动前端的最佳实践(转)

前言 这几天,第三轮全站优化结束,测试项目在2G首屏载入速度取得了一些优化成绩,对比下来有10s左右的差距: 这次优化工作结束后,已经是第三次大规模折腾公司框架了,这里将一些自己知道的移动端的建议提出来分享下,希望对各位有用 文中有误请您提出,以免误人自误 技术选型 单页or多页 spa(single page application)也就是我们常常说的web应用程序webapp,被认为是业内的发展趋势,主要有两个优点: ① 用户体验好 ② 可以更好的降低服务器压力 但是单页有几个致命的缺点:

浅谈自然语言处理基础(下)

命名实体识别 命名实体的提出源自信息抽取问题,即从报章等非结构化文本中抽取关于公司活动和国防相关活动的结构化信息,而人名.地名.组织机构名.时间和数字表达式结构化信息的关键内容,所以需要从文本中去识别这些实体指称及其类别,即命名实体识别和分类. 21世纪以后,基于大规模语料库的统计方法成为自然语言处理的主流,以下是基于统计模型的命名实体识别方法归纳: 基于CRF的命名实体识别方法 基于CRF的命名实体识别方法简便易行,而且可以获得较好的性能,广泛地应用于人名.地名和组织机构等各种类型命名实体的识

C#中,用HashTable,DataTable等复制和克隆浅谈

如有雷同,不胜荣欣,若转载,请注明 在C#中,用HashTable,DataTable等复制和克隆浅谈,下面直接看例子 HashTable ht = null; ht = new HashTable(); foreach(string s in ht) { //... } //上面遍历的时候需要修改HashTable中的键值,一般会报异常,提示您的集合已修改XXX什么的,因为foreach遍历的时候,in 后面的集合不可更改 //这个时候应该我想到了,应该在遍历之前复制一份, HashTable