1 Java集合简介

Java是一门面向对象的语言,就免不了处理对象,为了方便操作多个对象,那么我们就得把这多个对象存储起来,想要存储多个对象(变量),很容易就能想到一个容器(集合)来装载

简单来说集合就是“由若干个确定的元素所构成的整体”。就是Java给我们提供了工具方便我们去操作多个Java对象。

  • 1.集合只能存放对象。比如你存入一个int型数据66放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型。
  • 2.集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。
  • 3.集合可以存放不同类型,不限数量的数据类型。

1.1 如何学习集合

首先需要了解集合的分类,以及集合用法(看api),实现类,各有什么功能和不同,这在面试中经常会考到,再一个就是从数据结构层面底层去考虑这些问题,虽然以后在工作中多数人都不会涉及,但是这是考验学习能力的一种方式。

1.2 集合的主要三种类型

  • List:一种有序列表的集合,例如,按索引排列的Student的List;
  • Set:一种保证没有重复元素的集合,例如,所有无重复名称的Student的Set;
  • Map:一种通过键值(key-value)查找的映射表集合,例如,根据Student的name查找对应Student的Map。

1.2 关于使用集合的心得

  • 如果是集合类型,有List和Set供我们选择。List的特点是插入有序的,元素是可重复的。Set的特点是插入无序的,元素不可重复的。至于选择哪个实现类来作为我们的存储容器,我们就得看具体的应用场景。是希望可重复的就得用List,选择List下常见的子类。是希望不可重复,选择Set下常见的子类。
  • 如果是Key-Value型,那我们会选择Map。如果要保持插入顺序的,我们可以选择LinkedHashMap,如果不需要则选择HashMap,如果要排序则选择TreeMap。

常见的数据结构

数据结构指的是数据的组存储方式,不同的数据结构有不同的特点。

  1. 数组结构(ArrayList底层结构)   查询快,增删慢
  2. 链表结构(LinkedList底层结构)   查询慢,增删快
  3. 栈和队列   栈:先进后出(子弹夹,杯子)   队列:先进先出(排队,管子)

栈和队列

链表

2 集合的分类

2.1.常用集合的归纳:

List 接口:元素按进入先后有序保存,可重复

  1. LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
  2. ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
  3. Vector 接口实现类 数组, 同步, 线程安全(Stack 是Vector类的实现类)

Set 接口: 仅接收一次,不可重复,并做内部排序

  1. HashSet 使用hash表(数组)存储元素
  • LinkedHashSet 链表维护元素的插入次序
  1. TreeSet 底层实现为二叉树,元素排好序

2.2.最主要是看图:

集合与数组的区别

数组和集合的区别:

  • 1:长度的区别

    • 数组的长度固定
    • 集合的长度可变
  • 2:内容不容
    • 数组存储的是同一种类型的元素
    • 集合可以存储不同类型的元素(但是一般我们不这样干..)
  • 3:元素的数据类型

    • 数组可以存储基本数据类型,也可以存储引用类型
    • 集合只能存储引用类型(你存储的是简单的int,它会自动装箱成Integer)

3.Collection

Collection常见方法

  1. 添加功能 boolean add(E e) 添加一个元素 boolean addAll(Collection c)
    添加一批元素
  2. 删除功能 boolean remove(Object o) 删除一个元素
  3. 判断功能 boolean contains(Object o) 判断集合是否包含指定的元素 boolean isEmpty()
    判断集合是否为空(集合中没有元素)
  4. 获取功能 int size()
    获取集合的长度
  5. 转换功能 Object[] toArray() 把集合转换为数组

Collection:使用技巧

3.1 list和set的区别:

3.2 list

  1. ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
  2. LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
  3. Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素

list常见方法

1.add(int index, Object ele)

2.boolean addAll(int index, Collection eles)

3.Object get(int index)

http://4.int indexOf(Object obj)

http://5.int lastIndexOf(Object obj)

6.Object remove(int index)

7.Object set(int index, Object ele)

8.List subList(int fromIndex, int toIndex)

3.3 set集合

Set集合的特点是:元素不可重复

  1. HashSet集合
  • 底层数据结构是哈希表(是一个元素为链表的数组)
  • 不能保证元素的顺序。
  • HashSet不是线程同步的,如果多线程操作HashSet集合,则应通过代码来保证其同步。
  • 集合元素值可以是null。
  • 影响哈希冲突的条件,首先看哈希值是否相等,然后判断equals是否相等(内容是否相等)
  1. TreeSet集合
  • A:底层数据结构是红黑树(是一个自平衡的二叉树)
  • B:保证元素的排序方式(自然排序),实现Comparable接口
  1. LinkedHashSet集合
  • A::底层数据结构由哈希表和链表组成。
  • 原来存储是什么顺序,就是什么顺序

