集合(collection)

 

使用数组存放数据的弊端:长度不可变,而集合可以动态的添加值

 

java集合类不仅可以存储数量不等的多个对象,还可以保存具有映射关系的关联数组

 

 

 

/*
* 1.存储对象可以考虑:①数组 ②集合
* 2.数组存储对象的特点:Student[] stu = new Student[20]; stu[0] = new Student();....
* >弊端:①一旦创建,其长度不可变。②真实的数组存放的对象的个数是不可知。
* 3.集合
* Collection接口
*    |------List接口:存储有序的,可以重复的元素
*      |------ArrayList(主要的实现类)、LinkedList(对于频繁的插入、删除操作)、Vector(古老的实现类、线程安全的)
*    |------Set接口:存储无序的,不可重复的元素
*      |------HashSet、LinkedHashSet、TreeSet
* Map接口:存储“键-值”对的数据
*    |-----HashMap、LinkedHashMap、TreeMap、Hashtable(子类:Properties)
*/

 

 

java集合有Collection和Map集合两种

Collection接口:

  Set集合:元素之间无序,不可重复

  List集合:元素有序、可以重复

Map集合:具有映射关系的键值对

 

Collection的继承体系:

 

 Map集合的继承体系

Collection接口:

Collection接口是List、Set、Queue接口的父接口

在java5之前,java集合会丢失容器中所有对象的数据类型,把所有的对象都当做Object对象,java5之后,增加了泛型,java集合可以记住容器中的对象的数据类型

 

List接口的实现类之一:ArrayList

 

使用Iterator接口遍历集合中的元素,还可以使用增强for进行遍历

 

 

List接口中的元素都有一个整数序号来记录元素的位置,可以根据序号来获取元素

List接口的常用实现类:ArrayList、LinkedList、Vector

 

 ArrayList是List接口的典型实现类,本质上,ArrayList是对象引用的一个变长数组

ArrayList是线程不安全的,而Vector是线程安全的,即使要保证List是安全的,也不用Vector

Arrays.asList()方法返回的List集合是一个固定长度的List集合,不是ArrayList实例,也不是Vector的实例

 

 

 1 public void collection1() {
 2         Collection coll = new ArrayList();
 3         // 1.size():返回集合中元素的个数
 4         System.out.println(coll.size());
 5         // 2.add(Object obj):向集合中添加一个元素
 6         coll.add(123);
 7         coll.add("AA");
 8         coll.add(new Date());
 9         coll.add("BB");
10         System.out.println(coll.size());
11         // 3.addAll(Collection coll):将形参coll中包含的所有元素添加到当前集合中
12         Collection coll1 = Arrays.asList(1, 2, 3);
13         coll.addAll(coll1);
14         System.out.println(coll.size());
15         // 查看集合元素
16         System.out.println(coll);
17         // 4.isEmpty():判断集合是否为空
18         System.out.println(coll.isEmpty());
19         // 5.clear():清空集合元素
20         coll.clear();
21         System.out.println(coll.isEmpty());
22     }
 1 public void collection2() {
 2         Collection coll = new ArrayList();
 3         coll.add(123);
 4         coll.add(new String("AA"));
 5         coll.add(new Date());
 6         coll.add("BB");
 7         // Person p = new Person("MM",23);
 8         coll.add(new Person("MM", 23));
 9         System.out.println(coll);
10         // 6.contains(Object obj):判断集合中是否包含指定的obj元素。如果包含,返回true,反之返回false
11         // 判断的依据:根据元素所在的类的equals()方法进行判断
12         // 明确:如果存入集合中的元素是自定义类的对象。要求:自定义类要重写equals()方法!
13         boolean b1 = coll.contains(123);
14         b1 = coll.contains(new String("AA"));
15         System.out.println(b1);
16         boolean b2 = coll.contains(new Person("MM", 23));
17         System.out.println(b2);
18         // 7.containsAll(Collection coll):判断当前集合中是否包含coll中所有的元素
19         Collection coll1 = new ArrayList();
20         coll1.add(123);
21         coll1.add(new String("AA"));
22 
23         boolean b3 = coll.containsAll(coll1);
24         System.out.println("#" + b3);
25         coll1.add(456);
26         // 8.retainAll(Collection coll):求当前集合与coll的共有的元素,返回给当前集合
27         coll.retainAll(coll1);
28         System.out.println(coll);
29         // 9.remove(Object obj):删除集合中的obj元素。若删除成功,返回true。否则,返回false
30         boolean b4 = coll.remove("BB");
31         System.out.println(b4);
32 
33     }
 1 public void collection3() {
 2         Collection coll = new ArrayList();
 3         coll.add(123);
 4         coll.add(new String("AA"));
 5         coll.add(new Date());
 6         coll.add("BB");
 7         coll.add(new Person("MM", 23));
 8         
 9         Collection coll1 = new ArrayList();
10         coll1.add(123);
11         coll1.add(new String("AA"));
12         // 10.removeAll(Collection coll):从当前集合中删除包含在coll中的元素。
13         coll.removeAll(coll1);
14         System.out.println(coll);
15         //11.equals(Object obj):判断集合中的所有元素是否完全相同
16         Collection coll2 = new ArrayList();
17         coll2.add(123);
18         coll2.add(new String("AA1"));
19         System.out.println(coll1.equals(coll2));
20         //12.hashCode():
21         System.out.println(coll.hashCode());
22         System.out.println();
23         //13.toArray() :将集合转化为数组
24         Object[] obj = coll.toArray();
25         for(int i = 0;i < obj.length;i++){
26             System.out.println(obj[i]);
27         }
28         System.out.println();
29         //14.iterator():返回一个Iterator接口实现类的对象,进而实现集合的遍历!
30         Iterator iterator = coll.iterator();
31         //方式一:不用
32         /*System.out.println(iterator.next());
33         System.out.println(iterator.next());
34         System.out.println(iterator.next());*/
35         //方式二:不用
36 //        for(int i = 0;i < coll.size();i++){
37 //            System.out.println(iterator.next());
38 //        }
39         //方式三:使用
40         while(iterator.hasNext()){
41             System.out.println(iterator.next());
42         }
43     }
 1 @Test
 2     public void test(){
 3         String[] str = new String[]{"AA","BB","DD"};
 4         for(String s : str){
 5             s =  "MM";//此处的s是新定义的局部变量,其值的修改不会对str本身造成影响。
 6             System.out.println(s);
 7         }        
 8         
 9         for(int i = 0;i < str.length;i++){
10             System.out.println(str[i]);
11         }
12     }
13     @Test
14     public void testFor2(){
15         String[] str = new String[]{"AA","BB","DD"};
16         for(int i = 0;i < str.length;i++){
17             str[i] = i + "";
18         }
19         
20         for(int i = 0;i < str.length;i++){
21             System.out.println(str[i]);
22         }
23     }

 

 

 

