Java集合之Collection接口-程序员宅基地

技术标签: java  数据结构与算法  

java的集合分为三大接口,分别是Collection,Map,Iterator,集合接口和类在java.util包中,此次主要介绍三大接口之一的Collection接口。

  一些Collection允许有重复元素,而另一些则不允许,一些Collection是有序的,另一些则是无序的。Collection不提供接口的任何直接实现,它提供更加具体的子接口List和Set。

  1.List接口

  List是有序的集合,此接口的用户队列表的每一个元素的插入位置进行精确的控制,可以根据元素的整数索引访问元素,并搜索列表中的元素。

  List接口实现类主要有:ArrayList,Vector,LinkedList

  1)ArrayList

  1.默认的ArrayList的大小为10

  

  2.ArrayList内部实现是使用动态数组

  3.ArrayList是线程不安全的

  4.如果数组满了,需要动态扩充,扩充长度为原来数组长度的一半左右,扩充时需要新建一个数组,再把原先数据复制过来。

  

  ArrayList使用示例:

  Java代码

  1. public static void main(String[] args){
  2. String okString=null;
  3. List<String>lists=new ArrayList<String>();
  4. lists.add("aa");
  5. lists.add("aa");
  6. lists.add(1,"bb");//指定位置插入
  7. lists.add("cc");
  8. lists.add(okString);
  9. //检查ArrayList是否为空
  10. System.out.println(lists.isEmpty());
  11. //查找指定元素的首次出现位置
  12. System.out.println(lists.indexOf("aa"));
  13. //查看是否含有该元素
  14. System.out.println(lists.contains("cc"));
  15. //输出list的长度
  16. System.out.println(lists.size());
  17. //输出
  18. for(int i=0;i<lists.size();i++)
  19. System.out.println(lists.get(i));
  20. //清除list
  21. lists.clear();
  22. }

  总结:Arra能直接通过下标获取数据,数据读取非常方便;然而ArrayList的插入和删除,会导致内部数据大量移位,会影响性能。如果我们已经知道需要的元素个数,我们可以初始化时指定ArrayList的容量,这样可以有效的避免数组多次扩充,从而提高效率;但也不能初始化太大,浪费内存。

  2)Vector

  Vector类可以实现增长的对象数组,与数组一样,可以使用下标直接进行数据访问。Vector的大小可以根据需要扩充或缩小。

  1.Vector内部使用动态数组实现

  2.默认构造大小为10,增量为0.可在构造方法指定大小和增量Vector(int size,int Increment)

  

  3.扩充方式:如果有指定增量,则是当前容量+增量;如果增量等于0,则是当前容量*2;

  

  4.Vector是线程安全的

  Vector用法和ArrayList基本差不多,示例代码

  Java代码

  1. public static void main(String[] args){
  2. String okString=null;
  3. List<String>vectors=new Vector<String>();
  4. vectors.add("aa");
  5. vectors.add("aa");
  6. vectors.add(1,"bb");//指定位置插入
  7. vectors.add("cc");
  8. vectors.add(okString);
  9. //检查ArrayList是否为空
  10. System.out.println(vectors.isEmpty());
  11. //查找指定元素的首次出现位置
  12. System.out.println(vectors.indexOf("aa"));
  13. //查看是否含有该元素
  14. System.out.println(vectors.contains("cc"));
  15. //输出list的长度
  16. System.out.println(vectors.size());
  17. //删除元素;
  18. vectors.remove(0);
  19. //输出
  20. for(int i=0;i<vectors.size();i++)
  21. System.out.println(vectors.get(i));
  22. //清除list
  23. vectors.clear();
  24. }

  3)LinkedList

  LInkedList是List接口的链表实现。实现所有可选的列表操作,并允许所有元素包括null。其基本用法与ArrayList差不多,如:

  Java代码

  1. public static void main(String[] args){
  2. String okString=null;
  3. List<String>link=new LinkedList<String>();
  4. link.add("aa");
  5. link.add("aa");
  6. link.add(1,"bb");//指定位置插入
  7. link.add("cc");
  8. link.add(okString);
  9. //检查ArrayList是否为空
  10. System.out.println(link.isEmpty());
  11. //查找指定元素的首次出现位置
  12. System.out.println(link.indexOf("aa"));
  13. //查看是否含有该元素
  14. System.out.println(link.contains("cc"));
  15. //输出list的长度
  16. System.out.println(link.size());
  17. //删除元素;
  18. link.remove(0);
  19. //输出
  20. for(int i=0;i<link.size();i++)
  21. System.out.println(link.get(i));
  22. //清除list
  23. link.clear();
  24. }

  ArrayList和Vector是使用动态数组实现的,Vector相比ArrayList可以指定增量,而LinkedList是用链表实现的。他们的区别主要体现在数组和链表的区别

  2.Set接口

  一个不包含重复元素的colletion。即Set不包含满足e1.equals(e2)的元素,Set最多包含一个null元素

  Set的实现类主要有:HashSet,TreeSet,LinkedHashSet

  1)HashSet

  实现了Set接口,它不保证set的迭代顺序,特别是它不保证该顺序永恒不变,此类允许使用null元素。底层是使用HashMap实现的。

  下面我们主要讲解不能包含重复元素。

  如:

  定义Person类:

  Java代码

  1. public class Person {
  2. public String name;
  3. public int age;
  4. public Person(String name,int age){
  5. this.name=name;
  6. this.age=age;
  7. }
  8. @Override
  9. public String toString() {
  10. return "person [name=" + name + ", age=" + age + "]";
  11. }
  12. }

  set添加Person元素

  Java代码

  1. public static void main(String[] args){
  2. Set<Person>sets=new HashSet<Person>();
  3. Person ok=new Person("小明", 18);
  4. Person ok1=new Person("小红", 16);
  5. Person ok2=new Person("小白", 15);
  6. sets.add(ok);
  7. sets.add(ok1);
  8. sets.add(ok2);
  9. //添加不进去
  10. sets.add(ok1);
  11. //能添加进去
  12. sets.add(new Person("小明", 18));//与ok数据一样
  13. System.out.println("size: "+sets.size());
  14. }

  发现同一个对象的ok1只能添加一次,然而与ok相同数据的被多次添加。Set使用e1.equals(e2)来判断的。

  在java集合中,判断两个对象是否是同一个对象是:

  1.先判断两个对象的hashCode值是否相等,如果不相等,就认为两个对象不相等;若相等;判断条件2

  2.判断两个对象的equals运算是否相等,相等则认为两个对象相等。

  所以我们需要重写Person的hashCode和equals方法

  把Person类加上方法:

  Java代码

  1. @Override
  2. public int hashCode() {
  3. final int prime = 31;
  4. int result = 1;
  5. result = prime * result + age;
  6. result = prime * result + ((name == null) ? 0 : name.hashCode());
  7. return result;
  8. }
  9. @Override
  10. public boolean equals(Object obj) {
  11. if (this == obj)
  12. return true;
  13. if (obj == null)
  14. return false;
  15. if (getClass() != obj.getClass())
  16. return false;
  17. Person other = (Person) obj;
  18. if (age != other.age)
  19. return false;
  20. if (name == null) {
  21. if (other.name != null)
  22. return false;
  23. } else if (!name.equals(other.name))
  24. return false;
  25. return true;
  26. }

  此时后面与ok数据相同的对象也不能添加进集合里了。

  2)TreeSet

  TreeSet元素自然排序,底层是使用TreeMap实现的,自定义要显示Comparable接口

  定义Person类

  Java代码

  1. public class Person implements Comparable<Person>{
  2. public String name;
  3. public int age;
  4. public Person(String name,int age)
  5. {
  6. this.name=name;
  7. this.age=age;
  8. }
  9. public int compareTo(Person o) {
  10. if(o==null)
  11. throw new NullPointerException();
  12. if(this.age>o.age)
  13. return 1;
  14. if(this.age<o.age)
  15. return -1;
  16. return 0;
  17. }
  18. @Override
  19. public String toString() {
  20. return "Person [name=" + name + ", age=" + age + "]";
  21. }
  22. }

  TreeSet使用:

  Java代码

  1. public static void main(String[] args){
  2. Set<Person>sets=new TreeSet<Person>();
  3. Person ok=new Person("小明", 18);
  4. Person ok1=new Person("小红", 16);
  5. Person ok2=new Person("小白", 15);
  6. sets.add(ok);
  7. sets.add(ok1);
  8. sets.add(ok2);
  9. //添加不进去
  10. sets.add(ok1);
  11. //输出
  12. Iterator<Person> iterator=sets.iterator();
  13. while(iterator.hasNext())
  14. {
  15. System.out.println(iterator.next());
  16. }
  17. }

  运行结果:

  

