9、Java 泛型原理与使用详解

【华为OD技术面试手撕真题】- Java手撕技术面试八股文(3) 【华为OD技术面试手撕真题】- Java手撕技术面试八股文(3) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od,华为od算法,华为od手撕代码,华为OD机试2025年最新 阅读详情

开篇概览:泛型的核心价值

泛型(Generics) 是 Java 5(JDK 1.5)引入的重要特性,其核心目标是:

  • 编译期类型安全检查:避免运行时 ClassCastException;
  • 消除强制类型转换:代码更简洁、可读;
  • 提升代码复用性:一套逻辑适配多种数据类型。

泛型的本质是参数化类型(Parameterized Types)——将类型作为参数传递给类、接口或方法,从而在编译阶段确保类型一致性。

本章将深入讲解:

  1. 泛型基本语法与原理(类型擦除);
  2. 泛型类、泛型方法、泛型接口;
  3. 类型通配符(?、<? extends T>、<? super T>);
  4. 边界限定与最佳实践。

一、泛型基本原理:类型擦除(Type Erasure)

1.1 什么是类型擦除?

  • Java 的泛型是编译期特性,运行时不存在泛型信息;
  • 编译器在编译时擦除泛型类型参数,替换为上限类型(通常是 Object);
  • 通过桥接方法(Bridge Methods) 和强制类型转换保证类型安全。
示例:泛型编译后等价代码
// 源码:泛型类
public class Box<T> {
    private T value;
    public void set(T value) { this.value = value; }
    public T get() { return value; }
}

// 编译后(等价于)
public class Box {
    private Object value;
    public void set(Object value) { this.value = value; }
    public Object get() { return value; }
}

✅ 优势:兼容 Java 5 之前的字节码;
❌ 局限:运行时无法获取泛型实际类型(如 T.class 非法)。


二、泛型类(Generic Class)

2.1 定义与使用

  • 在类名后使用 <T> 声明类型参数;
  • T 是类型变量(可为任意标识符,常用 T, E, K, V)。
示例:通用容器类
// 中文注释:定义一个泛型盒子类,可存储任意类型的数据
public class Box<T> {
    // 私有字段,类型为泛型 T
    private T content;

    // 设置内容(参数类型为 T)
    public void setContent(T content) {
        this.content = content;
    }

    // 获取内容(返回类型为 T)
    public T getContent() {
        return content;
    }

    // 重写 toString 方法,便于打印
    @Override
    public String toString() {
        return "Box 内容: " + content;
    }
}

// 测试泛型类
public class GenericClassDemo {
    public static void main(String[] args) {
        // 创建存储字符串的盒子
        Box<String> stringBox = new Box<>();
        stringBox.setContent("Hello 泛型");
        System.out.println(stringBox); // Box 内容: Hello 泛型

        // 创建存储整数的盒子
        Box<Integer> intBox = new Box<>();
        intBox.setContent(123);
        System.out.println(intBox); // Box 内容: 123

        // 编译器自动类型检查:以下代码会报错
        // stringBox.setContent(456); // ❌ 编译错误:Integer 不能赋值给 String
    }
}

2.2 多类型参数

// 中文注释:定义一个键值对泛型类(类似简化版 Map)
public class Pair<K, V> {
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() { return key; }
    public V getValue() { return value; }

    @Override
    public String toString() {
        return "Pair{" + key + "=" + value + "}";
    }
}

// 使用
Pair<String, Integer> score = new Pair<>("张三", 95);
System.out.println(score); // Pair{张三=95}

三、泛型方法(Generic Method)

3.1 定义与使用

  • 在返回类型前声明类型参数 <T>;
  • 可独立于类的泛型存在(普通类也可定义泛型方法)。
