Java基础之集合框架系列(三)

Java集合框架是什么?说出一些集合框架的优点? 干货太重,且文字比较多。需要花费时间与耐心细细咀嚼,但是真的能收获到很多。 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。 1... 阅读详情

前言:本文介绍Set系列集合两种常用结构,HashSet以及TreeSet集合

提前说明:Set系列集合具有的共性方法与Collection完全一致,本文不再额外列举
可以参考:菜鸟猿大战Java之集合框架系列(一)

1.HashSet

1.概述

HashSet的底层数据结构是哈希表,哈希表按照元素的哈希值大小顺序进行存储,而非元素的实际存入顺序。HashSet是非线程同步的

哈希表特点: 存储时先比较两元素哈希值是否相同,若相同,再比较两元素是否为同一对象[利用元素自身的equals方法]

2.常用方法

构造方法:

HashSet()
构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。

HashSet(Collection<? extends E>c)
构造一个包含指定 collection 中的元素的新 set。

HashSet(int initialCapacity)
构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75 )。

HashSet(int initialCapacity, float loadFactor)
构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。

特性方法:

Object clone()
返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。
说明:浅表复制就是仅复制类中的值类型成员,深表复制就是复制类中的值类型成员和引用类型成员。

3.利用HashSet存储自定义对象

场景描述:自定义Teacher类,将其多个实例化对象加入HashSet集合对象中,且要求不能存入多个相同元素。之后演示元素的取出操作。

步骤:

1.复写自定义对象的hashCode)()方法(本例中可以返回姓名字符串的hashCode加上年龄组成的int数据),保证每个对象哈希值的唯一性 (也可以在相加之前进行age*39之类的操作,尽量保证最终返回哈希值的唯一性,提高效率)

2.复写自定义对象的equals()方法(本例可认为年龄和姓名一致的两个对象为一个对象),以保证HashSet中的元素唯一性

示例代码:

import java.util.HashSet;
import java.util.Iterator;

//自定义作为存储对象的Teacher类
class Teacher{
    private String name;
    private int age;    

    //构造方法
    public Teacher(String name,int age){
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }


    //重写equals方法
    public boolean equals(Object o){
        if(!(o instanceof Teacher))
            return false;
        //将传入对象强转为Teacher对象
        Teacher t=(Teacher)o;
        if(t.getAge()==this.age&&t.getName().equals(this.name))
            return true;
        else
            return false;
    }

    //重写hashCode方法
    public int hashCode(){
        return name.hashCode()+age*39;
    }

}

//测试用类
public class HashSetDemo {

    public static void main(String[] args) {
        //新建HashSet集合装载Teacher对象
        HashSet<Teacher> hs=new HashSet<Teacher>();
        hs.add(new Teacher("bill",20));
        hs.add(new Teacher("bill",20));
        hs.add(new Teacher("tom",30));
        hs.add(new Teacher("gary",25));
        hs.add(new Teacher("gary",25));
        hs.add(new Teacher("sythen",20));

        //利用迭代器对HashSet中的元素进行取出
        Iterator<Teacher> it=hs.iterator();
        while(it.hasNext()){
            Teacher t=(Teacher)it.next();
            System.out.println("姓名:"+t.getName()+"----"+"年龄:"+t.getAge());
        }

    }

}

程序运行结果:

姓名:gary—-年龄:25
姓名:sythen—-年龄:20
姓名:tom—-年龄:30
姓名:bill—-年龄:20

说明:从元素的取出结果可以看出HashSet集合的元素取出顺序与其存入顺序并不相同。

总结:
1.HashSet保证元素唯一性的方法:通过元素的两个方法,hashCode和equals()来完成。若元素的hashCode值相同,才会调用equals()判断是否为true;若元素的hashCode值不同,则不会调用equals()方法

2.实际开发中要放置于集合中的自定义对象一般都要复写hashCode()和equals()方法!!

3.HashSet判断元素是否存在和删除元素等操作,依赖的方法也是是元素的hashCode()和equals()方法

2.TreeSet

1.概述

特点:
1.可以对set集合中的元素进行排序,但并不一定是加入顺序,默认为根据元素的自然顺序排序
2.TreeSet底层数据结构:二叉树
3.保证元素唯一性的依据:compareTo()方法返回值为0

2.常用方法

构造方法

TreeSet()
构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。

TreeSet(Collection<? extends E> c)
构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。

TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。

TreeSet(SortedSet<E> s)
构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。

特性方法:

E ceiling(E e)
返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null。
E floor(E e)
返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null。

E higher(E e)
返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null。
E lower(E e)
返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null。

E first()
返回此 set 中当前第一个(最低)元素。
E last()
返回此 set 中当前最后一个(最高)元素。

E pollFirst()
获取并移除第一个(最低)元素;如果此 set 为空,则返回 null。
E pollLast()
获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null。

Object clone()
返回 TreeSet 实例的浅表副本。

Comparator<? super E> comparator()
返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null。

Iterator<E> descendingIterator()
返回在此 set 元素上按降序进行迭代的迭代器。

NavigableSet<E> descendingSet()
返回此 set 中所包含元素的逆序视图。

SortedSet<E> headSet(E toElement)
返回此 set 的部分视图,其元素严格小于 toElement。
NavigableSet<E> headSet(E toElement, boolean inclusive)
返回此 set 的部分视图,其元素小于(或等于,如果 inclusive 为 true)toElement。

SortedSet<E> tailSet(E fromElement)
返回此 set 的部分视图,其元素大于等于 fromElement。
NavigableSet<E> tailSet(E fromElement, boolean inclusive)
返回此 set 的部分视图,其元素大于(或等于,如果 inclusive 为 true)fromElement。

NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
返回此 set 的部分视图,其元素范围从 fromElement 到 toElement。
SortedSet<E> subSet(E fromElement, E toElement)
返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。

3.TreeSet存储自定义对象

场景描述:
自定义Teacher类,将其多个实例化对象加入TreeSet集合对象中,且要求不能存入多个相同元素。存入过程需要根据Teacher对象的年龄进行排序,之后演示元素的取出操作。

Comparable:此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为自然排序,类的 compareTo 方法被称为它的自然比较方法。

自然比较方法:

int compareTo(T o)
比较此对象与指定对象的顺序。
返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。

说明:

1.要存入TreeSet中的自定义对象必须实现Comparable接口,以便具有可排序性;并且为了获取有意义的排序方式应该在类中实现compareTo()方法

2.当compareTo方法返回0时,在该集合中认为进行比较的两个对象为同一对象,两者仅有第一个会存入TreeSet中

3.针对条目二中的情况,应该在主要条件之外添加次要判断条件(如本例中的姓名排序[使用字符串的compareTo(String s)方法])

4.以上是TreeSet实现可排序的第一种方式,即让元素本身直接具备可比较性

示例代码:


import java.util.Iterator;
import java.util.TreeSet;

class Teacher implements Comparable<Teacher>{
    private String name;
    private int age;

    //构造方法
    public Teacher(String name,int age){
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    //重写compareTo方法
    public int compareTo(Teacher t) {        
        if(this.age>t.getAge())
            return 1;
        else if(this.age<t.getAge())
            return -1;
        else{
            //当两个对象年龄相同时将姓名作为次级排序依据
            return this.name.compareTo(t.getName());
        }
    }

}

//测试用类
public class TreeSetDemo {

    public static void main(String[] args) {
        //新建TreeSet对象装载Teacher对象
        TreeSet<Teacher> ts=new TreeSet<Teacher>();
        ts.add(new Teacher("bill",20));
        ts.add(new Teacher("bill",20));
        ts.add(new Teacher("tom",30));
        ts.add(new Teacher("gary",25));
        ts.add(new Teacher("gary",25));
        ts.add(new Teacher("sythen",20));

        //利用迭代器进行取出
        Iterator<Teacher> it=ts.iterator();
        while(it.hasNext()){
            Teacher t=(Teacher)it.next();
            System.out.println("姓名:"+t.getName()+"----"+"年龄:"+t.getAge());
        }
    }

}

程序运行结果:

姓名:bill—-年龄:20
姓名:sythen—-年龄:20
姓名:gary—-年龄:25
姓名:tom—-年龄:30

4.二叉树

目的:减少比较次数,提高执行效率

说明:

1.利用二叉树的特点,只要将compareTo()方法实现为每次返回1,则取出时的顺序为就为元素存入的顺序

2.同理,只要将compareTo方法实现为每次返回-1,则取出时的顺序就为为元素存入顺序的反序

5.实现Comparator方式排序

使用场景:当元素本身不具备比较性时,或者其具备的比较性不是业务所需要的,这时就需要让集合本身具备比较性。定义一个比较器类实现Comparator接口,并复写compare()方法。将比较器对象作为参数传递给TreeSet的构造函数。

在集合初始化时,就让其拥有比较方式:
使用到的TreeSet构造方法:

TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序

说明:

1.在自定义比较器类中实现Comparator接口,在该类中重写compare(Object o1,Object o2)方法
2.实例化该自定义对象,作为参数新建TreeSet集合对象
3.也可以使用匿名内部类的方式对TreeSet的构造函数传递参数
4.这也是实现TreeSet排序的第二种方式,即利用比较器实现集合内元素的排序

总结:
1.其实这就是把原来在自定义类中对compareTo()方法的重写转移到集合的实例化过程中。即将相关的判断过程写在实现了Comparator接口的自定义类的compare方法中
2.若两种排序都存在,则程序会以比较器的排序方式为主
3.基本类型(如int)的包装类(Interger)也实现了comparable方法

需求描述:通过比较器类实现Teacher对象按照姓名排序,次级排序依据为Teacher对象的年龄大小。

示例代码:

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

//...省略Teacher类

//自定义比较器类
class OwnComparator implements Comparator<Teacher>{