各Set实现类的性能分析

  • HashSet的性能比TreeSet的性能好(特别是添加,查询元素时),因为TreeSet需要额外的红黑树算法维护元素的次序,如果需要一个保持排序的Set时才用TreeSet,否则应该使用HashSet。
  • LinkedHashSet是HashSet的子类,由于需要链表维护元素的顺序,所以插入和删除操作比HashSet要慢,但遍历比HashSet快。
  • EnumSet是所有Set实现类中性能最好的,但它只能 保存同一个枚举类的枚举值作为集合元素。
  • 以上几个Set实现类都是线程不安全的,如果多线程访问,必须手动保证集合的同步性,这在后面的章节中会讲到。

3.4遍历Collection集合的方式

1.普通的for循环【必须要有索引,可以修改元素】

  • 注意set集合是无序的不能使用普通for循环遍历,只能使用增强for或者迭代器遍历
import java.util.*;public class test{public static void main(String[] args) {ArrayList<String> list = new ArrayList<String>();list.add("Hello");list.add("Java");list.add("World");list.add("轩成笔记");for (int i = 0; i < list.size(); i++){String s = (String) list.get(i);System.out.println(s);}}
}

2.迭代器遍历【任何集合都可以遍历,只能获取元素】

  • 只要是Collection集合都适合
  • 它是Java集合的顶层接口(不包括map系列的集合,Map接口是map系列集合的顶层接口)

1. Object next():返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型。

2. boolean hasNext():判断容器内是否还有可供访问的元素。

3. void remove():删除迭代器刚越过的元素。

  • 所以除了map系列的集合,我么都能通过迭代器来对集合中的元素进行遍历。
  • 注意:我们可以在源码中追溯到集合的顶层接口,比如Collection接口,可以看到它继承的是类Iterable
