一文带你读懂JDK源码:Lambda表达式

深入JDK源码探索Java语言Lambda具体实现 当我刚刚开始学习Java的Lambda的时候,我曾经完全误解了它的实现方式,并且前段时间发现居然有些朋友和当时的我一样。 比如下面这个例子: class Foobar { Runnable foobar() { return () -> {}; } } 在最初的时候,我猜想它也许会像这样实现: class Foobar { Runnable foobar() { return new Runnable() { @Over 阅读详情

点击上方 蓝字 关注我们

Lambda和Stream是Jdk1.8中引入的两个重要特性。

Lambda是函数式编程,可以将匿名方法像参数一样传递,本章节将从4个方面来介绍lambda:Lambda基础语法、Lambda表达式的应用层面、Lambda的字节码源码 以及 优缺点性能。

开讲前,我们先回顾下JVM的内存管理结构,这节我们会涉及到方法区:

  • 程序计数器(Program Counter Register):当前线程执行的字节码指示器

  • Java虚拟机栈(Java Virtual Machine Stacks):Java方法执行的内存模型,每个方法会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

  • 本地方法栈(Native Method Stack):(虚拟机使用到的)本地方法执行的内存模型。

  • Java堆(Java Heap):虚拟机启动时创建的内存区域,唯一目的是存放对象实例,处于逻辑连续但物理不连续内存空间中。

  • 方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

  • 运行时常量池(Runtime Constant Pool):方法区的一部分,存放编译器生成的各种字面值和符号引用。

另外补充常量池的项目类型知识:

序号常量池信息备注
1CONSTANT_InvokeDynamic_Info标识一个动态方法调用点
2CONSTANT_NameAndType_Info标识字段或方法的部分符合引用

另外补充字节码指令:invokedynamic指令

在Class文件中,方法调用即是对常量池(ConstantPool)属性表中的一个符号引用,在类加载的解析期或者运行时才能确定直接引用。invokestatic 主要用于调用static关键字标记的静态方法 invokespecial 主要用于调用私有方法,构造器,父类方法。

invokevirtual 虚方法,不确定调用那一个实现类,比如Java中的重写的方法调用。例子可以参考:从字节码指令看重写在JVM中的实现 invokeinterface 接口方法,运行时才能确定实现接口的对象,也就是运行时确定方法的直接引用,而不是解析期间。

Lambda 是什么?

Lambda的定义:

Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。

Lambda 表达式可以表示闭包(注意和数学传统意义上的不同)。

java对Lambda的语法定义如下:

(parameters) -> expression

或

(parameters) ->{ statements; }

因为lambda本质是一个匿名函数,那么跟普通的函数方法就肯定有共同点了:入参&方法体&返回值。

以下是lambda表达式的重要特征:

序号描述
1可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
2可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
3可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
4可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

以参考下面的Lambda使用例子1:

  • 我们定义了以下的lambda接口

  //无参但是有返回值
  @FunctionalInterface
  interface testNoArgButReturnVal {
    int testNoArgButReturnVal();
  }
  //一个参数,有返回值
  @FunctionalInterface
  interface testArgWithReturnVal {
    int testArgWithReturnVal(String message);
  }
  //两个参数,有返回值
  @FunctionalInterface
  interface testArgsWithReturnVal {
    int testArgsWithReturnVal(String message, Integer value);
  }
  //两个参数,无返回值
  @FunctionalInterface
  interface testArgsWithNoReturnVal {
    void testArgsWithNoReturnVal(String message, Integer value);
  }
  • lambda表达式实现

    //无参但是有返回值
    testNoArgButReturnVal testNoArgButReturnVal = ()->1;
    testNoArgButReturnVal testNoArgButReturnVal2 = ()->{return 1;};


    //一个参数,有返回值
    testArgWithReturnVal testArgWithReturnVal = (String a) -> {return 1;};
    testArgWithReturnVal testArgWithReturnVal2 = (a) -> {return 1;};
    testArgWithReturnVal testArgWithReturnVal3 = a -> {return 1;};
    testArgWithReturnVal testArgWithReturnVal4 = a -> 1;


    //两个参数,有返回值
    testArgsWithReturnVal testArgsWithReturnVal = (String a, Integer b) -> {return 1;};
    testArgsWithReturnVal testArgsWithReturnVal2 = (a, b) -> {return 1;};
    testArgsWithReturnVal testArgsWithReturnVal3 = (a, b) -> 1;


    //两个参数,无返回值
    testArgsWithNoReturnVal testArgsWithNoReturnVal = (String a, Integer b) -> {};
    testArgsWithNoReturnVal testArgsWithNoReturnVal2 = (String a, Integer b) -> {System.out.println("a = " + a + ", b = " + b);};

当然,如果觉得这种灵活的编程不太适应,那么可以用最保险的办法,那就是始终用()圈住入参,用{}圈住实现体。

Lambda 注解应用

下面我们讲解:Lambda的注解与应用例子。

每个lambda声明接口,都用到了 @FunctionalInterface,这便是jdk8引入的Lambda注解了(实际上jdk8没要求必须显式声明该注解)。

 @FunctionalInterface 注解 

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

举例子2:lambda 应用实例

/**
 * <p>
 *     Java 8 中采用函数式接口作为Lambda 表达式的目标类型。
 *     函数式接口(Functional Interface)是一个有且仅有一个抽象方法声明的接口。
 *     任意只包含一个抽象方法的接口,我们都可以用来做成Lambda表达式。
 *     每个与之对应的lambda表达式必须要与抽象方法的声明相匹配。
 * </p>
 */
//自定义函数式接口时,应当在接口前加上@FunctionalInterface标注(虽然不加也不会有错误)。
//编译器会注意到这个标注,如果你的接口中定义了第二个抽象方法的话,编译器会抛出异常。
@FunctionalInterface
public interface MyFunction {
  /**
   *  函数式接口中只能有一个抽象方法(这里不包括与Object的方法重名的方法)
   *  接口中唯一抽象方法的命名并不重要,因为函数式接口就是对某一行为进行抽象,主要目的就是支持 Lambda 表达式
   */
  String print(String s);


  //Error,如果你的接口中定义了第二个抽象方法的话,编译器会抛出异常。
//  String print2(String s);
}

通过例子2,可以知道这个@FunctionalInterface 注解有以下特点:

  • 该注解只能标记在”有且仅有一个抽象方法”的接口上。

  • JDK8接口中的静态方法和默认方法,都不算是抽象方法。

  • 接口默认继承Java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。

  • 该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。

Lambda 字节码源码

下面我们讲解:Lambda的 class 字节码源码,从编译角度彻底理解lambda的实现。

(实际上,lambda在应用层面会这么方便,是因为编译器在底层做了大量的工作,我们可以一窥究竟。)

举例子3:

我们基于例子2的MyFunction lambda声明接口,写了 LambdaSourceTestCase 用例:

public class LambdaSourceTestCase {
  public static void main(String[] args) {
    String a = "a"; //定义局部变量
    MyFunction myFunction = (s)-> {return s;}; //定义匿名函数实现
    myFunction.print(a); //调用lambda
  }
}

编译与查看虚拟机运行时信息指令:

javac -encoding utf8 LambdaSourceTestCase.java MyFunction.java
javap -verbose LambdaSourceTestCase.class

下面我们通过3个步骤,来分析lambda的字节码源码。

1、在主体方法里,我们找到lambda表达式 匹配的 invokedynamic 指令。

2、根据invokedynamic指令的偏移量,定位到#0:#23 分别指向的bootstrap属性表 & 常量池信息。

2.1 常量池信息(Constant Pool)

2.2 BootstrapMethods 属性表

3、字节码分析:

最后的最后,是一个类的静态方法:

LambdaMetafactory.metafactory()方法。

invokestatic java/lang/invoke/LambdaMetafactory.metafactory:
(Ljava/lang/invoke/MethodHandles$Lookup;
Ljava/lang/String;
Ljava/lang/invoke/MethodType;
Ljava/lang/invoke/MethodType;
Ljava/lang/invoke/MethodHandle;
Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

总结归纳:

lambda表达式对应一个incokedynamic 指令,通过指令在常量池的符号引用,可以得到BootstrapMethods 属性表对应的引导方法。

在运行时,JVM会通过调用这个引导方法生成一个含有MethodHandle(CallSite的target属性)对象的CallSite作为一个Lambda的回调点。Lambda的表达式信息在JVM中通过字节码生成技术转换成一个内部类,这个内部类被绑定到MethodHandle对象中。每次执行lambda的时候,都会找到表达式对应的回调点CallSite执行。一个CallSite可以被多次执行(在多次调用的时候)。

在多次调用的时候,只会有一个invokedynamic指令,在comparator调用comparator.compare或comparator.reversed方法时,都会通过CallSite找到其内部的MethodHandle,并通过MethodHandle调用Lambda的内部表示形式LambdaForm。

Lambda 优势与劣势

总而言之,函数式编程是技术的发展方向,而Lambda是函数式编程最基础的内容,所以Java 8中加入Lambda表达式本身是符合技术发展方向的。

优点: 

1、代码更加简洁,效率高;

2、减少匿名内部类的创建,节省资源(Lambda的性能表现,在多数情况也比匿名内部类好,性能方面可以参考一下Oracle的Sergey Kuksenko发布的 Lambda 性能报告);

缺点:

1、不熟悉Lambda表达式的语法的人,不太容易看得懂; 

2、虽然代码更加简洁,但可读性差,不利于维护;

总结

本文从4个方面介绍了:Lambda基础语法、Lambda表达式的应用层面、Lambda的字节码源码 以及 优缺点性能,希望大家从中能有所收获。

文章参考了以下文章:

https://docs.oracle.com/javase/8/docs/api/java/lang/invoke/LambdaMetafactory.html#metafactory-java.lang.invoke.MethodHandles.Lookup-java.lang.String-java.lang.invoke.MethodType-java.lang.invoke.MethodType-java.lang.invoke.MethodHandle-java.lang.invoke.MethodType-

https://www.cnblogs.com/jixp/articles/10548492.html

https://www.oracle.com/technetwork/java/jvmls2013kuksen-2014088.pdf

往期推荐

《源码系列》

《JDK之Object 类》

《JDK之BigDecimal 类》

《JDK之String 类》

《经典书籍》

《Java并发编程实战:第1章 多线程安全性与风险》

《Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制》

《Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭》

《服务端技术栈》

《Docker 核心设计理念》

《Kafka史上最强原理总结》

《HTTP的前世今生》

《算法系列》

《读懂排序算法(一):冒泡&直接插入&选择比较》

《读懂排序算法(二):希尔排序算法》

《读懂排序算法(三):堆排序算法》

《读懂排序算法(四):归并算法》

《读懂排序算法(五):快速排序算法》

《读懂排序算法(六):二分查找算法》

扫描二维码

获取技术干货

后台技术汇

点个“在看”表示朕

已阅

Java8 Lambda表达式(一)Lambda表达式基础知识 1 Lambda表达式简介 1.1 Lambda表达式是什么 JDK1.8是目前最流行的JDK版本,在这一个版本中引入了Lamda表达式。Lambda表达式可以简化代码,让我们的代码更为优雅,而Lambda表达式之所以“优雅”,是因为使用Lambda表达式可以对接口进行简洁的实现,Lamdba表达式本身就是一个匿名函数。 1.2使用Lambda表达式实现Runnable接口... 阅读详情

相关推荐

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1295

解决Bug:java.lang.NoSuchMethodError

文 |Promise Sun 一、Bug问题描述 在运行项目时报错: java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/..

Promise Sun special column 1656

Zemax单模光纤耦合仿真避坑指南:数值孔径、模式匹配与镀膜影响详解

本文详细解析了Zemax单模光纤耦合仿真中的关键避坑要点,包括数值孔径的多重定义与换算、模式匹配度评估及镀膜影响分析。通过实际案例和技术公式,帮助工程师避免常见仿真误差,提升激光通信和光纤传感系统的设计精度。特别针对OpticStudio用户提供了实用的参数设置建议和优化策略。

weixin_30836759的博客 465

JDK8新特性之Lambda表达式

我们知道使用Lambda表达式的前提是需要有函数式接口,而Lambda表达式使用时不关心接口名,抽象方法名。只关心抽象方法的参数列表和返回值类型。因此为了让我们使用Lambda表达式更加的方便,在JDK中提供了大量常用的函数式接口. 大多数无需自己再定义函数式接口,而可以直接使用jdk内置的函数式接口。Lambda表达式的语法是非常简洁的,但是Lambda表达式不是随便使用的,使用时有几个条件要特别注意。必须覆盖重写抽象的run方法,所有的方法名称,方法参数,方法返回值不得不都重写一遍,而且不能出错,

cch970812的博客 801

52、Power BI Desktop 数据筛选全攻略

本文全面介绍了Power BI Desktop中各类数据筛选功能的使用方法,涵盖布尔型数据筛选、高级文本筛选、Top N筛选、可视化级别、页面级别和报告级别筛选等核心操作。通过详细步骤、流程图和实际案例,帮助用户深入理解筛选器的层级关系与综合应用技巧,并提供常见问题解决方案,助力高效精准的数据分析与可视化展示。

linux6sysadmin的博客 110

第四天 Labview交互也很轻松(4.1 DAQ数据采集)

LabVIEW DAQ数据采集有很大的优势,NI提供了超过5千万条I/O通道,支持多种主流总线(如USB、PCI、PCIe、PXI等),并为所有这些设备提供统一的编程接口,实现软硬件的无缝集成。LabVIEW包含全套范例,覆盖各类应用,用户无需从头创建整个数据采集系统,可以快速启动并执行这些范例程序。所有NI DAQ硬件都采用NI-DAQmx驱动程序,支持多种编程语言,并包含了这些编程语言的示例代码,使得与NI硬件的通信变得更加便捷。

weixin_38637405的博客 2617

Java Lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 语法 lambda 表达式的语法格式如下: (parameters) -> expression 或 (parameters) ->{ statements; } 以下是lam...

qq_37707826的博客 433

【异常】安装hermes-agent时提示GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Git克隆仓库时出现TLS连接异常报错的解决方案摘要: 当执行git clone命令时遇到"GnuTLS recv error (-110)"报错,通常由网络不稳定、缓冲区不足或证书验证问题导致。主要解决方案包括:1)增大Git HTTP缓冲区(git config --global http.postBuffer 524288000);2)使用GitHub镜像站加速克隆;3)临时禁用SSL验证进行测试;4)检查并调整代理配置;5)改用SSH协议克隆。建议优先尝试增大缓冲区和镜像站方案,

