Java 进阶:集合框架1

【技术精进】Java集合框架:从入门到精通的思考之路 你是否曾经困惑于HashMap的扩容机制?是否好奇ConcurrentHashMap是如何保证线程安全的?或者对Java 8中Stream API的优雅设计感到惊叹?本文将带你深入探索Java集合框架的精髓,从实战应用到源码分析,从性能调优到并发处理,一步步揭开Java集合框架的神秘面纱。这不仅是一份学习指南,更是一次技术沉淀的旅程。 阅读详情

目录

一、集合类
1. 概述
2. 集合类的框架
3. 参数化类型和泛型
二、Collection 接口
三、 集合 Collection 的方法
1. 第一类:针对单个元素的操作
2. 第二类:针对集合的操作(一次操作多个元素)
三、集合元素的遍历
1. 第一种遍历方式: 将集合转化为数组
2. 第二种遍历方式: 通过迭代器遍历集合中的所有元素(集合专用)
四、Iterator 接口 (迭代器)
1. 迭代器概述
2. Iterator 接口的抽象方法
3. 遍历的代码实现
4. 实现原理
5. 一个例题:遍历对象
6. 集合迭代中的转型
五、增强for循环
1. 格式
2. 遍历数组
3. 遍历集合,存储自定义 Person 类型


一、集合类

1. 概述

  • 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个 对象 的操作,Java就提供了集合类。

  • 集合类的特点

  • 集合只用于存储 对象,集合长度是 可变 的,

  • 集合可以存储 不同类型 的对象。(因为集合类实现了泛型)

//参数化类型
//集合可以存储不同类型的对象
ArrayList<Integer> arrayList = new ArrayList<>();
ArrayList<String> a = new ArrayList<>();
ArrayList<A> b = new ArrayList<>();
  • 集合和数组的区别:

  • 数组虽然也可以存储对象,但长度是 固定的;集合长度是 可变 的。

  • 数组 中可以存储基本数据类型,集合 只能存储对象,也就是 引用类型数据

只能存储对象,这只能作为区别,但并非集合的限制(存储基本数据类型我们有自动的装箱和拆箱机制)
装箱: 可以直接将基本数据类型的值,赋值给其包装类的对象
拆箱:可以直接吧一个包装类对象,赋值给基本数据类型

ArrayList<Integer> arrayList = new ArrayList<>();

//java 自动装箱
arrayList.add(1); //将基本数据类放入集合中

2. 集合类的框架

  • Collecton 接口常用的 子接口 有:List接口、Set接口
  • List 列表 接口常用的 实现类 有:ArrayList数组类、LinkedList链表类等
  • Set 集 接口常用的 实现类 有:HashSet类、TreeSet类
    等

集合类的框架

Collecton:基本操作:增删改查
List: 元素有序、元素可重复、有索引
ArrayList:顺序表、用数组实现、非线程安全
LinkedList:链表、双向链表实现、非线程安全
vetor:向量、数组实现、线程安全(很少用)

Set: 元素无序、元素不可重复、没有索引
HashSet:哈希表实现
TreeSet: 红黑树实现

3. 参数化类型和泛型

  • parameterized type(参数化类型) 和 generic type(泛型)
  • 泛型用来指明集合中存储数据的类型 <数据类型>,参数化类型用来具体数据类型,类似于 实参 和 形参 的关系
  • 为什么要有参数化类型?

保证从语法层面,强制只能向一个集合中,放入一种具体类型的数据


二、Collection 接口

jdk中的描述:

Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。
一些 collection 允许有重复的元素,而另一些则不允许。一些collection 是有序的,而另一些则是无序的。
JDK 不提供此接口的任何直接,实现:它提供更具体的子接口(如 Set 和 List)实现


三、 集合 Collection 的方法

Java中三种长度表现形式:
数组.length 属性 返回值 int
字符串.length() 方法,返回值 int
集合.size() 方法, 返回值 int

  • 集合 Collection 的方法是实现类必须拥有的方法

