当前位置: 首页 > news >正文

java学习--day24(单例模式序列化Lambda表达式)

文章目录

      • 回顾
      • 今天的内容
      • 1.单例模式
      • 2.序列化
      • 3.Lambda表达式
        • 3.1入门案例
        • 3.2lambda表达式语法格式
          • 3.2.1无参无返回值的形式
          • 3.2.2有参无返返回值的方法
          • 3.2.3无参有返回值
          • 3.2.4有参有返回值的

回顾

1.三种创建Class对象的形式Class.forName("")类.class对象.getCalss()字节文件.class对象
2.Class下面获取构造方法对象的方法getConstructors();getDeclaredConstructors();getConstructor(Class  ..... parameterType);getDeclaredConstructor(Class  ..... parameterType);
3.Class下面获取方法对象的方法getMethods();getDeclaredMethods();getMethod(String name, Class .... parameterType);getDeclaredMethod(String name, Class .... parameterType);
4.Class下面获取属性对象的方法getFields();getDeclaredFields();getField(String name);getDeclaredField(String name);
5.Constructor对象下面的方法newInstance(); 通过构造方法创建了实例对象setAccessible(true);
6.Method对象下面的方法setAccessible(true);invoke(Object  obj, Object ... param);
7.Field对象下面的方法setAccessible(true);set(Object obj, Object value);
8.简单聊聊对反射的理解

今天的内容

1.单例模式

2.序列化操作(IO流)

以下两个是jdk的新特性:

3.lambda表达式

4.Stream流

1.单例模式

Java提供了二十多种设计模式,在咱们教学过程中抽重要的学习,开发中用的

模式并不是一朝一夕学会的东西,工厂模式, 代理模式 策略模式等

设计模式是全球公认的。为了让咱们的代码变得更加简洁,效率更高,产生出来的模式

修改的时候更加方便

单例模式:

​ 要求在整个程序运行过程中,只出现一个实例对象。减少内存的消耗

​ 如何判断两个对象或者多个对象是否是单例,看内存地址。如果内存地址相等的话,绝对是同一个对象。

想一些问题:

​ 创建对象 通过关键字 new 来创建,但是new一次 再new一次对象的内存地址绝对不一样的。就意味着你必须将一个类的构造方法私有化

