java集合框架的结构_Java集合框架(一)-程序员宅基地

技术标签: java集合框架的结构  

Java集合框架结构图完整版

f4322822c5f6a28daadb007e4fe5b982.png

在完整版的结构图中Collection集合和Map下有许多未实现的抽象类(AbstractCollection、AbstractMap等等)。下面整理一个简化版的,去除了一些不常用的子类和中间的一些抽象类。

Java集合框架结构图简化版

931b3fcc15809e4ed462780cded8fffc.png

说集合之前先来讲讲对象数组:

对象数组:

数组可以储存基本类型和引用类型,储存引用类型的数组叫对象数组(案例:用数组储存10个Animal类对象)

集合(Collection):

a)集合的由来:

Java语言是面对对象语言,需要操作众多的对象,所以我们需要一种容器(如:数组和StringBuilder)来储存这些的对象,而数组长度是不可变的,在实际操作中,适应不了多变的需求,所有Java就提供了集合供我们使用。

b)集合与数组的区别:

1.长度区别:数组长度固定;集合长度可变。

2.内容区别:数组可以是基本类型,也可以是引用类型;集合只可以是引用类型。

3.元素:数组只可以是一种元素;集合可以是多种元素。

c)集合的架构:如上图结构;

d)集合的主要功能:

1.增加功能;

2.删除功能;

3.判断功能;

4.获取功能;

5.长度功能;(注意:长度是size,不是length)

6.集合转数组

e)集合的遍历:

1.迭代器Iterator;

2.增强for;

下面先从Collection开刀:

概述:

Collection是单列集合的顶层接口,子接口有List和Set两个继承体系。

使用:

A)创建集合对象

Collection c = new ArrayList();

B)创建元素对象

Student[] s = new Student();

C)把元素对象添加到集合中

c.add(s[0]);

D)遍历:

1.创建迭代器   Iterator it = c.iterator();

2.向下转型       Student s = (Student)c.next

功能(源码方便自己回忆 = 。=):

1 public classCollectionDemo {2

3 public static voidmain(String[] args) {4

5 //创建对象

6

7 Collection c = newArrayList();8

9 //添加功能

10

11 c.add("wo");12

13 c.add("ai");14

15 c.add("ni");16

17 System.out.println(c);18

19 //删减功能20

21 //c.clear();

22

23 System.out.println("remove:"+c.remove("wo"));24

25 System.out.println(c);26

27 //判断功能

28

29 System.out.println("contains:"+c.contains("ai"));30

31 System.out.println("isEmpty:"+c.isEmpty());32

33 //长度

34

35 System.out.println("size:" +c.size());36

37 }38

39 }40

41 遍历:42

43 (A).Iterator是Collection集合专有的迭代器44

45 Iterator it = c.iterator();//创建迭代器对象

46

47 while (it.hasNext()) {//判断是否有下一个元素

48

49 Student s1 = (Student) it.next();//向下转型

50

51 System.out.println(s1.getName() + "---" +s1.getAge());52

53 }54

55 (B).用增强for遍历Collection56

57 for(String s : c) {//格式:类型 变量名 :遍历对象

58

59 System.out.println(s);60

61 }

Collection子接口之List:

概述:

List是Collection集合的子接口,所以使用与Collection一样,特点是有序,可重复。

List的子类特点:

A)ArrayList

底层结构是数组,查询快,增删慢

线程不安全,效率高

B)Vector(上面结构框架中标住遗留,由于性能比ArrayList低,所以逐渐被代替了)

底线结构是数组,查询快,增删慢

线程安全,效率低

C)LinkedList

底层结构是链表,查询慢,增删快

线程不安全,效率高

特有功能:

因为List是Collection的子接口,所以上面的Collection中所有功能都有,且用法一样。

A)指定添加:add(int index,elem e) 在指定位置加入元素

B)指定获取: get(int index) 获取指定位置元素

C)指定删除:Object remove(int index) 删除指定位置元素,返回被删元素

E)指定修改:Object set(int index) 修改指定位置元素,返回被修改元素