import java.util.*;public class test{public static void main(String[] args) {Collection<String> c = new ArrayList<String>();c.add("Hello");c.add("Java");c.add("World");c.add("轩成笔记");//获取迭代器对象Iterator<String> it = c.iterator();//hasNext()判断是否有下一个元素,如果有就用next()获取while(it.hasNext()){//获取下一个元素String s = it.next();System.out.println(s);}}
}

3.高级for循环【就是迭代器的简化方式】

import java.util.*;public class test{public static void main(String[] args) {Collection<String> c = new HashSet<String>();c.add("Hello");c.add("Java");c.add("World");c.add("轩成笔记");//高级for遍历集合for (String s : c){System.out.println(s);}int[] arr = {1, 2, 3, 4, 5};//高级for遍历数组for (int a : arr){System.out.println(a);}}
}

4.1 Map详解:

  1. Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value
  2. Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的 值。
  3. Collection中的集合称为单列集合,Map 中的集合称为双列集合。需要注意的是,Map中的集合不能包含重复的键值可以重复;每个键只能对应一个值。

4.2小结

  1. HashMap 非线程安全
  2. HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
  3. TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

4.3 map各类实用场景

HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允许空键值,而HashTable不允许。

HashMap:适用于Map中插入、删除和定位元素。 Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

map的两种遍历方式KeySet、entrySet

1. Map集合的第一 种遍历方式:通过键找值的方式

方法: Set keySet() 返回此地图中包含的键的Set视图。 实现步骤:

  1. 使用keySet() ,把Map集合中的所有的key取出来,存入到一-个Set集合中
  2. 遍历set集合,获取到Map集合中的每一 个key
  3. 通过Map集合中的V get(0bject key), 获取到所有的Value值,输出
public class MapTest02 {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map. put( "赵丽颖", 168);map. put("杨颖" ,165);map. put("林志颖" ,155);Set<String> Set = map.keySet();//返回的是一个set集合for (String key : Set) {Integer value = map.get(key);System.out.println(key+" "+value);}}
}

2.Map集合的第二种遍历方式: 使用Entry 对象遍历

  • Entry:键值对(key-value)
  • 方法:
  • Map接口:
  • Set<Map. Entry<K, V>> entrySet() 返回此地图中包含的映射的Set视图。
  • java. util Interface Map. Entry<K, V>:
  • K getKey()返回与此条目相对应的键。
  • V getValue() 返回与此条目相对应的值。
  • 实现步骤:
  1. 使用Map集合中的entrySet()方法,把集合中多个Entry对象取出来,存储到一个Set 集合中
  2. 遍历Set集合,获取到每一个Entry
  3. 调用Entry中的getKey()和IgetValue()方法获取键和值
public class MapTest03 {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map. put( "赵丽颖", 168);map. put("杨颖" ,165);map. put("林志颖" ,155);Set<Map.Entry<String, Integer>> set = map.entrySet();for (Map.Entry<String, Integer> entry : set) {System.out.println(entry.getKey()+entry.getValue());}}
}

有帮到你的点赞、收藏一下吧

需要更多教程,微信扫码即可

java集合,Collection,list,set,map汇总相关推荐

  1. Java集合Set,List和Map等

    Java集合Set,List和Map等 1 Java集合框架 因为Java是面向对象的语言,对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.另一方面,使用Array存储对象 ...

  2. Java集合:Set、Map、List

    文章目录 Java集合:Set.Map.List 一.List 常用方法 1.增加功能 2.删除功能 3.修改功能 4.获取功能 5.判断功能 6.长度功能 7.把集合转换成数组 二.Set 常用方法 ...

  3. 有容乃大 ——Java集合(List/Set/Map)

    有容乃大 --Java集合(List/Set/Map) 数据结构的概念 数据结构定义: 数据结构是计算机对数据存储的一种安排. 就是计算机组织.存储数据的方式. 数据结构有哪些? 堆.栈.数组.队列. ...

  4. Java集合Collection接口中的常用方法演示

    Java集合Collection接口中的常用方法演示 添加 add(Objec tobj) 和 addAll(Collection coll) 获取有效元素的个数 int size() 清空集合 vo ...

  5. java 先进先出的map_「 深入浅出 」java集合Collection和Map

    本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...

  6. Java 集合Collection常见知识点汇总~

    看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中包含了一系列重要的集合类,而对于集合类,主要 ...

  7. Java—一篇读懂java集合(Collection/Map)及Lambda表达式

    集合简介   在集合类之前,我们使用数组存储,数组既可以存储基本数据类型的值,也可以存储对象(对象的引用变量),但是集合只能存储对象.   Java集合类似于一种容器,将同类型的对象(实际为对象引用) ...

  8. 略解java集合Collection

    java集合 一.什么是集合 集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体 而java面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类 二. ...

  9. Java集合框架List,Map,Set等全面介绍

    Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构. Java集合框架的基本接口/类层次结构: java.util.Colle ...

  10. Java集合Collection与List的关系、常见用法

    关系树 [java] view plain copy print? ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查找快 ...

最新文章

  1. Python学习笔记:面向对象高级编程(上)
  2. ie浏览器跳转谷歌浏览器_微软IE浏览器的命运:加速死亡
  3. 数据之路 Day5 - Python基础5
  4. 服务器系统设计流程,图书馆管理系统设计(含业务流程图).doc
  5. L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT
  6. [转载] Java 方法(方法重载)与数组
  7. linux SVN web 同步
  8. golang ide 环境搭建_golang环境搭建
  9. 通信原理 | 信道特性及其数学模型
  10. 摆脱某某助手,使用无线投屏功能共享安卓屏幕到PC
  11. Android模拟器Root
  12. linux趋势杀毒安装目录,Linux 杀毒软件ClamAV安装部署
  13. 百度冰桶算法说明,如何避免冰桶算法呢?
  14. 优矿量化向导式因子选股
  15. android pdf阅读器开发_PDF to EPUB Converter Mac(PDF转EPUB转换器)
  16. MVC5-Scaffolder
  17. OpenCV初试云雨
  18. 【虚幻引擎UE】UE5 超实用插件推荐
  19. EOS智能合约开发系列(六): eosio.token
  20. Python处理HDF5文件:h5py库

热门文章

  1. 最便宜的865旗舰来了!全球首款5G游戏手机发布
  2. 不止1亿像素相机 小米MIX 4有望首发第四代超声波屏下指纹
  3. 新晋千元王者!红米Note 8系列发布:999元起,价格真香
  4. 6400万像素时代来了,小米首个入局
  5. 2019年新款iPhone高清渲染视频来了 强迫症慎点...
  6. 索尼XA3曝光:同样是21:9屏幕 带鱼手机屏或成新潮流
  7. QQ春节福袋正式上线 解锁春节红包新姿势
  8. 根文件系统定制【ZT】
  9. 软件测试:Jmeter关联详解
  10. 已从事软件测试一年,感觉依然很菜,只会基础的功能测试,想进一步学习,有没有好的建议呢?