List接口的实现类之二:LinkedList

对于频繁的插入、删除元素的操作,建议使用LinkedList,效率较高

 

List接口的实现类之三:Vector

Vector大多数操作和ArrayList差不多,但是Vector是线程安全的,当插入、删除频繁的时候,使用LinkedList,Vector总是比ArrayList慢

 

 

 

 

 

Iterator和ListIterator的区别:

两者都有next()和hasNext(),可以实现向后遍历,但是ListIterator有previous()和hasPrevious()方法,即可以实现向前遍历

ListIterator可以定位当前位置,nextIndex()和previous()可以实现

ListIterator有add()方法,可以向list集合中添加数据

都可以实现删除操作,但是ListIterator可以实现对对象的修改,set()可以实现,Iterator仅能遍历,不能修改

 

 Set集合不允许包含两个相同的元素,如果试图把两个相同的元素加入到同一个Set集合中,则添加操作失败

Set集合判断两个对象是否相等不是使用==,而是使用equals()方法

 

HashSet使用hash算法进行存储集合中的元素,因此有很好的存取和查找功能

HastSet的一下特点:

  不能保证元素的顺序排列

  HashSet不是线程安全的

  集合元素可以是null

当向HashSet集合中添加一个元素时候,会调用hashCode()方法得到该对象的hashCode值,根据根据该值决定元素的存放位置

HashSet判断两个元素相等的的标准,两个对象的hashCode()是否相等,并且equals()方法是否相等

 

hashCode()方法::

如果元素的equals()方法返回true,但是他们的hashCode()值不同,hashSet会将他们存放在不同的位置,依然可以添加成功

对于存放在集合中的对象,对象的类一定要重写equals()和hashCode()方法,以实现对象的相等原则

 

Set实现类之二:LinkedHashSet

LinkedHashSset根据元素的hasCode值来决定元素的存储位置,但是它同时使用链表维护次序,这使得元素看起来是有序的

LinkedHashSet的插入性能要低于HashSet,但在迭代访问Set里面的元素是有很好的性能

LinkedHashSet不允许元素的重复

 

Set实现类之三:TreeSset

TreeSet是SortedSet的实现类,TreeSet可以保证元素处于排序状态

 

