[API]集合Collection常用方法集合遍历新循环泛型(三)

news/2024/10/17 12:29:56/

什么是集合:

  • 集合和数组一样,可以保存一组数据,并且提供了操作数组元素的相关方法,使用用更加方便

集合框架中的相关接口:  

  • java.util.Collection接口:是所有集合的顶级接口,封装了所有集合所共有的方法,下面有很多实现类,因此我们可以有更多的数据结构来选择。

  • Collection接口下面有两种常见的子接口:

    1. java.util.List:线性表,是可以重复集合,并且有序

    2. java.util.Set:不可重复集合,大部分实现类是无序的

Collection的常用方法:

  • add():向集合中添加一个元素,成功添加则返回true,否则返回false

  • size():返回当前集合的元素个数

  • isEmpty():判断当前集合是否为空集,当且仅当size()为0时返回true

  • clear():清空集合

  • contains():判断集合是否包含某元素(equals()相等即为true)

  • remove():从集合中删除给定元素(equals()相等即为true),成功删除则返回true

public class CollectionDemo {public static void main(String[] args) {Collection c = new ArrayList();c.add(new Point(1,2));c.add(new Point(3,4));c.add(new Point(5,6));c.add(new Point(7,8));c.add(new Point(9,0));c.add(new Point(1,2));//[元素1.toString(), 元素2.toString(), 元素3.toString(), ......]System.out.println(c); //[(1,2), (3,4), (5,6), (7,8), (9,0), (1,2)]/*boolean contains(Object o):判断当前集合是否包含给定元素o判断依据是给定元素是否与当前集合存在equals()比较为true的情况*/Point p = new Point(1,2);boolean contains = c.contains(p);System.out.println("是否包含:"+contains); //true/*boolean remove(Object o):-----一般都不接收boolean结果从当前集合中删除与给定元素o的equals()比较为true的元素若存在重复元素则只删除一次*/c.remove(p);System.out.println(c);//集合中存放的是元素的引用Collection cc = new ArrayList();Point pp = new Point(1,2);cc.add(pp); //将pp添加到cc中-----------将pp的引用装到了cc中System.out.println("pp:"+pp); //(1,2)System.out.println("cc:"+cc); //[(1,2)]pp.setX(100);System.out.println("pp:"+pp); //(100,2)System.out.println("cc:"+cc); //[(100,2)]/*Collection c = new ArrayList();c.add("one");c.add("two");c.add("three");c.add("four");c.add("five");//集合重写了Object的toString()方法,返回格式如下://[元素1.toString(), 元素2.toString(), 元素3.toString(), ......]System.out.println(c); //[one, two, three, four, five]System.out.println("size:"+c.size()); //5,输出集合的元素个数//isEmpty()判断集合是否为空集(size()为0表示空集)System.out.println("是否为空集"+c.isEmpty()); //falsec.clear(); //清空集合System.out.println("集合已清空");System.out.println(c); //[]System.out.println("size:"+c.size()); //0System.out.println("是否为空集:"+c.isEmpty()); //true*/}
}
  • addAll():将参数集合中的元素添加到当前集合中,添加后当前集合发生改变则返回true

  • containsAll():判断当前集合中是否包含参数集合中的所有元素

  • ratainAll():取交集(交集元素留着)

  • removeAll():删交集(交集元素删除)

public class CollectionOperDemo {public static void main(String[] args) {Collection c1 = new ArrayList();c1.add("java");c1.add("c++");c1.add(".net");System.out.println("c1:"+c1); //c1:[java, c++, .net]Collection c2 = new ArrayList();c2.add("android");c2.add("ios");c2.add("java");System.out.println("c2:"+c2); //c2:[android, ios, java]c1.addAll(c2); //将c2添加到c1中System.out.println("c1:"+c1); //c1:[java, c++, .net, android, ios, java]System.out.println("c2:"+c2); //c2:[android, ios, java]Collection c3 = new ArrayList();c3.add("c++");c3.add("android");c3.add("php");System.out.println("c3:"+c3); //[c++, android, php]boolean contains = c1.containsAll(c3); //判断c1中是否包含c3中的所有元素System.out.println("是否包含:"+contains); //false/*//取交集:c1中仅保留与c3所共有的元素,而c3不变c1.retainAll(c3);System.out.println("c1:"+c1); //c1:[c++, android]System.out.println("c3:"+c3); //c3:[c++, android, php]*///删交集:将c1中与c3共有的元素删除,c3不变c1.removeAll(c3);System.out.println("c1:"+c1); //c1:[java, .net, ios, java]System.out.println("c3:"+c3); //c3:[c++, android, php]}
}
  • iterator():获取一个用于遍历当前集合元素的迭代器

