技术标签: java集合框架的结构
Java集合框架结构图完整版
在完整版的结构图中Collection集合和Map下有许多未实现的抽象类(AbstractCollection、AbstractMap等等)。下面整理一个简化版的,去除了一些不常用的子类和中间的一些抽象类。
Java集合框架结构图简化版
说集合之前先来讲讲对象数组:
对象数组:
数组可以储存基本类型和引用类型,储存引用类型的数组叫对象数组(案例:用数组储存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集合的后面再奋斗了【捂脸】
文章浏览阅读2.6k次,点赞5次,收藏13次。1)5.2.1弹出两次已连接或者未连接这是因为你同时打开了流量和WiFi,他就会发出两次广播。2)5.3.1中发送自定义广播问题标准广播未能弹出消息:Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST");sendBroadcast(intent);上述已经失效了。修改:Intent intent=new Intent("com.example.broadcasttest...._代码里的广播错误
文章浏览阅读249次。作者 |平名 阿里服务端开发技术专家导读:Kubernetes 作为云原生时代的“操作系统”,熟悉和使用它是每名用户的必备技能。本篇文章概述了容器服务 Kubernet..._k8知识库
文章浏览阅读923次。分别是etc/pear.conf,etc/php-fpm.conf, etc/php-fpm.d/www.conf,lib/php.ini。php8安装基本一致,因为一个服务期内有2个版本,所以注意修改不同的安装目录和端口号。可以直接使用sbin下的nginx命令启动服务。完成编译安装需要gcc支持,如果没有,使用如下命令安装。安装过程基本一致,下面是安装7.1.33的步骤。执行如下命令,检查已经安装的包和可安装的包。执行如下命令,检查已经安装的包和可安装的包。执行如下命令,检查已经安装的包和可安装的包。_tencentos-3.1
文章浏览阅读3.1w次,点赞21次,收藏75次。import urllib.requesturl = 'https://www.python.org'# 方式一response = urllib.request.urlopen(url)print(type(response)) # <class 'http.client.HTTPResponse'># 方式二request = urllib.request.Req..._urllib.request.urlopen(url)
文章浏览阅读1.5k次,点赞12次,收藏15次。如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?
文章浏览阅读1.2k次。RS485总线常识 2010-10-12 15:56:36| 分类: 知识储备 | 标签:rs485 总线 传输 差分 |字号大中小 订阅RS485总线RS485采用平衡发送和差分接收方式实现通信:发送端将串行口的TTL电平信号转换成差分信号A,B两路输出,经过线缆传输之后在接收端将差分信号还原成TTL电平信号。由于传输线通常使用双绞线,又是差分传输,所_rs485 差分走綫間距
文章浏览阅读621次。u-boot、linux烧录_uboot制作
文章浏览阅读1.2w次,点赞10次,收藏44次。windos上git安装,git bash安装_64-bit git for windows setup.
文章浏览阅读196次。环形链表(算法java)的两种解决方法_java 实现环形链表
文章浏览阅读5.7k次。Airflow什么是 Airflow?Airflow 的架构Airflow 解决哪些问题一、docker-compose 安装airflow(postgres)1、创建启动文件airflow-docker-compose.yml.1.1、添加挂载卷,需要修改airflow-docker-compose.yml的位置2、创建本地配置文件airflow.cfg2.1、如果想修改WEB URL地址,需要修改airflow.cfg中以下两个地方3、之后up -d直接启动即可web访问地址:二、存储数据库更换post_airflow docker
文章浏览阅读28次。选题背景:随着社会的发展和教育的普及,高校教务管理系统在现代高等教育中扮演着至关重要的角色。传统的手工管理方式已经无法满足高校日益增长的规模和复杂的管理需求。因此,开发一套高效、智能的教务管理系统成为了当今高校管理的迫切需求。选题意义:高校教务管理系统的开发具有重要的意义和价值。首先,它可以提高高校教务管理的效率和准确性。通过自动化处理学生选课、排课、考试安排等繁琐的事务,大大减轻了教务人员的工作负担,提高了工作效率。同时,系统可以实时更新学生信息和课程信息,减少了数据错误和冗余,保证了管理的准确性
文章浏览阅读132次。首页>基础教程>常用类>常用 Integer类Java Integer转换double,float,int,long,stringjava中Integer类可以很方便的转换成double,float,int,long,string等类型,都有固定的方法进行转换。方法double doubleValue() //以 double 类型返回该 Integer 的值。flo..._java integet接收float类型的参数