    //重写compare方法
    public int compare(Teacher o1, Teacher o2) {
        if(o1.getName().equals(o2.getName()))
            return new Integer(o1.getAge()).compareTo(new Integer(o2.getAge()));
        return o1.getName().compareTo(o2.getName());
    }

}

//自定义测试类
public class OwnComparatorDemo {

    public static void main(String[] args) {        
        //实例化自定义选择器对象
        OwnComparator oc=new OwnComparator();
        //实例化TreeSet承载Teacher对象
        TreeSet<Teacher> ts=new TreeSet<Teacher>(oc);
        ts.add(new Teacher("bill",20));
        ts.add(new Teacher("bill",20));
        ts.add(new Teacher("tom",30));
        ts.add(new Teacher("gary",25));
        ts.add(new Teacher("gary",25));
        ts.add(new Teacher("sythen",20));
        //利用Iterator对元素进行取出
        Iterator<Teacher> it=ts.iterator();
        while(it.hasNext()){
            Teacher t=it.next();
            System.out.println("姓名"+t.getName()+"----"+"年龄"+t.getAge());
        }
    }

}

程序运行结果:

姓名:bill—-年龄:20
姓名:gary—-年龄:25
姓名:sythen—-年龄:20
姓名:tom—-年龄:30

6.TreeSet使用实例

场景描述:将字符串存入TreeSet中,并按照字符串长度排序

说明:字符串本身具备排序性(即已经实现了comparable接口),但其排序方式并不是本例所需要的,因此可以使用比较器进行自定义排序。但是可以将字符串本身具有的compareTo()方法作为次要排序条件。

示例程序:

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

//自定义String比较器类
class StringComparator implements Comparator<String>{

    //重写compare方法
    public int compare(String s1, String s2) {
        if(s1.length()>s2.length())
            return 1;
        else if(s1.length()<s2.length())
            return -1;
        else{
            //当用于比较的两个字符串长度相等时返回字符串的默认排序返回值
            return s1.compareTo(s2);
        }
    }

}

//自定义测试类
public class StringComparatorDemo {

