首先我们来聊聊集合是什么玩意?集合的作用是什么呢?
当我一开始接触集合的时候,怀着疑问去学习是发先很难去理解,但是当我继续看下去的时候就自然而然的发现其实集合就是相当于一个容器,特的主要作用是用来存放对象的,并可以对其中对象处理的一种数据结构,而且集合的长度可变。由于类比于数组,他是面向于变量来说的,单纯的用来存放数据。
接下来让我们来看其基本的实现机制。
集合最基本是通过接口来实现的,其主要由Collections,List,Set,Map等主要接口来实现。
其中这些接口之间还有一些不同的“关系”哟!
我们来看一下这张图:
会发现Collection接口作为父接口,LIst,Set,作为子接口继承来的,而Map作为独立的接口来实现的。
还有做主要的一点接口中的抽象方法可以由实现类来实现。
Iterator 便利器
简单的说其主要作用就是相当于宿舍社管大爷查宿舍人数,一个宿舍相当于一个集合,舍友相当于对象,大爷需要确认每个人都在宿舍,这种数人数的方式就成为遍历,因而遍历集合就是浏览集合内所有的对象。
具体使用方法:
Iterator<Object > it=new ArrayList<Object>();
while(it.hasnext)
{
System。out.println(it.next());//输出集合中的对象;
}
Collection集合
包含了Collection接口以及一些实现类一般不用,我们会用到他的子类。下面我们知识介绍几种实现方法,这些方法在,其子类中均可以使用。
(1)add(E obj) 将指定的对象添加到该集合中
(2)addAll(Object object) 将指定集合中所有对象添加到该集合中。
(3)remove(Object object)将制定的对象从该集合中移除。返回值为boolean类型,如果存在指定的对象则返回true,否则返回false.
(4)size 用来获得该集合中存放对象的个数,返回值为int 型,为对象的个数
(5)equals(Object object) 用来查看指定的对象于该对象是否为同一个对象。返回值为boolean类型,如果存在指定的对象则返回true,否则返回false.
二、List集合
List集合包括LIst接口和LIst所有的实现类。包含了Collection的所有方法。List存储机制为列表类型。其集合内的对象可以重复。
多了一个常用的方法就是
get( int index)用来获得指定索引位置的对象。
2、实现类
(1)使用ArraryList类
其实现的机制为数组类型,便于查询对象,但不利于插入。
具体实现
LIst <Object>s1=new Arraylist<Object>();
(2)使用LinkedList类
其实现机制为链表容易插入对象,打开链家而口即可,但是其不方便查询。
LIst <Object>s1=new LinkedList<Object>();
三、Set集合
Set集合包括Set接口和Set所有的实现类,包含了Collection的所有方法。Set集合最大的优点是其相当于一个容器用来“装下对象”齐总不能存放由重复的对象级由自动去重的作用,相比于List集合Set集合使用相对较多。其一共有三个实现类,以及实现方法。
(一)实现方法
(1)add(E obj) 将指定的对象添加到该集合中
(2)addAll(Object object) 将指定集合中所有对象添加到该集合中。
(3)remove(Object object)将制定的对象从该集合中移除。返回值为boolean类型,如果存在指定的对象则返回true,否则返回false.
(4) size() 用来获得该集合中存放对象的个数,返回值为int 型,为对象的个数
(5)equals(Object object) 用来查看指定的对象于该对象是否为同一个对象。返回值为boolean类型,如果存在指定的对象则返回true,否则返回false.
(二)实现类
(1)HashSet
该类主要是去除集合中的重复的的对象的。然后最主要的是需要重新实现equals()方法。
由HashSet实现的Set类主要是按照哈希码排序,根据对象的哈希码确定对象的存储位置,所以,添加由HashSet实现的Set集合中的对象,需要重新实现HashCode()方法。从而保证插入到集合中的对象能够合理的分布在集合中。HashSet类所实现的Set类是无序的,即将对象保存到集合中是不按照一定的顺序二是无序的。
总之当我们自定义类时,必须实现equals(),HashCode()方法。
典例:
描述
给定含有n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。
输入
输入包含两行:
第一行包含一个正整数n(1 <= n <= 20000),表示第二行序列中数字的个数;
第二行包含n个整数,整数之间以一个空格分开。每个整数大于等于10、小于等于100。
输出
输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。
样例输入
5
10 12 93 12 75
样例输出
10 12 93 75
我们发现这些,这些每一个数字就是相当于一个对象。然而出现了一个问题,当我们用HashSet类是现时,会发现我们输出的顺序不对,然而题目要求我们时要求,按照顺序输出的,因而我们引出了LinkedHashSet类,其与HashSet最主要的区别就是能够按照输入顺序依次的输出。其余的和HashSet一样。解题如下:
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
Set <Integer> s1=new LinkedHashSet<Integer>();
for(int i=0;i<n;i++)
{ int x=sc.nextInt();
s1.add(x);
}
Iterator<Integer> it=s1.iterator();
while(it.hasNext())
{
System.out.print(it.next()+" ");
}
}
}
(3)TreeSet
TreeSet类主要是对集合中的对象进行排序。其排序默认的为升序,当我们对自定义的对象进行比较时要重新定义比较器,或者
实现比较接口Comparable。
TreeSet常用的方法:
comparator()该方法就是比较器。返回值为Comparator类型,如果未采用任何比较器则返回null.
first()返回在集合中排序位于地以的位置。
last()返回在集合排序中最后的对象。
接下来是我找的比较方法,望大家借鉴一下,或者大家可以看我的另一篇博客哟。
https://blog.csdn.net/zqr772791008/article/details/51075536?locationNum=7&fps=1
总值当我们在自定义类中实现Comparable接口时,可以这样想实现了TreeSet类,器自定义类便就有了排序的性质哟。