TreeSet两种排序方式:自然排序和定制排序,默认情况下,TreeSet采用自然排序

 

排序---自然排序

自然排序:TreeSet会调用集合元素的compareTo(Object object)方法来比较元素之间的大小关系,然后将元素按升序排列

如果试图把一个元素添加到TreeSet中,则该对象必须实现Comparable接口

 

实现Comparable接口必须实现compareTo(Object object),两个对象即通过这个方法进行比较

 

Comparable的典型实现

BigDecimal、BigInteger以及所有的数值类型对应的包装类型,按对应的数值大小进行比较

Character:按字符的Unicode值进行比较

Boolean:true对应的包装类实例大于false包装类对应的实例

String:按字符对应的Unicode值进行比较

Date、Time:后面的时间、日期比前面的时间、日期大

 

向TreeSet中添加一个元素,只有第一个不需要使用compareTo()方法,后面的都要调用该方法

因为只有相同类的两个实例才会比较大小,所以向TreeSet中添加的应该是同一个类的对象

对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是两个对象通过compareTo方法的返回值相等

当需要把一个对象放入TreeSet中,重写对象对应的equals方法时候,应保证该方法与compareTo方法有一致的结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/lzb0803/p/8963131.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊培训跳槽的事

■原来跟我沟通有压力这是我最近跟一个微信好友聊天才知道的事情&#xff0c;说跟我沟通还挺有压力的。实话说&#xff0c;我多少对这样的感觉感同身受&#xff0c;记得刚毕业那会&#xff0c;跟我师傅聊天说事情&#xff0c;总担心自己会说错了什么&#xff0c;有问题的时候也…

iOS开发针对对Masonry下的FPS优化讨论

今天博客的内容就系统的讨论一下Masonry对FSP的影响&#xff0c;以及如何更好的使用Masonry。如果你对iOS开发足够熟悉的话&#xff0c;那么对Masonry框架应该不陌生。简单的说&#xff0c;Masonry的诞生让AutoLayout的使用更为优雅&#xff0c;让控件的布局更为方便。使用辩证…

导师带学生卡Bug,这波操作~

本文来自知乎https://www.zhihu.com/question/455891395/answer/1847953969事情的起因是明尼苏达大学计算机科学&工程系的助理教授 Kangjie Lu 和他的 Ph. D. 学生 Qiushi Wu 的论文《通过伪君子提交在开源软件中隐蔽地引入漏洞的可行性》&#xff0c;据称将在 2021 年五月…

我想做个MP3,要怎么入手?

从我更新的频率&#xff0c;大家应该猜出来了&#xff0c;最近有点忙。忙完了设备调试的工作&#xff0c;又来了个画图的活。本来改动不大&#xff0c;但怎料...哎&#xff0c;一言难尽。今天回答一个粉丝的提问&#xff1a;看完这个回复&#xff0c;我依然没明白他到底想做哪部…