1. 第一类:针对单个元素的操作

  • boolean add(E e):将元素追加到当前元素集合的末尾,添加成功返回 true
  • Object[] toArray():将集合中的元素,转成一个数组中的元素, **集合转成数组**。返回是一个存储对象的数组

集合对象中,已经覆盖了Object的toString方法,所以可以直接打印集合中的元素值

  • boolean contains(Object o):判断对象是否存在于集合中,对象存在返回 true

  • void clear():清空集合中的所有元素,集合容器本身依然存在

  • boolean remove(Object o)

  • 移除集合中指定的元素,删除成功返回 true,

  • 当删除不存在的元素时,只会返回 false

  • 当集合中有重复元素时,只会删除 第一个

  • boolean contains(Object o):判断当前集合中是否包含指定元素,是则返回true

  • boolean isEmpty() :判断集合是否为空

private static void function(){ 
    //接口多态调用
    Collection coll = new ArrayList(); 
    coll.isEmpty();
    coll.add("abc");
    coll.add("money");
    coll.add("itcast");
    coll.add("itheima");
    coll.add("money");
    coll.add("123");

    boolean b = coll.remove("money");
    boolean b = coll.contains("itcast");
    System.out.println(a.contains("lisi")); //返回fause
    coll.clear();
}

2. 第二类:针对集合的操作(一次操作多个元素)

  • boolean addAll(Collection c):将指定 collection 中的所有元素都添加到此 collection 中.
  • boolean removeAll(Collection c):移除此 collection 中那些也包含在指定 collection 中的所有元素
  • boolean containsAll(Collection c):如果此 collection 包含指定 collection 中的所有元素,则返回 true
  • boolean retainAll(Collection c):仅保留此 collection 中那些也包含在指定 collection 的元素。如果此 collection 由于 调用 而发生更改,则返回 true,否则返回 false
public class CollectionDemo {
    public static void main(String[] args) {
        //创建第一个集合对象
        Collection<String> a = new ArrayList<>();
        a.add("zs");
        a.add("lisi");
        a.add("wangwu");

        //创建第二个集合对象
        Collection<String> b = new ArrayList<>();
        b.add("zs");
        b.add("lisi");
        b.add("wangwu");

        //boolean addAll(Collection c)
        //boolean result = a.addAll(b);
        //System.out.println(result);
        //b集合中的元素,复制了一份全部添加到a集合中
        //System.out.println(a);
        //b集合本身没有任何变化
        //System.out.println(b);

        //boolean removeAll(Collection c)
        // a.removeAll(b);
        // System.out.println(a);

        //boolean containsAll(Collection c)
        //System.out.println(a.containsAll(b));

        //boolean retainAll(Collection c)

        System.out.println(a.retainAll(b));
        System.out.println(a);
        System.out.println(b); //b集合没有任何变化
    }
}

三、集合元素的遍历

1. 第一种遍历方式: 将集合转化为数组

public class CollecitonDemo {
    public static void main(String[] args) {
        //第一步,得到一个集合对象
        Collection<String> a = new ArrayList();
        Collection<Integer> b = new ArrayList();

        a.add("zs");
        a.add("lisi");
        a.add("wangwu");
        a.add("zhaoliu");

        //第一种遍历方式: 将集合转化为数组
        Object[] objects = a.toArray();

        for (int i = 0; i < objects.length; i++) {
            System.out.print(objects[i] + " ");
        }
        System.out.println();
    }
}

2. 第二种遍历方式: 通过迭代器遍历集合中的所有元素(集合专用)

  • 后面详细介绍

四、Iterator 接口 (迭代器)

1. 迭代器概述

  • Collection 集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为 迭代。
  • 每种集合的底层的数据结构不同,例如 ArrayList 是数组,LinkedList 底层是链表,但是无论使用那种集合,我们都会有判断是否有元素,以及取出里面的元素的动作,那么Java为我们提供一个迭代器定义了统一的****判断元素和取元素的方法
  • Collection 接口定义的 iterator()方法 用来返回基于当前数据集合的迭代器对象。
  • 迭代器对象是 依赖当前数据集合的