奶爸的编程之路,也就一周冷个三天 1350

02-JDK新特性-Lambda表达式

Lambda表达式是一个匿名代码块,用于简单的传递一段代码片段。

丨Anna丨的博客 1303

【项目实战】DevOps制品管理之JFrog Artifactory介绍

JFrog Artifactory是一款领先的二进制软件制品仓库管理工具,由JFrog公司开发。

奶爸的编程之路,也就一周冷个三天 1352

Claude Code 100个真实案例 - 用AI搭建GIS地理信息系统(地图标注+热力图)

本案例展示如何使用 Claude Code 从零搭建一个完整的 GIS 地理信息系统。我们将使用 Python + Flask 作为后端,Leaflet.js 作为前端地图引擎,实现地图标注、热力图展示、区域绘制、坐标搜索等功能。全程通过与 Claude Code 对话完成,让你感受 AI 在地理信息领域的强大开发能力。

yueyeguzhuo的专栏 113

JDK1.8新特性之Lambda表达式

一、JDK1.8 新特性 JDK1.8概述: JDK1.8,又称之为Java 8(我习惯叫它为JDK1.8,后续统一叫做JDK1.8),是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布,它支持函数式编程,新的JavaScript引擎,新的日期API,新的Stream API等。 JDK1.8相比1.7之前版本,有以下几方面的优化: Lambda表达式 函数式接口 方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API 二..