可见List相比Collection最大特点就是可以指定操作,这正是List的有序特性

老规矩源码方便回忆 = 。=

1 public classTeyou {2

3 public static voidmain(String[] args) {4

5 //创建对象

6

7 List list = newArrayList();8

9 String[] s = new String[3];10

11 s[0] = "aaa";12

13 s[1] = "bbb";14

15 s[2] = "ccc";16

17 //添加功能:18

19 //add(int index,elem e) 在指定位置加入元素

20

21 list.add(s[0]);22

23 list.add(s[1]);24

25 list.add(s[2]);26

27 list.add(1, s[2]);28

29 System.out.println(list);30

31 System.out.println("---------------------------");32

33 //获取功能34

35 //get(int index) 获取指定位置元素

36

37 System.out.println(list.get(1));38

39 System.out.println("---------------------------");40

41 //删除功能42

43 //Object remove(int index) 删除指定位置元素,返回被删元素

44

45 System.out.println(list.remove(3));46

47 System.out.println("list:" +list);48

49 System.out.println("---------------------------");50

51 //修改功能52

53 //Object set(int index) 修改指定位置元素,返回被修改元素

54

55 System.out.println(list.set(1, "wo ai ni"));56

57 System.out.println("list:" +list);58

59 }60

61 }

遍历:ListIterator是List的一个特有的迭代器。

该迭代器继承了iterator迭代器,所以有next()和hasNext()方法,还有它特有的previous()逆向遍历,但必须要正向后才能逆向。

List子接口之ArrayList:

概述:

ArrayList在上面的结构框架中我用了红色字体,它是非常常用的集合,所以要重点掌握。ArrayLIst是List的一个子类,实现类。

ArrayList:

关于ArrayList,其实上面都已经讲了,把Collection和List的所有操作合并就是ArrayLsit的功能了。

List子接口之LinkedList:

概述:

LinkedList的底层是链表结构,所以它可以在表头和表尾处添加元素。操作与链表的操作差不多。

LinkedList特有功能:

A)添加功能

public void addFirst(Object obj)//在表头添加元素

public void addLast(Object obj)//在表尾添加元素

B)获取功能

public Object getFirst()//获取表头元素

public Object getLast()//获取表尾元素

C)删除功能

public Object removeFirst()//删除表头元素

public Object removeLast()//删除表尾元素

Collection子接口之Set:

概论:

Set和List一样属于Collection集合的子接口,Set的特点是无序的(储存顺序与获取顺序不一定一致),唯一的。Set的实现子类有HashMap、TreeSet、LinkedHashSet,在下面逐个展示。

Set的子类特点:

A)HashMap

底层数据结构是哈希表。

保证元素唯一性的依赖两个方法:

hashCode()和equals()开发中自动生成这两个方法即可

B)TreeSet

特点是有序和唯一,底层数据结构是红黑树(一种自平衡二叉树,具体我也不太懂,不过挺重要的=。=)

保证元素排序依赖:

自然排序

比较器排序(优先)

保证元素唯一性依赖:

根据比较的返回值是否是0来决定

C)LinkedHashSet

哈希表一个子类,类似于HashMap(后面再说),但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。

Set功能:

既然Set是Collection的一个子接口,所以上面的Collection所有功能都有。Set的特点是元素是唯一的,它的唯一性是依赖元素对象重写的equals()方法实现的。

这里先不详讲,下面通过它的子类来了解它。

Set子接口之HashSet:

特有功能范例:

1 Sets = new HashSet();//创建HashSet对象

2

3 s.add(new Student("java",30));4

5 s.add(new Student("c#",10));6

7 s.add(new Student("php",20));8

9 s.add(new Student("php",20));//相同元素不能被加入集合中

10

11 for(Student s1 : s) {12

13 System.out.println(s1.getName() + "---" + s1.getAge());}

Set子接口之TreeSet:

下面展示一个范例,按照姓名的长度将Set中集合进行排序,其中比较器Comparator用匿名内部类写:

1 public static voidmain(String[] args) {2

3 //方法一自定义比较器类排序4

5 //创建集合对象6

7 //TreeSetts = new TreeSet();8

9 //public TreeSet(Comparator comparator)10

11 //TreeSetts = new TreeSet(new MyComparator());//MyComparator类自己第一12

13 //方法二匿名内部类

14

15 TreeSetts = new TreeSet(newComparator() {16

17 @Override下面是匿名内部类内容18

19 public intcompare(Student s1, Student s2) {20

21 //姓名长度

22

23 int num = s1.getName().length() -s2.getName().length();24

25 //姓名内容

26

27 int num2 = num == 0 ?s1.getName().compareTo(s2.getName())28

29 : num;30

31 //年龄

32

33 int num3 = num2 == 0 ? s1.getAge() -s2.getAge() : num2;34

35 returnnum3;36

37 }38

39 });40

41 //创建元素

42

43 Student s6 = new Student("wuqilong", 10);44

45 Student s2 = new Student("zhangguorong", 29);46

47 Student s3 = new Student("wanglihong", 23);48

49 Student s1 = new Student("linqingxia", 27);50

51 Student s4 = new Student("linqingxia", 27);52

53 Student s5 = new Student("liushishi", 22);54

55 Student s8 = new Student("linqingxia", 29);56

57 Student s7 = new Student("fengqingy", 22);58

59 //添加元素

60

61 ts.add(s1);62

63 ts.add(s8);64

65 ts.add(s3);66

67 ts.add(s2);68

69 ts.add(s5);70

71 ts.add(s4);72

73 ts.add(s7);74

75 ts.add(s6);76

77 //遍历

78

79 for(Student s : ts) {80

81 System.out.println(s.getName() + "---" +s.getAge());82

83 }84

85 }

Collection集合体系就先这样了,Map集合的后面再奋斗了【捂脸】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40004502/article/details/114309893

智能推荐

dotnetbar winform 美化控件_winform tabcontrol控件美化-程序员宅基地

文章浏览阅读1w次。官方资料:http://www.devcomponents.com/dotnetbar/DotNetBar = Professional ApplicationsDotNetBar Suite for Windows Forms is toolbox of 75 stunning components for creatingprofessional user in_winform tabcontrol控件美化

ui框架 js框架_我们如何再次编写最快的javascript ui框架-程序员宅基地

文章浏览阅读540次。ui框架 js框架I have a process. I apply this to almost any sort of problem I face.我有一个过程。 我将此应用于几乎所有我遇到的问题。Step 1. Define the problem 步骤1.定义问题This for me often takes the longest. It is absolutely critical..._uijsoeh

ArcGIS Pro常见地图包系列--切片包(TPK)_arcgis pro 地图切片-程序员宅基地

文章浏览阅读4.3k次,点赞2次,收藏4次。1. 切片包 ArcGIS中所说的切片包特指栅格切片包。地图切片是指采用预生成的方法存放在服务器端,然后根据用户提交的不同请求,把相应的地图瓦片发送给客户端的过程,它是一种多分辨率层次模型,从瓦片金字塔底层到顶层,分辨率越来越低,但表示的地理范围不变。优点:1)速度快,预先配色,显示效果佳,满足高并发访问,适合做底图。2)瓦片地图缓存非常高效,如果你曾经查看过某一区域的瓦片,当你再次查看该区域的瓦片时,浏览器可能使用之前缓存的相同的瓦片,而不用重新下载一次。3)瓦片地图可以渐..._arcgis pro 地图切片

黑马程序员-----java基础 面向对象-程序员宅基地

文章浏览阅读312次。------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

MapReduce实现分组排序_mapreduce 分组排序-程序员宅基地

文章浏览阅读4.1k次。MapReduce实现分组排序以某次竞赛为例,分别进行如果实现:取每组中男生前三名成绩和女生前三名成绩按照年龄分组降序输出所有人的成绩等价的SQL0. 预备知识0.1 基于MapReduce实现分组、排序:分组:相当于group by。MapReduce的实现:相当于分区,以求处理手机上网日志为例,把手机号和非手机号分为两组。_mapreduce 分组排序