[内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析

关于进程上下文&#xff0c;中断上下文&#xff0c;请看这篇文章Linux进程上下文和中断上下文内核空间和用户空间自旋锁的初衷&#xff1a;在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间)&#xff0c;所以…

网络流24题 洛谷 3355 骑士共存

转换成最小割&#xff1b; #include <bits/stdc.h>using namespace std ;const int mx [ 9 ] { 2 , 2 , -2 , -2 , -1 , 1 , -1 , 1 } ; const int my [ 9 ] { -1 , 1 , -1 , 1 , 2 , 2 , -2 , -2 } ; const int N 100000 10 , inf 1e8 7 ;queue < int …

从零开始设计CPU

CPU&#xff0c;中文全称为中央处理单元&#xff0c;简称处理器&#xff0c;是现代电子计算机的核心器件。如果你想了解一台计算机是如何构建并工作的&#xff0c;那么深入了解CPU的设计非常有用。不过&#xff0c;这个美好的愿望是否会遭遇“骨感”的现实呢&#xff1f;毕竟一…

嵌入式OS入门笔记-以RTX为案例:一.简介

嵌入式OS入门笔记-以RTX为案例&#xff1a;一.简介 最近在做OS相关的项目&#xff0c;一方面涉及到大量&#xff08;通用&#xff09;操作系统的概念和理解&#xff0c;另一方面要深入到一个小实时操作系统的源代码中&#xff0c;并在此操作系统上开发应用。虽然说内容上并不难…

Linux进程O(1)调度算法,面试必考哦

进程调度有很多方法&#xff0c;这里只讨论Linux下的进程调度&#xff0c;先说下&#xff0c;这个是高端面试必考题&#xff0c;既然我发文了&#xff0c;大家最好看看&#xff0c;而且目前看到的写得最好的文章&#xff0c;推荐给大家。Linux是一个支持多任务的操作系统&#…

让Visual Studio 也支持JS代码折叠 —— 续 [ Visual Studio | Js | ScriptOutline | SmallOutline ]...

前言 上文让JS代码折叠的功能能用了&#xff0c;本文将对代码继续改进以期更好用、更实用&#xff0c;随后有介绍Visual Studio JS方面的几个插件。 文章 1. VS2003折叠代码的Micro 2. MSDN 3. Document Outline for Client Script in Visual Studio 2005 正文 …

嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX

嵌入式OS入门笔记-以RTX为案例&#xff1a;二.快速移植到RTX本篇笔记将简单介绍RTX&#xff0c;包括基本架构&#xff0c;如何在Keil中配置。需要安装ARM-MDK和一块硬件板&#xff0c;笔记以STM32F4Discovery为例子。1.为什么要用RTOS&#xff1f;尽管把所有程序放在一个大的循…

再解析下内核自旋锁和优先级翻转问题

[内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼&#xff1f;Linux内核自旋锁之前写的自旋锁的文章&#xff0c;现在再加一篇&#xff0c;可能单纯的一两次说明不能把问题说清楚。所以再写一篇文…

ios 逆向编程(环境搭建)

首先如果你想要逆向其他的APP 动态的查看 或者修改人家APP里面的东西 1&#xff0c; 首先要有一台越狱的手机 最好是9.1以下的&#xff0c;因为9.2以上&#xff08;包括9.2&#xff09;就不能完美越狱了 2&#xff0c;手机也要5s以上的&#xff08;因为从5S开始支持arm64架构&…

最大、最小堆的实现

最大最小堆 堆是一种经过排序的完全二叉树&#xff0c;其中任一非终端节点的数据值均不大于&#xff08;或不小于&#xff09;其左子节点和右子节点的值。 最大堆和最小堆是二叉堆的两种形式。 最大堆&#xff1a;根结点的键值是所有堆结点键值中最大者。 最小堆&#xff1a;根…

嵌入式OS入门笔记-以RTX为案例:四.简单的时间管理

嵌入式OS入门笔记-以RTX为案例&#xff1a;四.简单的时间管理 上一节简单记录了进程task。有了进程以后&#xff0c;我们需要关心怎么样分配CPU资源&#xff08;或者运行时间&#xff09;给每个进程。那么就要引入排程&#xff08;scheduling&#xff09;的概念。排程一般都是O…

我等这个含蓄的技术男当上了CEO

大家好&#xff0c;祝大家五一节日快乐&#xff01;今天没有写技术文章&#xff0c;今天想吹一个人&#xff0c;他是我的朋友&#xff0c;他做公众号很久了&#xff0c;技术文章写的也不错&#xff0c;但是阅读和关注量一直没有上来&#xff0c;我之前好几次在公众号上转发了他…

广东总冠军

lets go tiger 看这篇文章之前&#xff0c;先看看我们看球的视频 恭喜广东拿下总冠军&#xff01; 恭喜胡明轩夺得FMVP&#xff01; 我当时预测的是周鹏或者胡明轩拿下FMVP&#xff0c;最后是胡明轩&#xff0c;广东后场三条枪表现都非常亮眼。如果是上一场广东夺冠&#xff0c…

每日一题(1) —— 数组计算

判断下面代码是否可执行&#xff1f;如果可执行&#xff0c;执行结果是多少&#xff1f; #include <stdio.h>int main(void) {int array[10] {0, 2, 3, 4, 5, 6, 7, 8, 9, 10};0[array] 1;printf("%d\n", (-1)[array 5]);return 0; } 分析&#xff1a; C语…

内存文章汇总,并剖析mmap

在看这篇文章之前&#xff0c;可以先看看下面这几篇文章Linux内存&#xff0c;先看这篇文章Linux内存寻址方式Linux虚拟内存TLBLinux物理内存初始化Linux io内存存在的意义~修改cmdline 把内存改成512MB用mtrace定位内存泄漏什么是内存泄漏&#xff1f;Linux内存管理slub分配器…

[综述泛读] A survey on web services composition (IJWGS, 2005)

Time: 2.5 hours Dustdar S, Schreiner W. "A survey on web services composition." International Journal of Web and Grid Services: 1-30. 2005 (30 pages, 单栏) (gs:169) Schahram Dustdar (维也纳技术大学, full prof) Dusdar是Distributed Systems Group的老…