当前位置: 首页 > 编程日记 > 正文

Java学习总结:53(单对象保存父接口:Collection)

单对象保存父接口:Collection

java.util.Collection是进行单对象保存的最大父接口,即每次利用Collection接口都只能保存一个对象信息。单对象保存父接口定义如下:

public interface Collection<E> extends Iterable<E>

由该定义我们可以发现Collection接口中使用了泛型,保证了集合中操作数据的统一,同时Collection接口属于Iterable的子接口。

Collection接口的核心方法

No.方法名称类型描述
1public boolean add(E e)普通向集合里面保存数据
2public boolean addAll(Collection<? extends E> c)普通追加一个集合
3public void clear()普通向集合里面保存数据
4public boolean contains(Object o)普通判断是否包含指定的内容,需要equals()支持
5public boolean isEmpty()普通判断是否是空集合(不是null)
6public boolean remove(Object o)普通删除对象,需要equals()支持
7public int size()普通取得集合中保存元素个数
8public Object[] toArray()普通将集合变为对象数组保存
9public Iterator< E > iterator()普通为Iterator接口实例化(Iterable接口定义)

虽然Collection是单对象集合操作的最大父接口,但是Collection接口本身却存在一个问题,即:无法区分保存的数据是否重复。所以在实际的开发中,往往会使用Collection的两个子接口:List子接口(数据允许重复)、Set子接口(数据不允许重复)。

List子接口

List子接口最大的功能是里面保存的数据可以存在重复内容,在Collection子接口中,List子接口是最为常用的一个子接口。

List子接口扩充的方法

No.方法名称类型描述
1public E get(int index)普通取得索引编号的内容
2public E set(int index,E element)普通修改指定索引编号的内容
3public ListIterator< E > listIterator()普通为ListIterator接口实例化

在使用List接口时可以ArrayList或Vector两个子接口来进行接口对象的实例化操作。

新的子类:ArrayList

例:List基本操作