  • toArray():将集合转换为数组

集合的遍历:

  • Collection接口提供了统一的遍历集合的方式:迭代器模式。通过iterator()方法可以获取一个用于遍历当前集合元素的迭代器(Iterator接口)

  • java.util.Iterator接口:定义了迭代器遍历集合的相关操作,不同的集合都实现了用于遍历自身元素的迭代器实现类,但我们无需记住它们的名字,从多态的角度把它们看成Iterator即可。

  • 迭代器遍历遵循的步骤为:问(hasNext())、取(next())、删(remove()),但删除并不是必要操作

public class IteratorDemo {public static void main(String[] args) {Collection c = new ArrayList();c.add("one");c.add("#");c.add("two");c.add("#");c.add("three");c.add("#");c.add("four");c.add("#");c.add("five");System.out.println(c); //[one, #, two, #, three, #, four, #, five]/*迭代器的常用方法:1)boolean hasNext()----------问(必要操作)询问集合是否还有"下一个"元素可供迭代注意:迭代器默认开始位置在集合第1个元素之前无论调用了多少次的hasNext(),迭代器的位置都不会改变2)Object next()--------------取(必要操作)迭代器向后移动一个位置来指向集合的下一个元素并将其获取3)void remove()--------------删(删除并非必要操作)删除next()方法所获取的元素*/Iterator it = c.iterator(); //获取集合c的迭代器while(it.hasNext()){ //若有下一个元素String str = (String)it.next(); //获取下一个元素并强转为String类型System.out.println(str);if("#".equals(str)){//c.remove(str); //迭代器遍历过程中不允许通过集合的方式来增删元素,否则会报异常it.remove(); //删除next()方法所获取的元素}}System.out.println(c);}
}

增强for循环/新循环:

  • jdk1.5时推出了一个特性:增强型for循环,也称为新循环,让我们使用相同的语法遍历集合和数组。它的内部是通过Iterator实现的,所以不能动态的增删元素。

  • 语法:

for(元素类型 变量名 : 集合或数组){循环体
}
public class NewForDemo {public static void main(String[] args) {String[] array = {"one","two","three","four","five"};for(int i=0;i<array.length;i++){System.out.println(array[i]);}for(String str : array){ //str表示的就是数组中的每个元素System.out.println(str);}Collection c = new ArrayList();c.add("one");c.add("two");c.add("three");c.add("four");c.add("five");Iterator it = c.iterator();while(it.hasNext()){String str = (String)it.next();System.out.println(str);}for(Object obj : c){ //obj代表集合中的每个元素String str = (String)obj;System.out.println(str);}}
}

泛型:

  • JDK1.5时推出了一个特性:泛型

  • 泛型也称为参数化类型,允许我们在使用一个类时,传入某个类型来规定其内部的属性、方法参数或返回值类型,使得我们使用时更加方便。

    1. 泛型在集合中被广泛使用,用来指定集合中元素的类型

    2. 若不指定泛型的具体类型,则默认为Object