    public static void main(String[] args) {
        //新建自定义字符串比较器对象
        StringComparator sc=new StringComparator();
        //新建TreeSet对象承载字符串
        TreeSet<String> ts=new TreeSet<String>(sc);
        ts.add("java");
        ts.add("python");
        ts.add("php");
        ts.add("c#");
        ts.add("c++");
        ts.add("jsp");
        //利用迭代器对元素进行输出
        Iterator<String> it=ts.iterator();
        while(it.hasNext()){
            System.out.println(it.next()); 
        }

    }

}

程序运行结果:

c#
c++
jsp
php
java
python


相关阅读:
菜鸟猿大战Java之集合框架系列(一)
菜鸟猿大战Java之集合框架系列(二)
菜鸟猿大战Java之集合框架系列(四)
菜鸟猿大战Java之集合框架系列(五)

【攻克java集合系列(三)】java集合中的Set系列集合全面分析 之前我们已经对List集合进行了比较深入的分析,加下来轮到Set集合了,开干! 文章目录 阅读详情

相关推荐

LTC3783 LED驱动控制器设计与效率优化详解

开关电源控制器是现代LED照明的核心器件,通过电流模式控制实现高效能量转换。其核心原理是通过采样电阻检测负载电流,配合误差放大器形成闭环调节,在汽车电子、显示背光等场景中确保±3%的电流精度。LTC3783作为典型代表,集成升压/降压-升压多拓扑支持,配合PWM调光技术可实现3000:1的无色偏调光范围。在工程实践中,需重点考量功率电感选型、MOSFET开关损耗与热管理设计,例如在38W功率方案中采用10μH/5A电感和4.5mΩ MOSFET可达成95%效率。该方案特别适用于需要应对9-36V宽输入电压波

weixin_36231030的博客 401

Java集合框架源码详解系列(一)

之前写过关于 C++ STL 的四篇文章,现在开始写一下关于Java集合框架的文章,该系列博客将会写很长时间。不管是C++的STL也好,Java的集合框架也好,这两者其实都是将一些基本的数据结构进行了封装实现,从现在开始博主将带领大家遨游在Java集合框架的源码世界,准备好了吗?Go!!!

晴空๓ 4307

什么是OAuth 2.0?

OAuth2.0是一种授权协议而非登录协议,核心思想是通过令牌(Token)而非密码实现安全授权。它涉及三个关键角色:用户、第三方应用和身份提供商(IdP)。最常用的授权码流程(AuthorizationCode Flow)通过浏览器三方对话,确保用户密码只提供给IdP而非第三方应用。OAuth2.0提供四种授权方式,其中授权码和客户端凭证是当前主流,而隐式和密码模式已不推荐。需要注意的是,OAuth2.0解决的是授权问题,身份认证需通过OpenID Connect实现。该协议通过临时令牌机制,实现了&qu

sonadorje的专栏 1162

【JavaSE系列】Java集合框架之Collection,Map接口

本篇文章带大家认识Java基础知识——集合框架,从本篇文章开始正式拉开数据结构的序幕,要深入了解一件事,那必然先得见个面,本文带大家认识Java集合框长什么样,以及怎么使用Collection和Map接口。

未见花闻的博客 1832

RV1106G3的AOV下的yolov5调试记录

本文介绍了基于LuckFoxPicoMax开发板的RV1106芯片调试经验,重点包括AOV(Always-On Vision)和Yolov5目标检测的实现。在硬件方面,板载1TOPS NPU、256MB内存,并更换为SPI NOR存储。软件调试涉及MK配置文件修改、设备树调整(按键唤醒和sensor配置)以及程序自启动设置。Yolov5模型优化为320*320尺寸,推理时间约45ms。系统采用VI采图与AI识别通过共享内存通信的方案,实测功耗在20-35mA范围。文章还指出了当前存在的功耗优化、ISP调试等

fzktongyong的博客 1715

Vue3 - 解决报错 Uncaught (in promise) DOMException: Failed to execute ‘insertBefore‘ on ‘Node‘: The node

vue3,报错,vue3报错,Uncaught(inpromise)DOMException:Failedtoexecute'insertBefore'on'Node':Thenodebeforewhichthenewnodeistobeinsertedisnotachildofthisnode,如何解决这个错误,动态渲染,v-if,v-show,insertBefore,详细解决方法,vue3未能在“Node”上执行“insertBefore”:要插入

🏆 前端领域优质创作者 1万+

Java基础系列八 集合框架

集合概念 Iterable接口-Collection接口-List接口:LinkedList类、ArrayList类,Set接口:HashSet类、TreeSet类,Map接口:HashMap类、TreeMap类,Iterator接口 与 ListIterator接口

653

SerDes系列之如何选择AC耦合电容

交流耦合电容用于隔离PCB互连时的直流分量(Common-mode voltage),同时传递交流分量(Voltage swing),其作用类似于一个高通滤波器,但是,如果电容容值选取不当,使用过程中会产生信号质量问题,典型的应用场景:当包含相同的长串1或0的NRZ数据应用于该高通滤波器时,会发生低频电压跌落,导致低频模式相关抖动(PDJ)。

一只豌豆象的博客 2356

Java集合系列详解

一,集合简介 Java中的集合可以分为四种体系: List:代表有序、重复的集合 Set:代表无序、不可重复的集合 Map:代表具有映射关系的集合 Queue:体系集合,代表一种队列集合实现 二,Java集合类的关系 Java中的集合类主要有两个接口派生:Collection和Map Collection类图如下: Map类图如下: 三,Collection接口 1,Set体系 Set是一种...

wang_yong_hui_1234的博客 5990

QT 实现QStackedWidget切换页面右移动画

首先截取当前界面的图片,渲染到一个QLabel上,然后设置QPropertyAnimation动画,动画的作用对象就是这个QLabel,不断的改变geometry;当动画结束的时候,隐藏并释放这个QLabel。以下是一个QStackedWidget,放了两个QPushButton在上面,点击切换不同的界面。为了方便查看动画特效,设置了每个界面的背景图片。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 884

5G RF前端架构为什么越来越复杂?从8天线、MIMO、ET、DRX到ACLR/EVM彻底拆开

AdjacentChannelLeakageRatioAdjacentChannelLeakageRatio主信道的功率,有多少泄漏到了隔壁Channel。ACLRPAdjacentPMainACLR=ACLRPMain​PAdjacent​​通常以dBc表达。

weixin_43199439的博客 48

Java集合框架全面详解

集合框架是一个统一的架构,用于表示和操作集合,使集合能够独立于其实现细节进行操作。Java集合框架提供了一系列接口和类,用于存储、检索、操作和传输数据对象。尽管Java集合框架提供了丰富的实现,但有时您可能需要创建自定义的集合类。扩展现有集合类@Override@Override实现集合接口size = 0;@Override@Override@Override// 省略其他必要的方法实现...使用组合而非继承@Override。

qq_38830315的博客 2211

【工具篇】万字长文拆解 Otter.ai:语音转文字领域的「瑞士军刀」是如何炼成的?(附保姆级教程)

但需要注意,2024年欧盟已出台《AI转录伦理指南》,要求所有录音需获得参与者明确授权。举个真实案例:某硅谷创业团队用Otter.ai记录产品评审会,系统自动标红争议点并生成待办事项,会议效率提升40%。AIGC技术原理、 实时转录解析、 定价策略分析、 语音算法拆解、 多平台兼容测试、 深度学习框架、 空间计算专利。——无论是跨国会议、课堂讲座还是深夜灵感,它都能实时生成带时间戳的文本记录,准确率高达95%。(此处建议插入Otter.ai会议转录动图,展示实时字幕生成效果)(数据来源:综合参考文献整理)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1264

Java 集合框架 基础 总结 - lenyan

在 Java 编程中,集合框架是一个非常重要的部分,它提供了一组用于存储、操作和处理数据的类和接口。集合框架可以大大简化我们处理数据集合的工作,提高编程效率和代码质量。本文将对 Java 集合框架的基础内容进行总结,包括常见的集合类型、接口及其特点、常用方法等。Java 集合框架位于java.utilCollectionMap和Iterator。Collection是一个用来存储一组对象的接口,它有几个重要的子接口,如ListSet和Queue。Map则是用于存储键值对的数据结构。Iterator。

lenyan~的博客 1324

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【夯实Java基础】(三)史上最全集合框架归纳总结

文章目录集合框架的大体结构详解主要类及接口第一章 Collection集合1.1 集合概述1.2 集合框架1.3 Collection 常用功能第二章 Iterator迭代器2.1 Iterator接口2.2 迭代器的实现原理2.3 增强forDemo1:遍历数组Demo2:遍历集合第三章 泛型3.1 泛型概述3.2 使用泛型的好处3.3 泛型的定义与使用3.3.1 定义和使用含有泛型的类...

云祁QI 2052

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[ Java 基础系列 ]很详细很详细的 Java 集合框架教程!

新手引导 集合在我们日常开发使用的次数数不胜数,ArrayList/LinkedList/HashMap/HashSet······信手拈来,抬手就拿来用,在IDE上龙飞凤舞,但是作为一名合格的优雅的程序猿,仅仅了解怎么使用API是远远不够的,如果在调用API时,知道它内部发生了什么事情,就像开了透视外挂一样,洞穿一切,这种感觉才真的爽,而且这样就不是集合提供什么功能给我们使用,而是我们选择使用它的什么功能了。 集合框架总览 下图堪称集合框架的上帝视角,讲到集合框架不得不看的就是这幅图,当然,你会觉得眼花

欢迎来到「小菠萝」的博客 625

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java集合框架解析

Java集合框架(Java Collections Framework, JCF)位于java.utilCollection:单列数据集合的根接口List:有序可重复集合Set:无序不可重复集合Queue:队列集合Map:双列键值对集合Iterator:集合遍历接口。

qq_45351273的博客 2058

Java基础08-集合框架—单列集合

TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方式来指定比较规则。方式一:让自定义的类( 如学生类)实现Comparable接口,重写里面的compareTo方法来指定比较规则。方式二:通过调用TreeSet集合有参数构造器,可以设置Comparator对象( 比较器对象,用于指定比较规则。//学生类(通过实现 Comparable 接口来自定义规则)//重写compareTo方法实现安装规则排序@Override。

qq_57340195的博客 1008

详解java集合框架

文章目录一、集合框架详解1、Collection接口1)collection接口2)AbstractCollection抽象类3)SortedSet接口4)AbstractList和AbstractSet5)继承基类List的类6)继承基类Set的类2、Map接口二、集合的意义和使用1、意义2、使用1)线程安全PK性能高效2)链表PK数组3)重复pk单一4)有序pk无序 一、集合框架详解 下图转载自: https://blog.youkuaiyun.com/weixin_43314519/article/details