package Project.Study.ArrayListClass;import java.util.ArrayList;
import java.util.List;public class Test1 {public static void main(String[]args){//使用了泛型,从而保证集合中所有的数据类型都一致List<String>all = new ArrayList<>();        //实例化List集合System.out.println("长度:" + all.size() + ",是否为空:"+all.isEmpty());all.add("Hello");                           //保存数据all.add("Hello");                           //保存重复数据all.add("World");System.out.println("长度:"+all.size()+",是否为空:"+all.isEmpty());//Collection接口定义size()方法取得了集合长度,List子接口扩充get()方法根据索引取得了数据for (String str : all) {                    //取得索引数据System.out.println(str);                //直接输出内容}}
}
//结果:
//长度:0,是否为空:true
//长度:3,是否为空:false
//Hello
//Hello
//World

上程序通过ArrayList子类实例化List对象,这样就可以使用List接口中定义的方法(包括Collection接口定义的方法)。

例:在集合里面保存对象

package Project.Study.ArrayListClass;import java.util.ArrayList;
import java.util.List;class Book{private String title;private double price;public Book(String title,double price){this.title=title;this.price=price;}@Overridepublic boolean equals(Object obj){//必须覆写此方法,否则remove()、contains()无法使用if (this==obj){return true;}if (obj==null){return false;}if (!(obj instanceof Book)){return false;}Book book = (Book)obj;if (this.title.equals(book.title)&&this.price==book.price){return true;}return false;}@Overridepublic String toString(){return "书名:"+this.title+",价格:"+this.price+"\n";}
}
public class Test2 {public static void main(String[]args){List<Book>all = new ArrayList<>();              //List接口对象all.add(new Book("Java",99));       //保存自定义类对象all.add(new Book("C++",99.9));all.add(new Book("Python",89));all.remove(new Book("Java",99));    //删除对象System.out.println(all);}
}
//结果:
//[书名:C++,价格:99.9
//, 书名:Python,价格:89.0
//]

Set子接口

Set子接口并不像List子接口一样对Collection接口进行了大量的扩充,而是简单地继承了Collection接口。在Set子接口下有两个常用的子类:HashSet、TreeSet。

  • HashSet是散列存放数据;
  • TreeSet是有序存放的子类。

关于“Hash”的说明:
在HashSet这个子类上采用了Hash算法(一般称为散列、无序)。采用该Hash算法保存的集合都是无序的,但是其查找速度较快。

HashSet子类

例:观察HashSet子类的特点

package Project.Study.SetClass;import java.util.HashSet;
import java.util.Set;public class Test1 {public static void main(String[]args){Set<String>all = new HashSet<>();   //实例化Set接口all.add("Hello");                   //保存数据all.add("World");all.add("!!!");all.add("!!!");                     //重复数据System.out.println(all);            //直接输出集合}
}
//结果:
//[!!!, Hello, World]

由上程序我们可以发现,在Set集合里面是不允许保存重复数据的。
像上面的保存的是重复数据的话在IDEA里面是会有提示的,提示这是一个重复数组元素,如下图:
在这里插入图片描述

关于重复元素的说明

TreeSet利用Comparable接口实现重复元素的判断,但是这样的操作只适合支持排序类集操作环境。而其他子类如果要消除重复元素,则必须依靠Object类中提供的两个方法。

  • 取得哈希码:public int hashCode();
    先判断对象的哈希码是否相同,依靠哈希码取得一个对象的内容。
  • 对象比较:public boolean equals(Object obj);
    再将对象的属性进行依次的比较。
    例:利用HashSet子类保存自定义类对象
package Project.Study.SetClass;import java.util.HashSet;
import java.util.Set;class Student{private String name;private double score;public Student(String name,double score){this.name = name;this.score = score;}@Overridepublic int hashCode(){final int prime = 31;int result = 1;long temp;temp = Double.doubleToLongBits(score);result = prime*result+(int)(temp^(temp>>>32));result = prime*result+((name==null)?0:name.hashCode());return result;}@Overridepublic boolean equals(Object obj){if (this==obj){return true;}if (obj==null){return false;}if (getClass()!=obj.getClass()){return false;}Student other = (Student)obj;if (Double.doubleToLongBits(score)!=Double.doubleToLongBits(other.score)){return false;}if (name==null){if (other.name!=null){return false;}}else if (!name.equals(other.name)){return false;}return true;}@Overridepublic String toString(){return "学生姓名:"+this.name+",成绩:"+this.score+"\n";}
}
public class Test4 {public static void main(String[]args){Set<Student>all = new HashSet<>();                  //实例化Set接口all.add(new Student("小明",88));      //保存数据all.add(new Student("小黄",87.2));all.add(new Student("小黄",87.5));    //部分重复all.add(new Student("小黄",87.2));    //全部重复all.add(new Student("小欢",88));System.out.println(all);}
}
//结果:
//[学生姓名:小欢,成绩:88.0
//, 学生姓名:小明,成绩:88.0
//, 学生姓名:小黄,成绩:87.2
//, 学生姓名:小黄,成绩:87.5
//]

TreeSet子类

如果希望保存的数据有序,那么可以使用Set接口的另一个子类:TreeSet子类。
例:使用TreeSet子类

package Project.Study.SetClass;import java.util.Set;
import java.util.TreeSet;public class Test2 {public static void main(String[]args){Set<String>all = new TreeSet<>();   //实例化Set接口Set<Integer>num = new TreeSet<>();all.add("b");                       //保存数据all.add("a");all.add("c");num.add(122);num.add(12);num.add(232);System.out.println(all);            //直接输出集合System.out.println(num);}
}
//结果:
//[a, b, c]
//[12, 122, 232]

由上程序我们可以看到,当使用TreeSet子类实例化了Set接口之后,所保存的数据将会变为有序数据,默认情况下按照升序排列。

关于数据排序的说明

TreeSet子类排序的实现依靠的是比较器接口(Comparable),即如果要利用TreeSet子类保存任意类的对象,那么该对象所在的类必须要实现java.lang.Comparable接口。

例:利用TreeSet保存自定义类对象

package Project.Study.SetClass;import java.util.Set;
import java.util.TreeSet;class Book implements Comparable<Book>{     //需要实现Comparable接口private String title;private double price;public Book(String title,double price){this.title=title;this.price=price;}@Overridepublic String toString(){return "书名:"+this.title+",价格:"+this.price+"\n";}@Overridepublic int compareTo(Book o){           //排序方法,比较所有属性if (this.price>o.price){return 1;}else if (this.price<o.price){return -1;}else{return this.title.compareTo(o.title);//调用String类的比较大小}}
}
public class Test3 {public static void main(String[]args){Set<Book>all = new TreeSet<>();                 //实例化Set接口all.add(new Book("Java",99));       //保存数据all.add(new Book("C++",99));        //部分数据重复all.add(new Book("Python",89.2));System.out.println(all);}
}
//结果:
//[书名:Python,价格:89.2
//, 书名:C++,价格:99.0
//, 书名:Java,价格:99.0
//]

相关文章:

ORA-00942:表或视图不存在(低级错误)

在好多时候。调试PL/SQL对象时会报。ORA-00942 看看错误原因吧&#xff1a; 报错原因&#xff1a;1.该schema没有对表或者视图没有select权限 2.就是该对象不存在 解决的方法&#xff1a; 1.授权给对应对象 2.create table or view 转载于:https://www.cnblogs.com/blfshiye/p/…

2022-2028年中国蛋白石行业发展现状分析及投资前景趋势报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国蛋白石行业市场行业相关概述、中国蛋白石行业市场行业运行环境、分析了中国蛋白石行业市场…

实验: VMware使用快照间接备份原始VMDK文件

资料上看的使用快照备份运行着的虚拟机 当虚拟机开着时&#xff0c;快照提供了一个备份原始 VMDK 文件的好办法。所有的写入操作在原始文件上暂停了&#xff0c;因此&#xff0c;复制它在另一个存储卷很安全。这就是像 VMware Consolidated Backup 和 Vizioncore 的 vRanger…

tomcat生成catalina.out文件

生成catalina.out方法 导语&#xff1a;本文为Windows下生tomcat将控制台信息输出到catalina.out文件 且 保证能实时查看日志文件的方法。 一、创建catalina.out 1、修改tomcat bin目录下的startup.bat文件 修改位置&#xff1a;在startup.bat文件倒数第二行 修改call "%…

Unity优化手机游戏学习教程

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:3.69 GB |时长:6h 44m 创建移动游戏的优化技巧和技术 你会学到什么 如何优化手机游戏的图形和…

Java学习总结:54(集合输出)

集合输出 在Java中&#xff0c;集合的输出操作有四种形式&#xff1a;Iterator输出、ListIterator输出、foreach(加强型for循环)输出、Enumeration输出。 迭代输出&#xff1a;Iterator Iterator(迭代器)是集合输出操作中最常用的接口&#xff0c;而在Collection接口中也提供…

12.27评论5位同学试验三

23号李名贵&#xff0c;http://www.cnblogs.com/xieqiuyou/p/5017244.html#3323660 写的不错&#xff0c;每行语句都有注释&#xff0c;但截图不完整 24号施振成&#xff0c;http://www.cnblogs.com/nonecanstop/p/5079334.html 写的较完整&#xff0c;轮转法和优先算法都有用到…

2022-2028年中国袋式除尘用滤料行业市场全景评估及发展策略分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国袋式除尘用滤料行业市场行业相关概述、中国袋式除尘用滤料行业市场行业运行环境、分析了中…

TL-WDN3321 Ubuntu 下安装

为什么80%的码农都做不了架构师&#xff1f;>>> The WiFi USB dongles based on the newest RT5572 chip set do not work out of the box on Ubuntu. Unex DNUR-V72, D-Link DWA-160 Rev B and TP-Link TL-WDN3200 dongles are based on this chipset. You will …

解决真机编译出现System.DllNotFoundException: 'libmono-native.so'错误都方法

1、去掉勾选&#xff1a;使用共享运行时 2 检查android SDK是否安装了NDK 3、使用真机运行编译APK 转载于:https://www.cnblogs.com/CelonY/p/11355417.html

Revit: Twinmotion工作流程学习

Revit: Twinmotion Workflow MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 技能等级:中级|语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:1h 22m |大小解压后:2.93 GB 含课程文件 Twinmotion是…

Java学习总结:55(偶对象保存:Map接口)

偶对象保存&#xff1a;Map接口 我们前面讲到的Collection属于单值保存父接口&#xff0c;每次只能保存一个对象&#xff1b;而我们这节讲的Map属于偶对象保存接口&#xff0c;利用Map可以保存一对关联数据(按照"key value"的形式)。 Map接口的常用方法 No方法名…

WPF的图片操作效果(一):RenderTransform

一.RenderTransform类的成员&#xff1a; 1.TranslateTransform 平移效果 2.RotateTransform 旋转效果 3.ScaleTransform 缩放效果 4.SkewTransform 扭转效果 5.TransformGroup 组合效果 6.MatrixTransform 是其他几个变形类的基类…

2022-2028年中国大气污染防治产业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国大气污染防治行业市场行业相关概述、中国大气污染防治行业市场行业运行环境、分析了中国大…

最近做手机端,GPS,微信QQ分享总结的问题

Android端 百度地图&#xff1a; 1.libs包中armeabi下liblocSDK4d.so文件丢失&#xff0c;导致百度定位失效。 微信分享&#xff1a; 1.分享App,app的内容&#xff08;图片加描述&#xff09;不能超过32kb &#xff0c;不然无法分享。&#xff08;直接跳至Oncancel事件中&#…

cap理论与分布式事务的解决方案

现在很火的微服务架构所设计的系统是分布式系统。分布式系统有一个著名的CAP理论&#xff0c;即一个分布式系统要同时满足一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availablility&#xff09;和分区容错&#xff08;Partition Tolerance&#xff09;三个…

Blender中的多平面动画学习教程

技能分享–Blender中的多平面动画 Skillshare – Multiplane Animation in Blender 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 大小解压后&#xff1a;1.34G 含课程素材 信息: 我们将在这堂课中致力于创建一个2D多平面相机效果&#xf…

BestCoder Round #68 (div.2) 1002 tree

题意&#xff1a;给你一个图&#xff0c;每条边权值0或1&#xff0c;问每个点周围最近的点有多少个&#xff1f; 思路&#xff1a;并查集找权值为0的点构成的连通块。 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #include<math.h>…

Java学习总结:56(Stack子类)

Stack子类 Stack表示栈操作&#xff0c;栈也是一种动态对象数组&#xff0c;采用的是一种先进后出的数据结构形式&#xff0c;即在栈中最早保存的数据最后才会取出&#xff0c;而最后保存的数据可以最先取出。Stack类的定义如下&#xff1a; public class Stack<E>exte…

2022-2028年中国大理石料行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国大理石料行业市场行业相关概述、中国大理石料行业市场行业运行环境、分析了中国大理石料行…

ActionScript 3操作XML 详解

AS3引入了E4X &#xff0c;它是根据ECMAScript标准处理XML 数据的全新机制。这使得程序员在程序中无缝地操作XML。在AS3中可以使用XML字面值将XML数据直接写入代码&#xff0c;该字面值将被自动解析。 一、AS3中的XML入门 1.可以将XML直接写入代码 public var employeelist:XML…

kubernetes关键特性和概述

kubernetes关键特性和概述 https://blog.csdn.net/u014042372/article/details/80573213 posted on 2019-08-16 11:23 竹径风声 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/girl1314/p/11362768.html

Blender创作你自己的动画短片学习教程

Filmmaking with Blender – Create your own animated Short Film 时长:1h 20m |视频:. MP4 1280720&#xff0c;30 fps(r) |音频:AAC&#xff0c;44100 Hz&#xff0c;2ch |大小:1G 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 在本课…

Java学习总结:57(Properties子类)

Properties子类 Properties类本身是Hashtable的子类&#xff0c;但是由于Properties类都使用String数据类型进行操作&#xff0c;所以在使用Properties类时主要使用本类所定义的方法。Properties类常用方法如下&#xff1a; No.方法类型描述1public Object setProperty(Strin…

openwrt入门

一、安装Ubuntu(在vware安装) 注意使用图形系统 二、安装openwrt开发工具 1.打开命令窗CtrlAltT&#xff0c;切换到root用户&#xff1a;sudo -sH或sudo su&#xff0c;退出root用户&#xff1a;CtrlD或exit 2.切换到root&#xff0c;下载安装组件&#xff08;apt-get install …

2022-2028年中国大飞机项目产业链分析及投资咨询报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国大飞机项目行业市场行业相关概述、中国大飞机项目行业市场行业运行环境、分析了中国大飞机…

一种可以避免数据迁移的分库分表scale-out扩容方式

原文地址&#xff1a;http://jm-blog.aliapp.com/?p590目前绝大多数应用采取的两种分库分表规则mod方式dayofweek系列日期方式&#xff08;所有星期1的数据在一个库/表,或所有?月份的数据在一个库表&#xff09;这两种方式有个本质的特点&#xff0c;就是离散性加周期性。例如…

openstack对比其他有什么优点

openstack对比其他有什么优点 &#xff08;1&#xff09;模块松耦合。与其他开源软件相比&#xff0c;OpenStack模块分明。添加独立功能的组件非常简单。有时候&#xff0c;不需要通读整个OpenStack的代码&#xff0c;只需要了解其接口规范及API使用&#xff0c;就可以轻松地添…

C#和Unity编码和游戏开发学习教程

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:110节课(26小时25分钟)|大小解压后:18.6 GB 含课程文件 学习C#和Unity编码和游戏开发 The Ultimat…

Linux命令行与命令

Linux命令行与命令 作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 欢迎转载&#xff0c;也请保留这段声明。谢谢&#xff01; Linux的命令是很重要的工具&#xff0c;也往往是初学者最大的瓶颈。有朋友用了很长时间的Linux图形界面&#xff0c;基本不使…