技术分享:www.kaige123.com

转载于:https://www.cnblogs.com/kaige123/p/6005386.html

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

智能推荐

ThingJS官方示例(九):通过CityBuilder转出的url开发3D地图脚本_citybuilder地图怎么导出-程序员宅基地

文章浏览阅读1.3k次。#前端开发##3D可视化##物联网#明确虚拟场景的位置Citybuilder导出二次开发基础参数配置与修改CityBuilder(城市级场景搭建工具)使用起来足够简单,非常符合设计人员的使用习惯,那么,辛辛苦苦做好的城市级场景,如何交付给开发,在后续的环节中灵活使用?ThingJS平台早就考虑到了这个问题,统一了平台数据,支持CityBuilder转出url;平台加载地图组件之后,即可轻松二次开发。下面我们就来解析使用步骤,有任何问题请留言。明确虚拟场景的位置三维地球立足于世界坐标系,城_citybuilder地图怎么导出

JAVA——49.jsplitpane_java jsplitpane-程序员宅基地

文章浏览阅读284次。【jsplitpane】分割面板,一次性把两个组件显示在一个分割面板之中。JSplitPane用于划分两个(也只有两个) Components。_java jsplitpane

类 Unix 系统的文件目录结构_unix目录结构-程序员宅基地

文章浏览阅读533次,点赞7次,收藏10次。这些目录及其结构在 Unix-like 系统中是非常常见的,每个目录都有其特定的用途,能够帮助用户和系统管理员更好地组织和管理系统文件和数据。_unix目录结构