    3. 若指定了泛型的具体类型,则在获取泛型的值时,编译器会自动补充强转操作

public class GenericDemo {public static void main(String[] args) {Collection<Point> c = new ArrayList<>();c.add(new Point(1,2));c.add(new Point(3,4));c.add(new Point(5,6));c.add(new Point(7,8));Iterator<Point> it = c.iterator();while(it.hasNext()){Point p = it.next();System.out.println(p);}for(Point p : c){System.out.println(p);}/*Collection<String> c = new ArrayList<>(); //泛型集合c.add("one");c.add("two");c.add("three");c.add("four");c.add("five");//c.add(123); //编译错误,123的类型违背了集合c所指向的泛型的实际类型String//迭代器所指定的泛型应当与其遍历的集合的泛型一致Iterator<String> it = c.iterator();while(it.hasNext()){String str = it.next();System.out.println(str);}for(String str : c){System.out.println(str);}*/}
}

集合与数组的互转:

集合转换为数组:

public class CollectionToArray {public static void main(String[] args) {Collection<String> c = new ArrayList<>();c.add("one");c.add("two");c.add("three");c.add("four");c.add("five");System.out.println(c); //[one, two, three, four, five]//若参数数组元素个数==集合元素个数,那就正常转换//若参数数组元素个数<集合元素个数,那也正常转换(按照集合大小给数组)//若参数数组元素个数>集合元素个数,那也正常转换,同时在末尾补默认值String[] array = c.toArray(new String[5]);System.out.println(Arrays.toString(array)); //[one, two, three, four, five]}
}

数组转换为集合:

public class ArrayToList {public static void main(String[] args) {String[] array = {"one", "two", "three", "four", "five"};System.out.println("array:"+ Arrays.toString(array)); //[one, two, three, four, five]//asList()方法会返回内部的ArrayList,内部直接引用给定数组arrayList<String> list = Arrays.asList(array);System.out.println("list:"+list); //[one, two, three, four, five]//对数组操作后,集合也会相应的改变array[1] = "six";System.out.println("array:"+ Arrays.toString(array));System.out.println("list:"+list);//对集合操作后,数组也会做相应的改变list.set(2,"seven"); //将集合的第3个元素修改为sevenSystem.out.println("array:"+ Arrays.toString(array));System.out.println("list:"+list);//给集合添加/删除元素相当于给数组添加/删除元素//而数组是定长的,不会自动扩容/缩容,因此发生不支持操作异常list.add("!!!!"); //运行时会发生不支持操作异常}
}

 


http://www.ppmy.cn/news/47279.html

相关文章

【理解 C++ 中的头文件和源文件的作用 】

include文件中定义 src文件中声明 头文件中应该只放变量和函数的声明&#xff0c;而不能放它们的定义。 在 C 中&#xff0c;头文件和源文件有着不同的作用。它们共同组成了 C 项目的基本结构。让我们逐个了解它们的作用。 头文件&#xff08;.h 或 .hpp 文件&#xff09;&a…

【从零开始学Skynet】实战篇《球球大作战》(十四):agent跨服务器版

至此&#xff0c;我们已完成了《球球大作战》的绝大部分功能&#xff0c;只剩下完 善agent &#xff0c;让它和 scene 服务联动了。 1、多个模块 一般而言&#xff0c;代理服务会承载很多系统&#xff0c;比如邮件、成就等&#xff0c;此处涉及的代码较多&#xff0c;容易混 乱…

初中级测试工程师,软件测试面试题总结大全(功能/接口/自动化测试)你要的都有...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一般软件测试的面…

程序员只能吃青春饭?3条晋升之路帮你摆脱程序员中年魔咒!

作为一个程序员 尤其是在这些中 不管是中国 还是美国的这些大的公司里边呢 往往呢 有大概两条这样的一个境界之路 根据你自己个人的这种能力兴趣 其实你可以进行自己的选择 科技大佬们其实往往呢也都是从 这个比较年轻的时候对吧 归国创业也好 还是自己出自于草根 然后一下子凝…

【Python_Scrapy学习笔记(十三)】基于Scrapy框架的图片管道实现图片抓取

基于Scrapy框架的图片管道实现图片抓取 前言 本文中介绍 如何基于 Scrapy 框架的图片管道实现图片抓取&#xff0c;并以抓取 360 图片为例进行展示。 正文 1、Scrapy框架抓取图片原理 利用 Scrapy 框架提供的图片管道类 ImagesPipeline 抓取页面图片&#xff0c;在使用时需…

今天面了个字阿里拿38K出来的,真是纹身师闭眼,秀了我一脸啊

公司前段缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在15-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试中&#xff0c;不提测…

【已解决】Field ‘id‘ doesn‘t have a default value 错误的解决办法

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

Qt 项目A调用项目B方法(项目架构管理)

前言 项目开发中&#xff0c;如果项目比较大&#xff0c;大多采用多项目的方式&#xff0c;主要是为了方便代码管理&#xff0c;也更开发变得更加方便。操作如下&#xff1a; 注&#xff1a;我用的版本是Qt 5.12.3 一、建立项目目录 要求&#xff1a; 1、项目A为主&#xff…