weixin_57504000的博客 3437

《UDS协议从入门到精通》系列——图解0x83:访问时间参数

详细介绍UDS协议0x83服务,目标ECU的时序参数设置有哪些注意点?

车载系统攻城狮 2138

从基础到精通,一遍文章读懂 JDK8 Lambda表达式 的使用!

JDK8新特性中最值得学的技术之一:Lambda表达式。而这篇文章,将会较为详细的讲解从我们原来的代码一步一步演变成 Lambda表达式 这样的一个过程。一遍文章,即可读懂 Lambda表达式 的使用!

天怎么不会塌的博客 1055

IDEA的使用指南

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java8 Lambda表达式(二)System.out::println与Lambda表达式

1 System.out::println在哪里出现 在Java中,执行System.out.println("hello world");会在控制台打印“hello world”;而在Java8引入了Lambda表达式这一新特性后,是可能出现System.out::println这样的代码的,比如下面这段代码。 public class TestPrint { pu...

1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

一文轻松理解和读懂Lambda表达式,附源码详细解析

Lamda 表达式非常方便,在项目中一般在 stream 编程中用的比较多。 List<Student> studentList = gen(); Map<String, Student> map = studentList .stream() .collect(Collectors.toMap(Student::getId, a -> a, (a, b) -> a)); 理解一个 Lamda 表达式就三步: 确认 Lamda 表达式的类型 找到要实现

Koikoi12的博客 1130

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JDK8的新特性——Lambda表达式的奇淫技巧

总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

2301_76327109的博客 869

JDK8:Lambda表达式使用介绍,Lambda表达式源码及原理分析

Lambda表达式是Java8中非常重要的一个新特性,其基于函数式编程的思想,支持将代码作为方法参数进行使用。可以把Lambda表达式理解为通过一种更加简洁的方式表示可传递的匿名函数。它本身没有名称,而且不像方法那样属于某一个类,但是可以有参数列表、代码体、返回值。使用了Lambda表达式之后就不需要再去编写匿名类了。

秃了也弱了 1216

彻底搞明白JDK 1.8 Lambda 表达式

Lambda表达式 为什么 背景 Java是面向对象语言,所以java对行为的封装都是基于对象。什么意思,简单说,我们要定义个行为,那么需要一个函数,只有函数就行了吗?在java里面不行,因为java是面向对象的语言, 所以我们需要定义对象,看下面的代码: public interface ActionListener { void actionPerformed(ActionEvent e); } 最早接触过java swing编程的老程序员肯定不陌生,定义一个按钮触发时间,每当时间发生时,

Just Do It! 2404

41JDK1.8新特性【Lambda表达式、函数式接口】

1.lambda表达式(其实就有优化匿名内部类的方案) 注意:使用lambda表达式必须有多态的思想 2.函数式接口 该接口中只有一个抽象方法 @FunctionInterface这个注解表示该接口是函数式接口 经验: 如果你想玩转lambda表达式,必须先去学习匿名内部类+多态 函数式接口应用场景:需求要你写个接口,这个接口只有一个抽象方法,就用函数式接口去代替

gangain的博客 1325

JDK中Lambda表达式的序列化与SerializedLambda的巧妙使用

前提笔者在下班空余时间想以Javassist为核心基于JDBC写一套摒弃反射调用的轻量级的ORM框架,过程中有研读mybatis、tk-mapper、mybatis-plus和spring...

Java笔记虾 1413

JDK8新特性-LAMBDA表达式

前言: JDK8自2018年06月发布已经七年多了,由于国内开发环境有各种的老项目,有各种各样的发布风险,让公司以及项目组对新的技术往往望而却步。现在对jdk8新特性,很多同伴应该多多少少都知道,甚至已经在工作项目中使用。为了更多同伴能学习和掌握JDK8的新特性。我们接下来一起系统性的学习这块新特性。本章节重点讲解LAMBDA表达式的用法。 一、LAMBDA简介 jdk8新增了新语法l...

伴学编程 309

Lambda表达式 怎么debug调试

Lambda 表达式是函数式编程的一种体现,它允许将函数当作参数传递给方法,或者将函数作为返回值,这种支持使得 Java 在函数式编程方面更为灵活,能够更好地处理集合操作、并行计算等任务。

A_aspectJ的博客 2370

Lambda表达式

Lambda表达式基础速成,哔站博主'三更草堂'的课程笔记

bear_309的博客 990

JDK8 之 Lambda 总结

文章目录一. 简介二. 使用效果2.1 未使用 lambda 和 使用 lambda 的区别三. 基本语法四. 函数式接口五.内置四大核心函数式接口5.1 Consumer5.2 Supplier5.3 Function一. 简介 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码 像数据一样进行传递)。可以写出更简洁、更 灵活的代码。作为一种更紧凑...

Carey丶zsh 的博客 1653
上一篇: 一文读懂《Effective Java》第5条:避免创建不必要的对象 & 性能优化
下一篇: 一文带你读懂:设计模式的六大原则
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

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

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

打赏作者

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

抵扣说明:

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

余额充值