JavaScript如何对数字数组进行排序_js 0-100升序排序-程序员宅基地

文章浏览阅读355次。javaScript的Array.sort()方法被用来就地数组元素进行排序,并返回排序后的数组。在这里,我们将使用冒泡排序(简单排序技术)对数组元素进行升序排序。错误的输出:[100、12、23、25、31、75、81]正确的输出:[12、23、25、31、75、81、100]示例:本示例使用compare函数对数组元素进行升序排序。示例:本示例使用compare函数对数组元素进行降序排序。输入:[12,25,31,23,75,81,100]示例:本示例以字符串格式对数组元素进行排序。_js 0-100升序排序

【BAT】windows进程监控批处理,检测进程不在,则直接启动进程_批处理】如何启动进程-程序员宅基地

文章浏览阅读1.5k次。windows进程监控批处理,检测进程不在,则直接启动进程_批处理】如何启动进程

目录域转换为静态文字_word域转换为静态文本-程序员宅基地

文章浏览阅读499次。通过域生成的目录,需要单独只存储目录,想把目录内容转为普通带格式文本。_word域转换为静态文本

随便推点

LTE无线网络覆盖优化与增强实践指南4.2-程序员宅基地

文章浏览阅读938次,点赞23次,收藏24次。通过以上分析,各个场景覆盖情况(室外宏基站对室内或车内深度覆盖)及保证良好语音感知质量的边缘 RSRP 与 SINR 门限如表 8-24 所示。对于市区室内场景,不同场景中 VoLTE 高清语音对边缘覆盖指标 RSRP 门限大致相当,SINR门限稍有差异,其中当 MOS 评分要求较高时,低层建筑深度覆盖对 SINR 值要求相对较高。

ISP流程概述-程序员宅基地

文章浏览阅读1.2k次。一、概述 ISP(Image Signal Processor), 即图像信号处理, 主要作用是对前端图像传感器输出的信号做后期处理, 依赖于 ISP 才能在不同的光学条件下都能较好的还原现场细节。Cmos YUV sensor 的 ISP 处理流程如图所示:景物通过 Lens 生成的光学图像投射到 sensor 表面上, 经过光电转换为模拟电信号, 消噪声后经过 A/D 转换后变..._isp流程

堆取料机防碰撞系统促进港口物料搬运效率进行提档升级_港口取料机防碰撞方法-程序员宅基地

文章浏览阅读693次。第1章 系统简介 概述 随着水路运输业的快速发展,现代港口规模和吞吐量不断增长,港口各种装卸设备数量不断增加,如何高效可靠使用这些装卸设备是各港口单位关心的问题。港口装卸设备中主要的斗轮堆取料机又称悬臂式堆取料机,是散货堆场作业的核心设备。它是堆取料合一的机械,即是一种挖取和堆存煤炭、矿石、砂石等松散物料的高效率机械。它不仅适用于电厂,而且在码头、港口也很适用,大多数的转运煤及松散物料..._港口取料机防碰撞方法

SQLAlchemy 第一篇_sqlalchamy with-程序员宅基地

文章浏览阅读566次,点赞11次,收藏9次。在下面的示例中,上下文管理器提供了数据库连接,并且还构建了事务内部的操作。Python DBAPI 的默认行为包括事务始终在进行中;当连接范围被释放时,会发出 ROLLBACK 来结束事务。当我们想要提交数据时,我们通常需要调用Connection.commit()方法,可以隐式开启一个事务。并且执行正常后,会自动提交。如果有异常发送,则会回滚。此处我们以pymysql为mysql的数据库驱动。_sqlalchamy with

linux装系统出现boot,Linux系统安装时提示boot efi 没有分配空间的解决办法-程序员宅基地

文章浏览阅读3.6k次。怎么解决 boot/efi 没有分配空间的问题呢。某些机器上,特别是有双硬盘的电脑,在装 Linux 双系统时,经常会提示 boot/efi 没有分配空间。有时候,明明已经分配了,还会提示没有分配,如何解决呢。1、启动机器时,按下 F12,进入 BIOS有的品牌的机器,可能是按F2、DEL、ESC等。2、进入BIOS设置界面后,按左右方向键←→,选择【启动】3、再按上下方向键↑↓,选择【Boot ..._安装linux系统提示boot:

有关数仓增量和全量同步的一些思考_数据向数仓同步数据需要注意的-程序员宅基地

文章浏览阅读2.4k次。背景相信很多公司都是基于Hive做的数仓,从而对外提供数据服务。这里只讨论离线数仓,做数仓必然离不开对大量数据的ETL处理工作。目前的ETL种类繁多,可选择的工具也有很多,比如使用Sqoop, DataX做离线的T+1数据同步, Spark或者Flink做T+0的实时数据同步等。目前有很多公司业务是T+1的,每天需要同步昨天的业务库(MySQL、mongodb等)的数据到Hive数据仓库中,..._数据向数仓同步数据需要注意的

推荐文章

热门文章

相关标签