HashTable实现原理-程序员宅基地

文章浏览阅读1.7w次,点赞6次,收藏27次。 有两个类都提供了一个多种用途的hashTable机制,他们都可以将可以key和value结合起来构成键值对通过put(key,value)方法保存起来,然后通过get(key)方法获取相对应的value值。一个是前面提到的HashMap,还有一个就是马上要讲解的HashTable。对于HashTable而言,它在很大程度上和HashMap的实现差不多,如果我们对HashMap比较了解的话,对H..._hashtable实现

随便推点

Vue +Element UI (饿了么UI) +Echarts 实现图表自适应配置_饿了么ui实现使用echarts-程序员宅基地

文章浏览阅读4.5k次。接到一个需求,让用户能够通过配置, 配置出自己想要的统计图, 填入数据分析需求:1.需要客户配置的数据项有哪些?2.客户配置数据的存储一.可配置的项主标题(带颜色),副标题(带颜色) 图表种类(分为 坐标系,非坐标系图, 差别在于 有无 xAxis, yAxis 属性) 图表背景色 是否需要开启类目 是否需要开启工具(左上角下载图片等工具) 类目的位置 图表的类型 ..._饿了么ui实现使用echarts

营业执照编码验证规则(15位和18位)_营业执照位数18-程序员宅基地

文章浏览阅读10w+次,点赞3次,收藏17次。鉴于历史原因,营业执照注册号为15位,但是自2016年7月1日后,“三证合一、一照一码”,将营业执照正副本照面加载的15位注册号调整为18位的法人和其他组织统一社会信用代码(个体工商户营业执照除外)。为了兼顾,同时使用两种编码的校验,15位编码的校验依据GS15—2006 《工商行政管理市场主体注册号编制规则》,代码结构工商注册号由14位数字本体码和1位数字校验码组成,其中本体码从左至_营业执照位数18

Postman传递List参数_postman传list-程序员宅基地

文章浏览阅读2.1w次,点赞13次,收藏31次。前几天用postman测试接口,需要传递一个List<对象>的参数,传递List<字符串>或者其他普通类型还是很简单的,但这需要传递一个对象集合,所以当时懵了一会,尝试了几次放弃了,然后百度了一下,话不多说,上图先上一张postman错误的图片斜体样式下面这张是正确的(至少我的接口可以接收到List参数)接下来贴上代码public 返回值 方法名(@RequestB......_postman传list

你写的代码、你朋友写的代码、GitHub上的代码 | 每日趣闻-程序员宅基地

文章浏览阅读366次。让全世界看到程序员的幽默!往 期 趣 闻☞揭秘程序员给产品经理的备注竟是…… | 每日趣闻☞程序员最常说的谎言是什么? | 每日趣闻☞程序员必知必会的“从入门到放弃”系列! | 每日趣闻☞程序员“修仙”图鉴 | 每日趣闻☞揭秘互联网人的真实工作状态 | 每日趣闻五大模块系统掌握Python编程技能!https://edu.csdn.net/topi..._你的代码,朋友的代码,github

IBM Spectrum LSF Suites 介绍-程序员宅基地

文章浏览阅读162次,点赞7次,收藏4次。LSF异构、高扩展性和可用架构可为传统的高性能计算和高吞吐量工作负载提供支持,也适用于大数据、认知、GPU 机器学习和容器化工作负载。借助更多访问 HPC 资源的方式提高用户生产力,包括用于作业监视和通知的移动设备客户端,以及用于 Windows 环境的集成式桌面客户端。自动检测和配置 NVIDIA GPU 以简化 GPU 服务器的管理,并充分利用 NVIDIA GPU 的行为监视、运行状况和诊断以及会计和进程统计信息。通过将增强的用户接口与政策和自动化相结合,创造更出色的成果。

数据库学习—SQL语言概述_sql操作中的撤销重做-程序员宅基地

文章浏览阅读965次。数据库及SQL初学_sql操作中的撤销重做

推荐文章

热门文章

相关标签