package com.qfedu.f_singleinstance;class SingDog {private static  SingDog singDog = null;private SingDog () {}public  static SingDog getInstance() {synchronized (SingDog.class) {if (singDog == null) {//singDog = new SingDog();}}return singDog;}}
class MyThread1 implements Runnable {@Overridepublic void run() {SingDog instance = SingDog.getInstance();System.out.println(instance);}
}
class MyThread2 implements Runnable {@Overridepublic void run() {SingDog instance = SingDog.getInstance();System.out.println(instance);}
}public class Demo1 {public static void main(String[] args) {//以上两个对象是两个不同的对象。单例模式的目的//是只能有一个对象,不能有多个对象,就意味着不能再new//为啥?new一个就是对象。不能new 在类里面咋写?//解决方案: 私有话构造方法//不能new  想得到对象? 在类中定义一个静态方法//为啥是静态方法  只能用来调用
//        SingDog singdog = SingDog.getInstance();
//
//        System.out.println(singdog);
//        SingDog singdog1 = SingDog.getInstance();
//        System.out.println(singdog1);new Thread(new MyThread1()).start();new Thread(new MyThread2()).start();}
}

懒汉式的写法

package com.qfedu.a_single;//懒汉式写法
class Person {private static Person person;private Person () {}public static synchronized Person getInstance ()  {if  (person == null) {person = new Person();}return person;}
}

饿汉式写法

package com.qfedu.a_single;class Cat {private static final Cat cat = new Cat();private Cat() {}public static Cat getIntance () {return cat;}
}
public class Demo3 {public static void main(String[] args) {Cat intance = Cat.getIntance();Cat intance1 = Cat.getIntance();System.out.println(intance);System.out.println(intance1);}}

懒汉式:线程不安全

饿汉式:线程安全的

效率来说: 饿汉式效率高,因为不用加锁

性能来说: 饿汉式类一加载就实力出来对象。但是懒汉式调用方法的时候才进行创建对象

懒汉式的内存消耗是小于饿汉式的

2.序列化

和IO流有关

类 ObjectInputStream(反序列化) 和 ObjectOutputStream(序列化) 是高层次的数据流,它们包含反序列化和序列化对象的方法。

ObjectOutputStream 类包含很多写方法来写各种数据类型,但是一个特别的方法例外:

public final void writeObject(Object x) throws IOException

上面的方法序列化一个对象,并将它发送到输出流。相似的 ObjectInputStream 类包含如下反序列化一个对象的方法:

public final Object readObject() throws IOException, ClassNotFoundException

该方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,你需要将它转换成合适的数据类型。

总结:序列化能干嘛? 将一个类对象信息(构造方法,属性,方法)可以写到本地一个文件中。这叫序列化。从文件中读取一个对象的信息,这叫反序列化。

序列化注意事项:

​ 1.被序列化的实体类必须实现一个接口 Serializable,不然不能被序列化

序列化案例:

将一个对象赋值完以后写到到本地。ObjectOutputStream

package com.qfedu.b_serialize;import java.io.*;
import java.util.ArrayList;public class Demo1 {public static void main(String[] args) throws Exception {//序列化:将对象存到一个文件中Employee employee = new Employee();employee.name = "马斯克";employee.address = "月球";employee.number = 100;employee.mailCheck();//将employee对象进行序列化 存到一个文件中  序列化的文件的后缀都是.serFileOutputStream fos = new FileOutputStream(new File("c:/aaa/emp.ser"));ObjectOutputStream objectOutputStream = new ObjectOutputStream(fos);objectOutputStream.writeObject(employee);objectOutputStream.close();fos.close();System.out.println("写入成功");}
}

反序列化

将本地的文件信息(被序列化过的)写到一个对象中

ObjectInputStream

package com.qfedu.b_serialize;import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;public class Demo2 {public static void main(String[] args) throws Exception{//进行反序列化FileInputStream fis = new FileInputStream(new File("c:/aaa/emp1.ser"));ObjectInputStream ois = new ObjectInputStream(fis);Employee emp = (Employee)ois.readObject();System.out.println(emp.name);System.out.println(emp.number);System.out.println(emp.address);System.out.println(emp.sb);emp.mailCheck();}
}

总结:序列化将对象的值存到本地磁盘的文件中以作备份。反序列化可以将本次磁盘序列化过的文件读取到实体类的对象中。

3.Lambda表达式

Lambda表达式被称称为闭包。他是推动了Java8新特性的重要的一步。

Lambda表达式运行函数式编程。就是简化代码的。变得更加简洁,但是可读性特别差

3.1入门案例
package com.qfedu.c_lambda;public class Demo1 {public static void main(String[] args) {//新建一个线程//第一种的创建方式new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("简洁嘻嘻哒" + i);}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("锤人" + i);}}}).start();//Thread构造方法是接口对象Runnable runnable = ()-> System.out.println("嘻嘻");new Thread(runnable).start();}
}
3.2lambda表达式语法格式

只看接口下面的唯一的一个抽象方法。

接口  接口对象 =  ()->表达式;  无参 无返回值的
接口  接口对象 =  (parameter)->表达式;  有参  无返回值的
接口  接口对象 = ()->{表达式;};   无参 有返回值的
接口  接口对象 = (parameter)->{表达式;};  有参有返回值
3.2.1无参无返回值的形式
package com.qfedu.c_lambda;interface Computer {void coding();
}
public class Demo4 {public static void main(String[] args) {//无参无返回值的test(() -> System.out.println("敲代码"));}//而如果一个方法的参数是一个接口对象的话,难免要new 这个接口 重写方法public static void test (Computer c) {c.coding();}
}
3.2.2有参无返返回值的方法
package com.qfedu.c_lambda;interface C {void eat(String name, int a);
}
public class Demo5 {public static void main(String[] args) {test(( name,  a) -> System.out.println(name + "吃" + a) , "狗蛋", 4);}public static void test (C c, String name, int a) {c.eat(name , a);}
}
3.2.3无参有返回值
package com.qfedu.c_lambda;interface D {int num();
}
public class Demo6 {public static void main(String[] args) {test(() ->{if (true) {System.out.println("xixida");}return 500;});}public static void test (D d) {d.num();}
}
3.2.4有参有返回值的
package com.qfedu.c_lambda;interface E {int add(int a, int b);
}
public class Demo7 {public static void main(String[] args) {test((a, b) -> a + b, 2, 3);}public static void test (E e, int a, int b) {int sum = e.add(a, b);System.out.println(sum);}
}

相关文章:

java学习--day24(单例模式序列化Lambda表达式)

文章目录 回顾今天的内容1.单例模式2.序列化3.Lambda表达式3.1入门案例3.2lambda表达式语法格式3.2.1无参无返回值的形式3.2.2有参无返返回值的方法3.2.3无参有返回值3.2.4有参有返回值的 回顾 1.三种创建Class对象的形式Class.forName("")类.class对象.getCalss()字…...

从0开始学go第六天

方法一&#xff1a;gin获取querystring参数 package main//querystring import ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/web", func(c *gin.Context) {//获取浏览器那边发请求携带的query String参数//…...

unity设计模式——代理模式

Subject类&#xff0c;定义了Real Subject和Proxy的共用接口&#xff0c;这样就在任何使用Real Subject的地方都可以使用Proxy。 abstract class Subject : MonoBehaviour {public abstract void Request(); } RealSubject类&#xff0c;定义Proxy所代表的真实实体。 class R…...

SpringBoot 如何使用 Grafana 进行可视化监控

使用Spring Boot Sleuth进行分布式跟踪 在现代分布式应用程序中&#xff0c;跟踪请求和了解应用程序的性能是至关重要的。Spring Boot Sleuth是一个分布式跟踪解决方案&#xff0c;它可以帮助您在分布式系统中跟踪请求并分析性能问题。本文将介绍如何在Spring Boot应用程序中使…...

【Codeforces】 CF1762E Tree Sum

题目链接 CF方向 Luogu方向 题目解法 首先考虑 n n n 为奇数的情况无解&#xff0c;这个可以通过乘积矛盾简单证明 接下来考虑一个结论是&#xff1a;偶数个点的树的形态确定之后&#xff0c;只有恰好 1 1 1 种染色方案&#xff0c;即从叶子一层一层往上面染&#xff0c;…...

用《斗破苍穹》的视角打开C#委托2 委托链 / 泛型委托 / GetInvocationList

委托链 经过不懈地努力&#xff0c;我终于成为了斗师&#xff0c;并成功掌握了两种斗技——八极崩和焰分噬浪尺。于是&#xff0c;我琢磨着&#xff0c;能不能搞一套连招&#xff0c;直接把对方带走。 using System; using System.Collections.Generic; using System.Linq; u…...

唐老师讲电赛

dc-dc电源布局要点...

[ICCV-23] DeformToon3D: Deformable Neural Radiance Fields for 3D Toonification

pdf | code 将3D人脸风格化问题拆分为几何风格化与纹理风格化。提出StyleField&#xff0c;学习以风格/ID为控制信号的几何形变残差&#xff0c;实现几何风格化。通过对超分网络引入AdaIN&#xff0c;实现纹理风格化。由于没有修改3D GAN空间&#xff0c;因此可以便捷实现Edit…...

配置Hive使用Spark执行引擎

配置Hive使用Spark执行引擎 Hive引擎概述兼容问题安装SparkSpark配置Hive配置HDFS上传Spark的jar包执行测试速度对比 Hive引擎 概述 在Hive中&#xff0c;可以通过配置来指定使用不同的执行引擎。Hive执行引擎包括&#xff1a;默认MR、tez、spark MapReduce引擎&#xff1a; 早…...

基于FPGA的视频接口之千兆网口(五应用)

简介 相信网络上对于FPGA驱动网口的开发板、博客、论坛数不胜数,为何博主需要重新手敲一遍呢,而不是做一个文抄君呢!因为目前博主感觉网络上描述的多为应用层上的开发,非从底层开始说明,本博主的思虑还是按照老规矩,按照硬件、底层、应用等关系,使用三~四篇文章,来详细…...

车载开发所学内容,有哪些?程序员的转岗位需求

一、高速发展的行业前景 随着全球智能汽车市场的飞速发展&#xff0c;车载开发行业的前景可谓一片光明。各国政府对于自动驾驶和智能交通系统的政策支持&#xff0c;为行业带来了前所未有的机遇。此外&#xff0c;人工智能、大数据、云计算等前沿技术的不断突破&#xff0c;为…...

VSCode Intellij IDEA CE 数据库连接

VSCode & Intellij IDEA CE 数据库连接 大概记一下现在正在用的几个工具/插件 VSCode VSCode 里面的工具我下载了很多&#xff0c;如果只是链接 MySQL 的话&#xff0c;可能用 Jun Han 这位大佬的 MySQL 就好了&#xff1a; 使用这个插件直接打开 .sql 文件单击运行就能…...

直流无刷电机开发应用

下面的链接是笔者在研究无刷电机的过程中&#xff0c;找到的业内无刷电机驱动龙头企业&#xff0c;峰岹科技的各类无刷电机应用设计参考&#xff0c;比较有学习和借鉴意义。 应用手册 - 峰岹科技...

c 语言基础题目:PTA L1-030 一帮一

“一帮一学习小组”是中小学中常见的学习组织方式&#xff0c;老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作&#xff0c;即在得到全班学生的排名后&#xff0c;在当前尚未分组的学生中&#xff0c;将名次最靠前的学…...

网工内推 | base郑州,上市公司,最高15薪,五险一金全额缴

01 四方达 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责公司数据中心&#xff08;机房&#xff09;的管理与运维工作。 2、负责公司服务器、路由器、防火墙、交换机等设备的管理、以及网络平台的运行监控和维护&#xff1b; 3、负责公司服务器运维管理工作、…...

求后缀表达式的值

后缀表达式的值 【题目描述】 从键盘读入一个后缀表达式&#xff08;字符串&#xff09;&#xff0c;只含有0-9组成的运算数及加&#xff08;&#xff09;、减&#xff08;—&#xff09;、乘&#xff08;*&#xff09;、除&#xff08;/&#xff09;四种运算符。每个运算数之间…...

【FISCO-BCOS】十七、角色的权限控制

目录 一、角色定义 二、账户权限控制 1.委员新增、撤销与查询 2.委员权重修改 3.委员投票生效阈值修改 4. 运维新增、撤销与查询 一、角色定义 分为治理方、运维方、监管方和业务方。考虑到权责分离&#xff0c;治理方、运维方和开发方权责分离&#xff0c;角色互斥。 治理…...

vue怎样封装接口

Vue可以使用axios来发送HTTP请求&#xff0c;通过封装axios可以实现接口的统一管理和调用。下面是一个简单的封装接口的示例。 安装axios 在项目中安装axios依赖&#xff0c;可以使用npm或者yarn命令进行安装。 npm install axios --save创建api.js文件 在项目中创建一个ap…...

Typescript 笔记:函数

1 函数定义 function function_name() {// 执行代码 }2 函数返回值 function function_name():return_type { // 语句return value; } return_type 是返回值的类型。 return 关键词后跟着要返回的结果。 返回值的类型需要与函数定义的返回类型(return_type)一致。 3 函数…...

Axios 封装

请注意以下文件夹: utils下的setToken.js 是token封装(封装 Token-CSDN博客),service.js 是axios封装。 Axios封装: 1.安装axios 在项目终端下 输入: npm install axios --save 2.在main.js全局引入axios import axios from axiosVue.prototype.$axios =axios //挂…...

Scrapy-Redis队列实现原理深度解析:优先级队列、列表与集合操作的终极指南

Scrapy-Redis队列实现原理深度解析&#xff1a;优先级队列、列表与集合操作的终极指南 【免费下载链接】scrapy-redis Redis-based components for Scrapy. 项目地址: https://gitcode.com/gh_mirrors/sc/scrapy-redis Scrapy-Redis 是一个基于 Redis 的 Scrapy 组件库&…...

英语节日庆祝口语

一、春节 (Chinese New Year / Spring Festival) 1. 春节祝福 中文英文春节快乐&#xff01;Happy Chinese New Year! / Happy Spring Festival!新年快乐&#xff01;Happy New Year!恭喜发财&#xff01;Wishing you prosperity! / Gong Xi Fa Cai!万事如意&#xff01;May …...

EasyAnimateV5中文模型快速部署:Docker Compose一键拉起全栈服务

EasyAnimateV5中文模型快速部署&#xff1a;Docker Compose一键拉起全栈服务 1. 开篇&#xff1a;让图片动起来的AI魔法 你有没有想过&#xff0c;一张静态的照片能在几秒钟内变成生动的视频&#xff1f;现在&#xff0c;这个想法已经变成了现实。EasyAnimateV5中文模型就是这…...

CRNN OCR文字识别镜像:开箱即用,轻松集成到你的项目中

CRNN OCR文字识别镜像&#xff1a;开箱即用&#xff0c;轻松集成到你的项目中 1. 项目概述 在现代数字化场景中&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术已成为从图像中提取文本信息的关键工具。本镜像基于工业级CRNN&#xff08;卷积循环神经网络&#xff0…...

10天掌握Python编程(附20节实战视频),网盘资源速领

1. 为什么选择Python作为编程入门首选&#xff1f; 如果你正在寻找一门适合零基础学习的编程语言&#xff0c;Python绝对是你的不二之选。作为一门解释型高级语言&#xff0c;Python以其简洁优雅的语法和强大丰富的生态圈闻名。我十年前刚开始接触编程时&#xff0c;就是从Pyth…...

Reset Windows Update Tool终极指南:3步快速修复Windows更新所有问题

Reset Windows Update Tool终极指南&#xff1a;3步快速修复Windows更新所有问题 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …...

高效实用的Notepad2文本编辑器:从入门到精通的全方位指南

高效实用的Notepad2文本编辑器&#xff1a;从入门到精通的全方位指南 【免费下载链接】notepad2 Notepad2-zufuliu is a light-weight Scintilla based text editor for Windows with syntax highlighting, code folding, auto-completion and API list for many programming l…...

OpenClaw多模型对比:ollama-QwQ-32B与云端API在自动化任务中的表现

OpenClaw多模型对比&#xff1a;ollama-QwQ-32B与云端API在自动化任务中的表现 1. 测试背景与实验设计 去年冬天&#xff0c;当我第一次尝试用OpenClaw自动化处理堆积如月的合同文件时&#xff0c;面对本地部署和云端API两种选择&#xff0c;陷入了典型的"技术选择困难症…...

探索SillyTavern角色卡片系统:从数据封装到沉浸式互动的技术解析

探索SillyTavern角色卡片系统&#xff1a;从数据封装到沉浸式互动的技术解析 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 核心价值&#xff1a;重新定义AI角色的数字存在形式 当我们与…...

跨平台OCR新利器:PP-OCRv5模型转ONNX实战指南,轻松应对多语言识别挑战

1. 为什么需要跨平台OCR解决方案 在日常工作和生活中&#xff0c;我们经常会遇到需要处理多语言文档的场景。比如收到一份包含中文、英文和日文的合同&#xff0c;或者需要从产品包装上识别不同语言的说明文字。传统OCR方案往往需要针对不同语言训练多个模型&#xff0c;不仅部…...