Iterator 为什么不是定义成一个类,而是接口?
因为:功能上没什么问题,但是由于一旦把针对不同具体集合的生成迭代器的方法,放在一个类中,通常,各个不同的迭代器的方法,可能会有一些公共行为,被抽成一个方法。就会因为一些公共操作的存在,产生错综复杂的联系,形成 上帝类(God Class) 啥都管,很难维护

  • 迭代器的优点:

迭代器是一个接口,每一个具体的集合类都实现了 Iterator 接口,能够返回一个针对自己的存储结构的具体的 Iterator 接口的实现子类。
Iterator向上层的使用者,屏蔽了具体的底层集合类的实现细节,使用方法都一样

2. Iterator 接口的抽象方法

  • boolean hasNext():判断集合中还有没有可以被取出的元素,如果有返回 true
  • next():取出集合中的下一个元素
  • remove() : 删除集合中当前访问的元素

3. 遍历的代码实现

/*
原理:
Collection接口定义方法 Iterator iterator()
ArrayList 重写方法 iterator(),返回了Iterator接口的实现类的对象
使用 ArrayList 集合的对象Iterator it = array.iterator(),运行结果就是Iterator接口的实现类的对象
it是接口的实现类对象,调用方法 hasNext 和 next 来实现集合元素迭代
*/
public class CollecitonDemo {
    public static void main(String[] args) {

        //第一步,得到一个集合对象
        Collection<String> a = new ArrayList();
        Collection<Integer> b = new ArrayList();

        a.add("zs");
        a.add("lisi");
        a.add("wangwu");
        a.add("zhaoliu");

        //集合类专用的遍历方式  通过迭代器遍历集合中的所有元素
        //调用集合的方法iterator()获取出 Iterator接口的实现类的对象
        Iterator<String> iterator = a.iterator();

        //利用迭代器遍历
        //迭代是反复内容,使用循环实现,循环的条件,集合中没元素, hasNext()返回了false
        //调用方法hasNext()判断集合中是否有元素
        while(iterator.hasNext()) {
            //调用方法next()取出集合中的元素
            System.out.println(iterator.next());
        }
        //for循环迭代写法:
//        for (Iterator<String> it2 = coll.iterator(); //it2.hasNext();  ) {
//         System.out.println(it2.next());
//       }

        //利用迭代器删除集合中的元素
        //注意要执行,要把前面的注释掉,因为size已经在最后了
        //迭代是反复内容,使用循环实现,循环的条件是集合中没元素, hasNext()返回了false
        while(iterator.hasNext()) {
            String s = iterator.next();
            //if(1 == i)  和 if(i == 1)
            if("wangwu".equals(s)) {
            //从Collection中删除当前访问到的元素
            iterator.remove();
            }
        }
        System.out.println(a);

        Collection<String> list = new LinkedList<>();
        list.add("stu1");
        list.add("stu2");
        list.add("stu3");
        list.add("stu4");

        //利用迭代器,遍历LinkedList
        Iterator<String> iterator1 = list.iterator();

        while(iterator1.hasNext()) {
            System.out.println(iterator1.next());
        }
    }
}

4. 实现原理

/实现原理
while(it.hasNext()) {
    System.out.println(it.next());
}
//cursor记录的索引值不等于集合的长度返回true,否则返回false
public boolean hasNext() {
   return cursor != size; //cursor初值为0
}
//next()方法作用:
//返回cursor指向的当前元素
//cursor++
public Object next() {
    int i = cursor;
    cursor = i + 1;
    return  elementData[lastRet = i];
}

5. 一个例题:遍历对象

  • 题目:存储自定义 对象 并遍历,Student(name,age)
