Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。主要有HashSet和TreeSet两大实现类。

Set:

  在判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现。
  HashSet是哈希表结构,主要利用HashMap的key来存储元素,计算插入元素的hashCode来获取元素在集合中的位置;
  TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序;

详细的介绍点击这里

下面展示部分代码:

private E arrElementE[];
private int size; @SuppressWarnings("unchecked")
public ArrImplSet() {
arrElementE = (E[]) new Object[0];
} public ArrImplSet(E [] arr) {
arrElementE = arr;
size = arrElementE.length;
}
/**
* 添加元素
* @param element
*/
public void addElement(E element) {
// 判断元素是否存在
if (!contains(element)) {
// 数组是否满了,需要扩容
if (size == arrElementE.length) {
incrementArray();
}
arrElementE[size ++] = element;
}
}
/**
* 返回 集合长度
* @return
*/
public int size() {
if (arrElementE != null) {
return arrElementE.length;
}else {
return 0;
}
}
/**
* 清空集合
*/
public void clear() {
arrElementE = null;
} public String toString() {
if(arrElementE == null || arrElementE.length == 0) {
return "empty";
}else {
StringBuilder str = new StringBuilder("[");
for (int i = 0; i < arrElementE.length; i++) {
str.append(arrElementE[i]+ ",");
}
str.append("]");
return str.toString();
}
} /**
* 数组扩容
*/
@SuppressWarnings("unchecked")
private void incrementArray() {
E [] tempArrEs = arrElementE;
arrElementE = (E[]) new Object[size + 10 ];
System.arraycopy(tempArrEs, 0, arrElementE, 0, size);
} /**
* 判断元素是否存在,注意。Set 是可以保存null。
* @param el
* @return
*/
public boolean contains(E el) {
if (null == el) {
// 是否已存在null
for (int i = 0; i < size; i++)
if (arrElementE[i] == null)
return true;
}else {
for (int i = 0; i < size; i++)
if (arrElementE[i] == el)
return true;
}
// 都不存在,返回false
return false;
}
/**
* 返回
* @param index
* @return
*/
public E get(int index) {
if(size <= index) {
throw new IndexOutOfBoundsException("下标越界了,index:"+index);
}
return arrElementE[index];
} public static void main(String[] args) {
// ArrImplSet<String> set = new ArrImplSet<String>();
// set.addElement("abcdefg");
// set.addElement("abcdefg");
// set.addElement("abc5efg");
// set.addElement("null");
// System.out.println(set.toString()); ArrImplSet<Integer> set = new ArrImplSet<Integer>();
set.addElement(1);
set.addElement(2);
set.addElement(1);
set.addElement(null);
// System.out.println(set.toString());
for (int i = 0; i < set.size; i++) {
System.out.println(set.get(i));
} }

自己动手系列----使用数组实现一个简单的Set的更多相关文章

  1. 自己动手系列----使用数组实现一个简单的Map

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同.Java 语言中提供的数组是用来存储固定大小的同类型元素. 这里提一下,数组的优缺点: 优点: 1. 使用索 ...

  2. 动手造轮子:实现一个简单的 EventBus

    动手造轮子:实现一个简单的 EventBus Intro EventBus 是一种事件发布订阅模式,通过 EventBus 我们可以很方便的实现解耦,将事件的发起和事件的处理的很好的分隔开来,很好的实 ...

  3. 动手造轮子:实现一个简单的 AOP 框架

    动手造轮子:实现一个简单的 AOP 框架 Intro 最近实现了一个 AOP 框架 -- FluentAspects,API 基本稳定了,写篇文章分享一下这个 AOP 框架的设计. 整体设计 概览 I ...

  4. BAT面试题:使用数组实现一个简单的阻塞队列

    这道题是我亲身经历的一道大厂面试题,非常值得分享! 这道题可以分为两个步骤进行编码解答,第一步是基于数组实现一个队列,第二步是实现线程阻塞. 如果是基于数组实现栈的数据结构,那么我们只需要一个指针进行 ...

  5. Tomcat详解系列(1) - 如何设计一个简单的web容器

    Tomcat - 如何设计一个简单的web容器 在学习Tomcat前,很多人先入为主的对它的认知是巨复杂的:所以第一步,在学习它之前,要打破这种观念,我们通过学习如何设计一个最基本的web容器来看它需 ...

  6. 【 D3.js 入门系列 --- 3 】 做一个简单的图表!

    前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...

  7. JBoss 系列七十:一个简单的 CDI Web 应用

    概述 本文通过一个简单的 CDI Web 应用演示dependency injection, scope, qualifiers 以及EL整合.应用部署完成后我们可以通过http://localhos ...

  8. 【 D3.js 入门系列 — 3 】 做一个简单的图表!

    图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...

  9. python爬虫系列(1)——一个简单的爬虫实例

    本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片. 1. 概述 本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片.下载图片的步骤如下: 获取网页html文本内容:分析html中 ...

随机推荐

  1. 使用 Jest 进行愉快的 JavaScript(TypeScript) 测试

    一般我们不管是做前端还是后端,为了提高代码的质量,会选择一种测试驱动开发(TDD)的办法来写代码进行单元测试.Jest 是 Facebook 团队开发的一款测试框架,为的是提高开发者的"开发 ...

  2. 《C++Primer》第五版习题答案--第六章【学习笔记】

    <C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...

  3. 《自拍教程18》adb_Android设备debug连接工具

    adb命令介绍 做Android App测试,Android手机系统测试, 还有很多Android终端产品(手表,车载,智能电视,智能手表等) 都必须用adb命令,通过USB接口,与Android设备 ...

  4. requests库爬取需要登录的网站

    #!usr/bin/env python #-*- coding:utf-8 _*- """ @author:lenovo @file: 登录人人网.py @time: ...

  5. 使用pem连接服务器

    后台同学甩给你一个pem文件,username@IP后如何链接服务器 准备:ssh客户端 例子xshell 文件->新建->主机(连接界面主机输入框输入IP)->点击用户身份-> ...

  6. VSCode(主进程)

    Overview(总览) SETUP(设定) Overview(总览) Linux(略) macOS(略) Windows 使用WSL,您可以在Windows上安装和运行Linux发行版.这使您能够在 ...

  7. windows 停止和启动Redis

    点击win+R   输入cmd 打开cmd窗口 然后输入命令 net stop redis    停止redis net start redis     启动redis

  8. 2018 IEEE极限编程大赛 题解

    去年742,今年72,也算一种小小的进步. 明年前30(笑 1. Drawing Rooted Binary Trees 给定一个树的中序和前序的遍历,要求输出这棵树(包括空格的) #include ...

  9. JS格式时间

    Date.prototype.format = function(format) { var o = { "M+": this.getMonth() + 1, //month &q ...

  10. jQuery Moblie 问题汇总

    1  使用jQuery动态添加html,没有jQuery Moblie的样式 $("body").html(listview);//以上代码只是把结构加上去了,但是却没有加上jqm ...