示例:泛型工具方法
// 中文注释:定义一个包含泛型方法的工具类
public class GenericMethodDemo {
    // 泛型方法:交换数组中两个位置的元素
    public static <T> void swap(T[] array, int i, int j) {
        T temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    // 泛型方法:打印任意类型数组
    public static <T> void printArray(T[] array) {
        for (T item : array) {
            System.out.print(item + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // 字符串数组
        String[] names = {"张三", "李四", "王五"};
        swap(names, 0, 2);
        printArray(names); // 王五 李四 张三

        // 整数数组
        Integer[] numbers = {1, 2, 3};
        swap(numbers, 0, 1);
        printArray(numbers); // 2 1 3
    }
}

✅ 优势:方法逻辑与具体类型解耦,复用性强。


四、泛型接口(Generic Interface)

4.1 定义与实现

  • 接口可声明泛型参数;
  • 实现类可指定具体类型,或保留泛型。
示例:泛型数据处理器
// 中文注释:定义一个泛型数据处理接口
interface DataProcessor<T> {
    // 处理数据并返回结果
    T process(T data);
}

// 实现类:指定具体类型(String)
class StringProcessor implements DataProcessor<String> {
    @Override
    public String process(String data) {
        return data.toUpperCase(); // 转为大写
    }
}

// 实现类:保留泛型(通用处理器)
class IdentityProcessor<T> implements DataProcessor<T> {
    @Override
    public T process(T data) {
        return data; // 原样返回
    }
}

// 测试
public class GenericInterfaceDemo {
    public static void main(String[] args) {
        DataProcessor<String> stringProc = new StringProcessor();
        System.out.println(stringProc.process("hello")); // HELLO

        DataProcessor<Integer> intProc = new IdentityProcessor<>();
        System.out.println(intProc.process(123)); // 123
    }
}

五、类型通配符(Wildcards)

通配符 ? 用于表示未知类型,增强泛型的灵活性。

5.1 无界通配符 <?>

  • 表示“任意类型”;
  • 只能读取,不能写入(除 null 外)。
示例:安全遍历任意类型列表
// 中文注释:打印任意类型 List 的内容(只读)
public static void printList(List<?> list) {
    for (Object item : list) { // 通配符列表只能转为 Object
        System.out.println(item);
    }
    // list.add("new"); // ❌ 编译错误:无法确定列表实际类型
}

public class WildcardDemo {
    public static void main(String[] args) {
        List<String> strList = Arrays.asList("A", "B");
        List<Integer> intList = Arrays.asList(1, 2);

        printList(strList); // 正常输出
        printList(intList); // 正常输出
    }
}

5.2 上界通配符 <? extends T>

  • 表示“T 或 T 的子类型”;
  • PECS 原则:Producer-Extends(生产者用 extends);
  • 可读不可写(因编译器不知具体子类型)。
示例:计算数字列表的总和
// 中文注释:计算 Number 及其子类(Integer, Double 等)列表的总和
public static double sumOfList(List<? extends Number> list) {
    double sum = 0.0;
    for (Number num : list) { // 安全:所有元素都是 Number
        sum += num.doubleValue();
    }
    return sum;
}

public class UpperBoundedWildcardDemo {
    public static void main(String[] args) {
        List<Integer> integers = Arrays.asList(1, 2, 3);
        List<Double> doubles = Arrays.asList(1.5, 2.5, 3.5);

        System.out.println("整数和: " + sumOfList(integers));   // 6.0
        System.out.println("小数和: " + sumOfList(doubles));    // 7.5

        // sumOfList(Arrays.asList("A", "B")); // ❌ 编译错误:String 不是 Number 子类
    }
}

5.3 下界通配符 <? super T>

  • 表示“T 或 T 的父类型”;
  • PECS 原则:Consumer-Super(消费者用 super);
  • 可写不可读(读取时只能转为 Object)。
示例:将字符串列表复制到任意父类型列表
// 中文注释:将源列表(String)复制到目标列表(String 或其父类,如 Object)
public static void copy(List<String> src, List<? super String> dest) {
    for (String s : src) {
        dest.add(s); // 安全:dest 至少能接受 String
    }
}

public class LowerBoundedWildcardDemo {
    public static void main(String[] args) {
        List<String> src = Arrays.asList("Java", "泛型");
        List<Object> dest = new ArrayList<>();

        copy(src, dest); // 成功:Object 是 String 的父类
        System.out.println(dest); // [Java, 泛型]

        // copy(src, new ArrayList<Integer>()); // ❌ 编译错误:Integer 不是 String 父类
    }
}

六、泛型边界限定(Bounded Type Parameters)

在定义泛型时限制类型参数的范围。

6.1 上界限定 <T extends 类/接口>

  • T 必须是指定类型或其子类;
  • 可指定多个接口(用 & 连接),但只能有一个类。
示例:限定泛型为可比较类型
// 中文注释:定义一个泛型方法,要求类型实现 Comparable 接口
public static <T extends Comparable<T>> T max(T a, T b) {
    return a.compareTo(b) > 0 ? a : b;
}

// 多重边界:必须是 Number 且实现 Comparable
public static <T extends Number & Comparable<T>> T min(T a, T b) {
    return a.compareTo(b) < 0 ? a : b;
}

public class BoundedTypeDemo {
    public static void main(String[] args) {
        System.out.println(max("Apple", "Banana")); // Banana
        System.out.println(min(3.14, 2.71));        // 2.71

        // max(123, "abc"); // ❌ 编译错误:类型不一致
    }
}

七、泛型最佳实践与注意事项

✅ 推荐做法

  1. 优先使用泛型:避免原始类型(如 List 而非 List<String>);
  2. 遵循 PECS 原则:
    • 生产数据(读取) → <? extends T>
    • 消费数据(写入) → <? super T>
  3. 方法参数尽量用通配符,返回类型避免通配符;
  4. 泛型类中避免创建泛型数组(可用 ArrayList 替代)。

❌ 避免做法

  • 泛型与基本类型混用:需使用包装类(List<int> 非法,应为 List<Integer>);
  • 运行时依赖泛型类型:
    // ❌ 非法:无法获取 T 的 Class
    T instance = new T(); 
    Class<T> clazz = T.class;
    
  • 在静态上下文中使用类泛型参数:
    public class Box<T> {
        // ❌ 非法:静态方法不能访问类泛型 T
        public static void method(T t) { }
    }
    

八、总结:泛型核心要点

特性说明
类型擦除运行时无泛型信息,编译期检查
泛型类class Box<T> { ... }
泛型方法<T> void method(T t)
泛型接口interface Processor<T> { ... }
无界通配符List<?> — 任意类型,只读
上界通配符List<? extends Number> — 生产者
下界通配符List<? super String> — 消费者
边界限定<T extends Comparable<T>>

📌 核心思想:
“泛型是编译器的语法糖,但却是类型安全的守护者。”
合理使用泛型,可让代码更安全、简洁、可维护,是现代 Java 开发的必备技能。

【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2026版) String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射 阅读详情

相关推荐

JAVA核心技术 第9版【中文版】完整学习指南

在Java中,类通过class关键字声明,包含字段(成员变量)和方法(成员函数)。字段表示对象的状态,方法则定义其行为。一个典型的类结构如下所示:// 成员变量(字段)// 构造器// 行为方法(成员方法)// Getter 和 Setter 方法(封装的一部分)return age;} else {安全性增强:避免外部随意修改关键字段;可维护性提升:字段访问集中于getter/setter,便于统一处理;扩展性强。

weixin_42576804的博客 682

泛型的介绍以及原理

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

cj_eryue的博客 2134

泛型的原理,通俗解释

java 泛型,c++泛型这些很让人困扰,通俗的解释一下,这个从网上找的,参考下

浅谈泛型原理

Java中的泛型是什么 ? 泛型是JDK1.5的一个新特性,**泛型就是将类型参数化,其在编译时才确定具体的参数。**这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 使用泛型的好处是什么? 远在JDK 1.4版本的时候,那时候是没有泛型的概念的,如果使用Object来实现通用、不同类型的处理,有这么两个缺点: 每次使用时都需要强制转换成想要的类型 在编译时编译器并不知道类型转换是否正常,运行时才知道,不安全。 如这个例子: List list = ...

weixin_45712075的博客 958

遥感大模型的深度学习从CNN到Vision Transformer以及混合架构的演进之路

深度学习,特别是以卷积神经网络(CNN)和Transformer为代表的“大模型”技术,正以其强大的表征学习能力,深刻地重塑着遥感智能解译的整个技术栈与认知范式。本文将系统性地梳理遥感大模型从局部卷积的奠基,到全局注意力的革命,再到二者融合的混合架构演进这一波澜壮阔的历程。我们将深入剖析每个阶段的核心技术原理,结合遥感数据特性与实际应用案例,详细阐述其在分类、检测、分割等核心任务中的具体应用。

panshengwu的博客 1138

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2861

java--基础--11.2--泛型--原理

案例//先检查:用String类型验证123,编译错误,如果要编译成功的话,下面代码可用反射//编译错误在上面的程序中,使用add方法添加一个整形,在eclipse中,直接就会报错,说明这就是在编译之前的检查。因为如果是在编译之后检查,类型擦除后,原始类型为Object,是应该运行任意引用类型的添加的。可实际上却不是这样,这恰恰说明了关于泛型变量的使用,是会在编译之前检查的。

zhou920786312的博客 463

python音频信号分析

声音以具有诸如频率、带宽、分贝等参数的音频信号的形式表示,典型的音频信号可以表示为幅度和时间的函数

MAY的博客 2785

什么是泛型?泛型的基本原理与使用优势。

1. 什么是泛型? 泛型将接口的概念进一步延伸,“泛型”的字面意思就是广泛的类型。类、接口和方法代码可以应用于非常广泛的类型,代码与它们能够操作的数据类型不再绑定在一起,同一套代码可以用于多种数据类型,这样不仅可以复用代码,降低耦合性,而且还提高了代码的可读性以及安全性。讲起来优点抽象,我们看个实际的例子。 2. 先来看一个简单的泛型例子 package genericity.demo; /** * @author BastetCat * @data 2019/8/8 21:14 */ p

Ever69的博客 3201

Unity WebGL发布避坑指南:从内存设置到字体打包,一次搞定所有常见问题

本文详细解析Unity WebGL发布的完整流程,从内存设置到字体打包,提供全面的避坑指南。涵盖关键检查清单、内存与性能优化配置、资源处理专项优化及平台适配技巧,帮助开发者高效解决常见问题,确保项目顺利发布。

weixin_28693309的博客 147

一种低照度目标检测新策略:IAT集成YOLOv8实现暗光与雾霾环境下的性能优化【附核心实战代码】

随着深度学习和计算机视觉的快速发展,目标检测模型在各个领域中的应用不断扩展,特别是在低照度环境下的视觉任务。YOLOv8作为当前最先进的目标检测模型之一,在高亮度和良好照明条件下表现出色,但在低照度环境下的性能存在一定的不足。为了解决这一问题,我们提出了一种轻量级的低照度图像增强网络(IAT)来改进YOLOv8的暗光检测能力。本篇文章将深入探讨这一创新改进,并附带代码实现,帮助大家更好地理解这一技术的应用和效果。

一键难忘的博客 3495

【java】Java 中泛型的实现原理

对比编辑的源代码 User.java 和反编译出来的代码 User.jad,容易发现:类型参数没有了,多了一个无参构造方法,多了一个 compareTo(Object obj) 方法,这个就是桥接方法,还可以发现参数 obj 被强转成 User 再传入 compareTo(User user) 方法。与泛型方法类似,泛型类也需要声明类型变量,只不过位置放在了类名后面,作用的范围包括了当前中的成员变量类型,方法参数类型,方法返回类型,以及方法内的代码中。而普通类中的泛型方法在进行类型擦除时不会产生桥接方法。

DreamSun的博客 1844

什么是 SAP Fiori 的 Technical Catalog

笔者之前的文章曾经提到一个叫做本文介绍 Technical Catalog 这个概念在 SAP Fiori 技术体系中的作用。首先我们如何在系统里查看这个 Catalog SAP_BASIS_TCR_T 里面包含的内容呢?如果大家照着本文开头那篇文章里提到的步骤,那么在自己系统里会创建好名叫的 PFCG role.我们登录 ABAP 系统,启动事务码 PFCG,打开这个 role, 就能看到它。展开之后,发现它扮演着一个容器的角色,里面包含了很多 ABAP 对象。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 742

Java9 编程参考官方大全(第10版)第14章 泛型:14.2.3泛型提高了类型安全性的原理NonGen类和NonGenDemo类

源代码如下: NonGen.java 文件内容: //14.2.3 泛型提升类型安全性的原理 //NonGen is functionally equivalent to Gen but does not use generics public class NonGen { Object ob;//ob is now of type Object //Pass the constructor a reference to an object of type Object NonGen(Ob

只会写HelloWorld的专栏 146

MTK(基础篇)ROM烧录以及分区的作用

本文介绍了MTK芯片设备的刷机流程及关键分区功能。首先通过MTK烧录工具加载ROM文件(包括引导文件和分区表),重点解析了各分区的核心作用:preloader类似BIOS负责硬件初始化;lk作为二级引导程序加载内核;vbmeta验证系统完整性;boot包含Linux内核;dtbo调整硬件配置;modem管理通信功能;tee保护生物识别数据;system/vendor分别存放系统核心和硬件驱动。特别指出preloader、vbmeta等关键分区损坏会导致设备变砖,而recovery分区是重要的救砖入口。全文简

weixin_49303682的博客 443

IDEA的使用指南

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

Java笔记 —— 泛型

编译器在编译时进行类型检查,然后将泛型类型替换为原始类型(Raw Type),并插入必要的强制转换。Java泛型是一个强大且复杂的特性,它通过编译时类型检查提供了类型安全,并消除了强制转换的繁琐。理解泛型需要掌握:泛型类、接口、方法的定义与使用类型边界的约束通配符的灵活运用及PECS原则类型擦除的原理及其带来的限制。

2301_82251392的博客 427

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

为什么要使用泛型程序设计?Java泛型核心价值与2026实战全解

摘要 本文基于Java 21 LTS版本,系统讲解了泛型程序设计的核心概念与实战应用。文章通过正反代码对比,展示了泛型在编译期类型安全检查和代码复用方面的核心价值。主要内容包括:泛型的基本定义(参数化类型)、四大设计优势(类型安全、代码复用、可读性提升、框架开发基础)、企业级实战模板(通用API响应体、工具类封装)、以及常见报错解决方案。文中提供了详细的代码示例,如通用排序工具类实现,并强调了泛型在避免ClassCastException等运行时错误方面的重要作用。文章适合Java开发者从入门到进阶学习泛型

专注于跨端开发实战,分享从工程搭建到应用落地的全流程技术干货,助力开发者快速掌握跨平台开发核心能力,打造稳定、高效的应用。 377

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JAVA面试题基础篇四,附赠答案

问:java反射的作用于原理 答:JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。 反射的实现主要借助以下四个类: Class:类的对象 Constructor:类的构造方法 Field:类中的属性对象 Method:类中的方法对象 问:泛型常用特点 答:泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写,体验泛型代码...

想当大佬的咸鱼双的博客 427

Java集合:泛型&Set&数据结构详解

本文介绍了Java集合框架中的泛型、Set集合及其实现类TreeSet和HashSet。泛型提供了编译时类型安全检查,Set集合具有无序、不重复的特点。TreeSet通过自然排序(Comparable)或比较器排序(Comparator)实现元素排序,底层采用红黑树结构。HashSet基于哈希表实现,依赖hashCode()和equals()方法保证元素唯一性。文章详细讲解了各种数据结构的特性(二叉树、二叉查找树、平衡二叉树)和集合的使用方法,包括对象排序规则、哈希值计算原理等核心概念,并提供了完整的代码示

2301_79949064的博客 1328

Java集合框架与泛型应用深度解析

集合框架是Java语言中处理数据集合的核心架构,包含List、Set、Queue三大接口体系。其底层通过动态数组、链表、哈希表等数据结构实现,不同实现类在随机访问、插入删除等操作上具有显著性能差异。泛型技术通过在编译时进行类型检查,有效提升代码安全性并减少类型转换操作。在实际工程中,合理选择ArrayList、LinkedList或HashMap等集合类型,结合泛型约束,能够显著提升程序执行效率和健壮性。特别是在高并发场景下,ConcurrentHashMap等并发集合与Stream API的结合使用,已成

weixin_33985679的博客 408

说几个常见的语法糖

前面介绍了 9 种 Java 中常用的语法糖。所谓语法糖就是提供给开发人员便于开发的一种语法而已。但是这种语法只有开发人员认识。想要被执行,需要进行解糖,即转成 JVM 认识的语法。当我们把语法糖解糖之后,你就会发现其实我们日常使用的这些方便的语法,其实都是一些其他更简单的语法构成的。有了这些语法糖,我们在日常开发的时候可以大大提升效率,但是同时也要避免过度使用。使用之前最好了解下原理,避免掉坑。

smile_tianya的博客 516

Java 10 大装 B 写法,看完可以出去吹牛逼了!(1)

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

m0_72758098的博客 656

Java类型参数深度解析:从编译安全到2026年Valhalla新特性

本文深入解析Java类型参数的核心价值与演进趋势。通过对比非泛型时代的Object容器与现代泛型实现,揭示了类型参数在编译时类型安全、代码可读性和消除强制转型方面的优势。文章涵盖Java 7菱形语法到2026年Valhalla项目的新特性演进,包括编译期类型检查机制、泛型命名规范的实际应用,以及类型推断的语法简化。最后提供重构后的实战代码示例,帮助开发者规避常见陷阱,掌握类型参数的最佳实践。

专注于跨端开发实战,分享从工程搭建到应用落地的全流程技术干货,助力开发者快速掌握跨平台开发核心能力,打造稳定、高效的应用。 593

第一课:初识Java虚拟机

1.有哪些虚拟机 VMWARE Visual Box JVM 现实当中不存在的计算机 2.jdk历史 2004年发布了 jdk.5 泛型、注解、装箱、枚举、可变长的参数、foreach、精准循环 11年jdk7 Gc当中的G1 14年jdk1.8 lambda表达式:函数式表达的方式。试图减少代码冗余 语法增强 jaba类型注解 3.使用最广泛地jvm是hotspot 另一款是JRockit VM...

yanzhuang521967的博客 270

Java集合

Java集合

s0cket的博客 264
上一篇: 8、Java 集合框架体系深入详解
下一篇: 10、Java 基础 I/O 类库详解
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值