public class Student {
    //成员属性
    private String name;
    private int age;
    //构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //get和set方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    //重写toString(),实现输出对象
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class IteratorExercise {
    public static void main(String[] args) {

        //初始化一个存放Student类对象的集合对象
        Collection<Student> a = new ArrayList<>();

        a.add(new Student("zs", 24));
        a.add(new Student("lisi", 25));
        a.add(new Student("wangwu", 26));
        //System.out.println(a);

        //完成遍历
        Iterator<Student> iterator = a.iterator();

        while(iterator.hasNext()) {
            Student stu = iterator.next();
            System.out.println(stu.getName() + " -- " + stu.getAge());

            //以下做法是错误的,因为每调用一次next()方法
            //cursor都会后移一位,就指向了下一个对象元素
            //System.out.print(iterator.next().getName() + " -- " + iterator.next().getAge());
        }
    }
}

6. 集合迭代中的转型

  • 在使用集合时,我们需要注意以下几点:
  • 集合中存储其实都是对象的地址。
  • 存储时类型提升为 Object类型。取出时若要使用元素的特有内容,必须向下转型。
//不指定存储的数据类,什么都存,就是 Object类型
Collection coll = new ArrayList(); 
coll.add("abc");
coll.add("aabbcc");
coll.add("shitcast");

//获取迭代器,也不能加<>
Iterator it = coll.iterator();
//由于元素被存放进集合后全部被提升为Object类型
//当需要使用子类对象特有方法时,需要向下转型
while (it.hasNext()) {
    String str = (String) it.next(); //获取的是Object类型
    System.out.println(str.length());
}
//注意:如果集合中存放的是多个对象,这时进行向下转型会发生类型转换异常。

五、增强for循环

1. 格式

//格式:
for( 数据类型  变量名 : 数组或者集合 ){
    System.out.println(变量);
}

2. 遍历数组

  • 好处: 代码少了,方便对容器遍历
  • 弊端: 没有索引,不能操作容器里面的元素
  • for 对于对象数组遍历的时候,可以调用对象的方法
  • 注意:增强 for 要遍历的集合,要判断是否为 null
public static void function(){
    int[] arr = {3,1,9,0};
    for(int i : arr){
        System.out.print(i+1+" ");
    }
    System.out.println(arr[0]); //输出 3
    //输出:4 2 10 1

    //遍历的时候,可以调用对象的方法
    String[] str = {"abc","itcast","cn"};
    for(String s : str){
        System.out.println(s.length());
    }
}

3. 遍历集合,存储自定义 Person 类型

public static void function(){
    ArrayList<Person> array = new ArrayList<Person>();
    array.add(new Person("a",20));
    array.add(new Person("b",10));
    for(Person p : array){
        System.out.println(p);// System.out.println(p.toString());
    }
}
Java集合进阶 在Java中,集合框架(Collections Framework)是用于存储和操作一组对象的强大工具。它提供了多种接口和类,用于处理不同类型的集合(如列表、集合、队列、映射等)。为了帮助你学习Java集合的进阶知识,我将从以下几个方面进行讲解:Java集合框架主要包括以下接口和类:: 所有集合类的根接口。: 有序集合,允许重复元素(如 , )。: 无序集合,不允许重复元素(如 , )。: 队列,支持先进先出(FIFO)或优先级队列(如 )。: 键值对集合(如 , )。: 基于动态数组实现的列表。: 基于双 阅读详情

相关推荐

Typora绘制思维导图

我们观察一下,其实思维导图就是树状结构的数据嘛,作为程序员,拿语言写树状结构的数据是很平常的事情。而且写代码可比画图省事多了,查阅资料可以知道,有一种`mermaid`语法,就是做这件事情的,支持 UML,甘特图,流程图等。

Peter Cheung的博客 7934

List之迭代器

List之迭代器

qq_41820066的博客 5160

HFSS学习笔记——Vivaldi天线仿真(一)

Vivaldi 天线HFSS仿真,HFSS中指数曲线绘制及曲面绘制。

and_future的博客 1万+

【C++】list基本接口+手撕 list(详解迭代器)

本篇难点在于手撕list,以及迭代器的理解,希望可以给大家带来帮助!

小羊study_sheep的博客 3935

webview腾讯x5内核离线安装

离线集成腾讯TBS浏览器服务,彻底解决官方下载限流问题,永久免费

观千剑而后识器,操千曲而后晓声。 7923

ArcGIS新手必看:用Landsat 8数据计算植被覆盖度的完整流程(附DEM裁剪技巧)

本文为ArcGIS新手提供了使用Landsat 8数据计算植被覆盖度的完整流程指南。详细讲解了从数据预处理、NDVI计算到基于像元二分模型反演植被覆盖度的核心步骤,并重点分享了利用DEM进行精确裁剪的实用技巧,帮助用户高效完成地表信息提取与分析。

weixin_29279047的博客 244

LinkedList集合

LinkedList集合 ​ 底层是链表结构实现,查询慢、增删快 LinkedList集合的特有功能 特有方法 方法名 说明 public void addFirst(E e) 在该列表开头插入指定的元素 public void addLast(E e) 将指定的元素追加到此列表的末尾 public E getFirst() 返回此列表中的第一个元素 public ...

熊猫拿铁 474

模拟电子课设-半导体直流稳压电源的设计和测试

1、学习直流稳压电源的设计方法; 2、研究直流稳压电源的设计方案; 3、掌握直流稳压电路的调试及主要指标的测试方法。二、设计要求和技术指标 1、设计要求1)、设计一个能输出5V-12V连续可调的直流稳压电源,或±12V的直流稳压电源; 2)、根据设计要求和技术指标设计好电路,选好元件及参数,要求绘出原理图,并用Protel 99SE/DXP画出印制板图; 3)、在万能板或面包板上制作一台直流稳压电源; 4)、测量直流稳压电源的稳压系数; 5)、测量直流稳压电源的内阻; 6)、拟定测试方案和设计步