m0_51801058的博客 2028

Java基础系列文章-集合框架体系

坚持最初的梦想,年轻没有失败。

相信自己有能力,那么你就真的会有! 891

[Java基础] 集合框架

本文介绍了Java的集合框架,包括List、Set、Queue、Map和Deque接口,介绍了这些接口的实现,数据结构原理特性,并且介绍了最佳实践。同时也整理了一些常见的面试题。

MCC_MCC_MCC的博客 1315

Java基础(十九):集合框架

Set接口是Collection的子接口,Set接口相较于Collection接口没有提供额外的方法Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败Set集合支持的遍历方式和Collection集合一样:foreach和IteratorSet的常用实现类有:HashSet、TreeSet、LinkedHashSetHashSet 是 Set 接口的主要实现类,大多数时候使用 Set 集合时都使用这个实现类。

从基础到源码解析的学习记录 2162

夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题

本文介绍了Java集合类的基本框架,接口结构以及部分源码分析,并且通过自己实现一些集合类来更好地剖析Java集合类的整体结构。 本文只是对集合类框架进行一个大概的梳理,毕竟集合框架中包含的类太多了,一篇文章不可能讲完,这里先开一个头,对整体框架有一个清晰认识之后,再去探索各个接口实现类的奥秘。 后面会专门地写几篇关于集合类的文章,分别介绍一下List,Map,Set以及Stack等等这些接口的...