GJZGRB的博客 1973

java之迭代器Iterator/ListIterator

迭代器概述 java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。 我们要取出这些集合中的元素,可通过一种通用的获取方式来完成。 Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素, 如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。 每种集合的底层的数据结构不同,例如Arr...

shuzk的博客 545

Hyperledger Fabric 网络搭建详解

写在前面:博主也是因为一些原因刚刚入坑区块链,我认为在我们入门新技术的时候,入门总是最困难的部分,只要入门了,后面学习起来就会越来越轻松,在网上找了很多文章,我觉得大多条理不是很清楚。本文章会详细介绍fabric(v1.0)环境部署,以及在搭建过程我遇到一些问题及解决方案,希望可以帮助到你们。 博主环境机器:VMware15 Ubuntu16.04 fabric(v1.0)环境部署一、必备软件安装1.ubuntu环境安装2.Go语言3.Docker安装4. Docker-Compose 安装二、Fa.

林中有神君 1万+

Qt Quick/QML入门到精通_专栏demo对应文章目录(目前50个左右demo/长期更新)

自定义图标下拉列表框的效果如下所示:自定义三态按钮的效果如下所示:传送门:53.qt quick-自定义三态按钮、自定义图标下拉列表框_诺谦的博客-优快云博客传送门:59.qt quick-qml调色板(颜色取色器)实现、自定义QQuickStyle样式_诺谦的博客-优快云博客63.qt quick-QML侧边滑动栏(不需要任何图片资源,支持自定义左右方向和大小)_诺谦的博客-优快云博客_qt实现好看侧边栏。...

抵抗时间扭曲,坚持做一件有意义的事 2万+

List集合的五种遍历方式

一、List五种遍历方式 1、普通for遍历 2、 增强for遍历 3、Lambda表达式 4、迭代器遍历 5、列表迭代器

qi341500的博客 6516

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2978

Java-进阶:集合框架1