Java技术江湖 4966

Java基础之集合框架详解

Java集合类总结大全 集合和数组之间的差别 Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素。 Collection接口中常用的方法 List接口中常用的方法 ArrayList集合 LinkedList集合 set接口 HashSet集合 LinkedHashSet集合 Collections:集合工具类 双列集合Map Map接口中常用的方法 Map集合的两种遍历方式 一、使用set方法 通过键找值的方式 二、使用Entry对象遍历map集...

小小张自由—>张有博 2492

Java 集合框架是什么?集合框架的优点有哪些?

它提供了一系列的接口和类,这些接口和类可以帮助我们以一种高效和标准化的方式存储、访问和操作数据集合。随着集合的广泛使用,Java1.2 提出了囊括所有集合接口、实现和算法的集合框架。集合框架中的类都是由经验丰富的开发者设计和实现的,它们经过了严格的测试,确保了性能和稳定性。集合框架提供了现成的、经过优化的数据结构,开发者可以直接使用这些数据结构,而不需要从头开始实现自己的集合类。:Java 5 引入了泛型,这使得集合可以指定它们可以存储的元素类型,从而提供了编译时类型安全,减少了类型转换的错误。

apple_64847327的博客 1105

集合框架基础之Java

数据结构名:,是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。其实,本质上就是把数据元素按照一定的逻辑关系组织起来,并把这种逻辑关系在计算机中进行存储和实现。Java集合框架的官方教程集合框架是编程语言中封装了 数据存储、操作、管理的工具集合,核心是提供一套标准化的类和接口,用于高效存储、访问、修改多个数据。Java集合框架的全称为:, 又称为container,是定义在java.util包下的一组接口interfaces和其实现类classes。

code_0218的博客 1034
上一篇: Java基础之集合框架系列(二)
下一篇: java知识点之泛型
CodingEnding
博客等级 码龄11年 86粉丝 49原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值