因为:功能上没什么问题,但是由于一旦把针对不同具体集合的生成迭代器的方法,放在一个类中,通常,各个不同的迭代器的方法,可能会有一些公共行为,被抽成一个方法。迭代器是一个接口,每一个具体的集合类都实现了 Iterator 接口,能够返回一个针对自己的存储结构的具体的 Iterator 接口的实现子类。//迭代是反复内容,使用循环实现,循环的条件,集合中没元素, hasNext()返回了false。//调用集合的方法iterator()获取出 Iterator接口的实现类的对象。//将基本数据类放入集合中。

2401_85113211的博客 767

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

深度学习工具包 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进阶:集合框架1

由于一旦把针对不同具体集合的生成迭代器的方法,放在一个类中,通常各个不同迭代器的方法,可能会有一些公共方法,被抽象成一个方法,定义成一个万能类的话会很难维护。collection集合元素的通用获取方式:在取元素之前先要判断集合中是否有元素,如果有就取出该元素,继续进行判断,直到取出全部元素,称为迭代。每种集合的底层数据结构不同,但是判断以及取出的动作相同,Java提供了一个迭代器定义了统一的判断元素和取元素的方法。Object[ ] toArray():将集合中的元素,转成一个数组中的元素,集合转成数组。

weixin_67852961的博客 214

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

集合覆盖模型例题_Java 进阶:集合框架1

目录一、集合类1. 概述2. 集合类的框架3. 参数化类型和泛型二、Collection 接口三、 集合 Collection 的方法1. 第一类:针对单个元素的操作2. 第二类:针对集合的操作(一次操作多个元素)三、集合元素的遍历1. 第一种遍历方式: 将集合转化为数组2. 第二种遍历方式: 通过迭代器遍历集合中的所有元素(集合专用)四、Iterator 接口 (迭代器)1. 迭代器概述2. I...

weixin_39612332的博客 1360

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

迭代器和集合的关系_Java 进阶:集合框架1

目录一、集合类1. 概述2. 集合类的框架3. 参数化类型和泛型二、Collection 接口三、 集合 Collection 的方法1. 第一类:针对单个元素的操作2. 第二类:针对集合的操作(一次操作多个元素)三、集合元素的遍历1. 第一种遍历方式: 将集合转化为数组2. 第二种遍历方式: 通过迭代器遍历集合中的所有元素(集合专用)四、Iterator 接口 (迭代器)1. 迭代器概述2. I...

weixin_39929595的博客 131

Java-进阶:集合框架2(1)

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!!ult = 100;} else {第二种方式:给 TreeSet 对象定义比较器Comparator这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!![外链图片转存中…(img-SJe0G5Cu-1714321594232)]本文已被。

2401_84103216的博客 823

Java进阶篇1-3:集合框架(单列集合)

集合是一种容器,用来装数据的,类似于数组,但集合的大小可变,开发中也非常常用。

qq_40489522的博客 245

数组和集合的区别_「软帝学院」Java进阶者专栏:集合框架详解1

软帝学院笔记Day12集合框架(对象数组的概述和使用)A:案例演示需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息。Student[] arr = new Student[5]; //存储学生对象 arr[0] = new Student("张三", 23); arr[1] = new Student("李四", 24); arr[2] = new St...

weixin_39799561的博客 74

Java技术篇!Java-进阶:集合框架1聪明人已经收藏了!

目录 一、集合类 1. 概述 2. 集合类的框架 3. 参数化类型和泛型 二、Collection 接口 三、 集合 Collection 的方法 1. 第一类:针对单个元素的操作 2. 第二类:针对集合的操作(一次操作多个元素) 三、集合元素的遍历 1. 第一种遍历方式: 将集合转化为数组 2. 第二种遍历方式: 通过迭代器遍历集合中的所有元素(集合专用) 四、Iterator 接口 (迭代器) 1. 迭代器概述 2. Iterator 接口的抽象方法 3. 遍历的代码实现 4. 实现原理 5. 一个例题

170
上一篇: Java 进阶:Java File & IO—2
下一篇: Java 进阶:集合框架2
JavaCaiy
博客等级 码龄6年 1万+粉丝 95原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值