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

scala基础

Scala基础

  • scala基础
    • Scala介绍
    • 第一个scala代码
      • object和class的区别
      • 关键区别
      • 伴生类和伴生对象:
    • 字节码解析
        • 在java中创建三个类
      • 反编译代码
      • 编译User.class源码后的结果
      • 编译Emp.class源码后的结果
    • 注释
    • Scala类型推断&至简原则
    • 变量
      • var和val之间的区别
      • 可变变量
      • 不可变变量
    • 标识符
      • 基本规则
      • 特殊符号
    • 数据类型
      • 任意值类型
      • 任意引用类型
      • 不同类型的数据转换
      • 自动(隐式)转换
      • 强制类型转换
    • 循环控制
      • for循环
        • 循环守卫
        • 设置步长
        • 双层for循环
        • 引入变量
        • for循环的返回值
        • java中线程对象有yeild方法,在scala中如何调用
      • while循环
        • 循环中断
    • 流程控制
      • 分支判断
      • 分支控制都是有返回值的
    • 运算符
      • 关系运算符
      • 等号原理说明
      • 加法运算
    • 字符串
      • 拼接方式
    • 输入输出
      • 输入
        • 从控制台获取数据
        • scala获取文件中的数据,需要采用特殊的对象
      • 输出
    • 网络
    • 序列化

scala基础

Scala介绍

Scala是Scalable Language两个单词的缩写,表示可伸缩,是一门完整的计算机编程语言,作者马丁
Scala来自于Java语言
Java语言来自于C语言:跨平台
马丁也是javac的开发作者
Scala是一个完全面向对象的语言
Scala是基于Java语言开发的,所以运行环境也是基于JVM
在这里插入图片描述
Scala是一个面向函数式编程语言,更适合迭代式数据计算

后面的Spark,Fink计算框架底层都是使用Scala进行开发。Kafka也是采用Scala语言开发的。

第一个scala代码

package com.aaa
object HelloWorld01 {// 快捷键  maindef main(args: Array[String]): Unit = {System.out.println("Hello World");println("Hello Scala");}}

解析:

  • package:包,等同于java中的package
  • object: 声明对象(单例)通常用于封装静态方法和常量,不能实例化。
    • scala是一个完全面向对象的语言,但是java中的静态语法不是面向对象的。
  • def:声明方法的关键字。
  • main:Scala语言程序入口
  • main(…)小括号表示方法参数列表,可以有参数,也可以没有参数,由多个参数使用逗号隔开
    • args: Array[String]:方法的参数
    • java=》String[] arg
    • java语言是一个强类型语言,在编译时就需要明确类型,所以类型很重要。开发时,类型并不是那么重要
    • scala=》arg:String[]
    • scala语言是基于java开发的所以也是强类型语言
    • 作者认为参数名称更重要,开发程序时用的多,为了方便记忆使用,所以将名称放在前面,类型放在后面,为了使用方便,将参数名称和参数类型使用冒号分隔开。
  • Array[String]:表示参数类型
    • scala语言是一个完全面向对象的语言,所以数组也是对象,也有自己的类型 scala语言中括号中的String表示泛型
  • def main:Unit
    • scala语言中方法的声明也符合scala的原则
    • 方法名(参数列表):方法类型
    • scala语言是基于java开发,是一个完全面向对象的语言,方法的返回值也是对象,也应该有相应的类型,但是,没有返回值这个事本身也是一个返回,也需要有类型:Unit(void)
  • =:赋值
    • 将代码块逻辑赋值给一个方法名
  • {} :方法体
    • System.out.println(“Hello World”); :java代码,那么java的代码可以在scala代码中直接使用
    • scala也提供了简化的代码操作:println(“Hello World”);
  • 代码没有分号结尾
    • scala语言中认为一行代码最好完成一段逻辑,不要多个逻辑操作在一行完成,会比较乱,如果一行代码就是一段逻辑,那么就不要使用分号进行区分,不写的话,并不代表没有,而是编译时候,会进行补全,如果需要代码多行才能完成逻辑,需要使用分号进行隔开。

注意事项:
scala语言中没有静态语法,java语言中的静态操作在scala中如何使用呢?
scala采用新的关键字object来模拟静态语法,可以通过对象名称.方法/变量实现静态操作。
如果使用object关键字声明一个对象,那么在编译时也会编译出对应的class文件?
object关键字声明的对象类型和当前编译后的class文件的类型不一样,多了一个$,会生成两个class文件

1.HelloWorld01.class
2.HelloWorld01$.class(单例)
HelloWorld01:单例对象名称,同时也是类名

object和class的区别

在 Scala 中,object 和 class 都是定义类型的关键字,但它们有着不同的用途和特性。

  • class:
    • 定义类:class 用来定义类,是面向对象编程中的一个基本概念。类是对象的模板,可以包含属性(字段)和方法(函数)。
    • 实例化:类是模板,只有通过实例化类才能创建一个对象。使用 new 关键字来创建类的实例。
    • 支持继承和多态:class 支持继承、特质、方法覆盖等面向对象的特性。
class Person(val name: String, val age: Int) {def greet(): Unit = {println(s"Hello, my name is $name and I am $age years old.")}
}val person = new Person("Alice", 30)
person.greet()  // 输出:Hello, my name is Alice and I am 30 years old.
  • 特点:
    • 可以实例化。
    • 支持构造器(如上例的 name 和 age)。
    • 可以有成员变量和方法。
    • 支持继承。
  • object
  • 定义单例对象:object 用于定义一个 单例对象,它会自动创建一个类的唯一实例。它是 Scala 中的一个特殊结构,通常用于声明常量、工具类、伴生对象等。
  • 不能实例化:object 不能通过 new 创建实例,因为它本身就是一个类的单一实例。
  • 伴生对象:在 Scala 中,object 通常与 class 配对,称为 伴生对象和 伴生类。伴生对象通常用于封装静态方法和常量。
object MySingleton {val name = "Singleton"def greet(): Unit = {println(s"Hello from $name!")}
}MySingleton.greet()  // 输出:Hello from Singleton!
  • 特点:
    • 只有一个实例。
    • 可以定义方法、字段和常量。
    • 常用于定义工具类、工厂方法等。
    • 常与类(class)搭配使用,作为伴生对象(companion object)。

关键区别

特性classobject
定义内容定义一个类,作为模板定义一个单例对象,只有一个实例
实例化可以实例化多个对象只能有一个实例,不能通过 new 创建
用途用于创建实例化的对象,支持继承、方法、字段等常用于工具类、常量、单例模式等
伴生关系可以与 object 作为伴生类一起使用与 class 作为伴生对象一起使用,封装类的静态方法
实例化方式使用 new 创建实例自动创建单例实例,不能使用 new 创建

伴生类和伴生对象:

在 Scala 中,类和对象常常作为伴生类(companion class)和伴生对象(companion object)成对出现。伴生对象和伴生类可以访问彼此的私有成员,并且它们必须位于同一个源文件中。

class MyClass(val name: String)object MyClass {def apply(name: String): MyClass = new MyClass(name)  // 工厂方法
}val obj = MyClass("Alice")  // 通过伴生对象的 apply 方法创建实例
println(obj.name)  // 输出:Alice

字节码解析

在java中创建三个类
public class Emp {// 被final修饰public static final int age=30;static {System.out.println("emp....");}
}public class User {public static int age=30;static {System.out.println("user....");}
}public class Test {public static void main(String[] args) {System.out.println(User.age);System.out.println(Emp.age);}
}

运行结果

user....
30
30

Emp中的age被final修饰后,没有打印静态代码块中的内容。
这是为什么呢?

反编译代码

通过javap命令来进行反编译代码

/ 进入idea中target中的class文件夹下,打开Termail控制台。
使用命令
javap -v User
javap -v emp

编译User.class源码后的结果

警告: 二进制文件User包含com.test.User
Classfile /Users/lida/private/project/qmtools/out/production/scala/com/test/User.classLast modified 2024-4-24; size 499 bytesMD5 checksum 1d09d609093679118c6e95baffbcedf3Compiled from "User.java"
public class com.test.Userminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #7.#20         // java/lang/Object."<init>":()V#2 = Fieldref           #6.#21         // com/test/User.age:I#3 = Fieldref           #22.#23        // java/lang/System.out:Ljava/io/PrintStream;#4 = String             #24            // user....#5 = Methodref          #25.#26        // java/io/PrintStream.println:(Ljava/lang/String;)V#6 = Class              #27            // com/test/User#7 = Class              #28            // java/lang/Object#8 = Utf8               age#9 = Utf8               I#10 = Utf8               <init>#11 = Utf8               ()V#12 = Utf8               Code#13 = Utf8               LineNumberTable#14 = Utf8               LocalVariableTable#15 = Utf8               this#16 = Utf8               Lcom/test/User;#17 = Utf8               <clinit>#18 = Utf8               SourceFile#19 = Utf8               User.java#20 = NameAndType        #10:#11        // "<init>":()V#21 = NameAndType        #8:#9          // age:I#22 = Class              #29            // java/lang/System#23 = NameAndType        #30:#31        // out:Ljava/io/PrintStream;#24 = Utf8               user....#25 = Class              #32            // java/io/PrintStream#26 = NameAndType        #33:#34        // println:(Ljava/lang/String;)V#27 = Utf8               com/test/User#28 = Utf8               java/lang/Object#29 = Utf8               java/lang/System#30 = Utf8               out#31 = Utf8               Ljava/io/PrintStream;#32 = Utf8               java/io/PrintStream#33 = Utf8               println#34 = Utf8               (Ljava/lang/String;)V
{public static int age;descriptor: Iflags: ACC_PUBLIC, ACC_STATICpublic com.test.User();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 9: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lcom/test/User;static {};descriptor: ()Vflags: ACC_STATICCode:stack=2, locals=0, args_size=00: bipush        302: putstatic     #2                  // Field age:I5: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;8: ldc           #4                  // String user....10: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V13: returnLineNumberTable:line 11: 0line 14: 5line 15: 13
}
SourceFile: "User.java"

这个里面可以清晰的看到,age是在静态代码块中进行复制的。

编译Emp.class源码后的结果

警告: 二进制文件Emp包含com.test.Emp
Classfile /Users/lida/private/project/qmtools/out/production/scala/com/test/Emp.classLast modified 2024-4-24; size 505 bytesMD5 checksum a790a625f63a08555848173ef4d808a6Compiled from "Emp.java"
public class com.test.Empminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #6.#21         // java/lang/Object."<init>":()V#2 = Fieldref           #22.#23        // java/lang/System.out:Ljava/io/PrintStream;#3 = String             #24            // emp....#4 = Methodref          #25.#26        // java/io/PrintStream.println:(Ljava/lang/String;)V#5 = Class              #27            // com/test/Emp#6 = Class              #28            // java/lang/Object#7 = Utf8               age#8 = Utf8               I#9 = Utf8               ConstantValue#10 = Integer            30#11 = Utf8               <init>#12 = Utf8               ()V#13 = Utf8               Code#14 = Utf8               LineNumberTable#15 = Utf8               LocalVariableTable#16 = Utf8               this#17 = Utf8               Lcom/test/Emp;#18 = Utf8               <clinit>#19 = Utf8               SourceFile#20 = Utf8               Emp.java#21 = NameAndType        #11:#12        // "<init>":()V#22 = Class              #29            // java/lang/System#23 = NameAndType        #30:#31        // out:Ljava/io/PrintStream;#24 = Utf8               emp....#25 = Class              #32            // java/io/PrintStream#26 = NameAndType        #33:#34        // println:(Ljava/lang/String;)V#27 = Utf8               com/test/Emp#28 = Utf8               java/lang/Object#29 = Utf8               java/lang/System#30 = Utf8               out#31 = Utf8               Ljava/io/PrintStream;#32 = Utf8               java/io/PrintStream#33 = Utf8               println#34 = Utf8               (Ljava/lang/String;)V
{public static final int age;descriptor: Iflags: ACC_PUBLIC, ACC_STATIC, ACC_FINALConstantValue: int 30public com.test.Emp();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 9: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lcom/test/Emp;static {};descriptor: ()Vflags: ACC_STATICCode:stack=2, locals=0, args_size=00: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc           #3                  // String emp....5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: returnLineNumberTable:line 14: 0line 15: 8
}
SourceFile: "Emp.java"

从Test.class的代码中就可以看到,获取User中的age时,是获取的静态代码中的数据。但是Emp中的age是常量

注释

object Scala01_Desc {def main(args: Array[String]): Unit = {// 注释,说明、描述代码的作用// 单行注释// TODO 注释/*多行注释可以将说明性的内容跨行*//*** 文档注释*/}}

Scala类型推断&至简原则

Scala语言的目的是为了简化代码的开发,让程序更加容易
提出至简原则:能简单就简单,能简洁就简洁,能省则省,这里的能省则省,并不是不写,而是编译器可以帮助我们补充完整
java和scala是一个强类型的语言,那么变量的取值也就确定了。
如果变量的值可以确定,那么变量的类型也就确定了。所以写程序时,类型可以省略,由编译器补充完整。

var name = "lisi";

注意:多态不适用这个至简原则

变量

变量是一种使用方便的占位符,用于饮用计算机内存地址,变量创建后会占用一定的内存空间,基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你可以在这些变量中存储整数、小数或者字母。

  • 声明

变量的类型在变量名之后等号之前声明。
详解:
// scala 中声明变量需要采用特殊的方式
// 1。采用关键字var|val关键字声明
// 2.变量类型放在变量名称后面
// 3。变量名称和类型之间使用冒号分割
// 4。scala中变量必须显示初始化

var name:String="张三";val email:String="zhangsan@111.com";name="李四";
//    email="lisi@111.com"; 

var和val之间的区别

var 关键字修饰的变量,值可以改变,称之为可变变量
val 关键字修饰的变量,值不可以改变,称之为不可变变量
var和val关键字声明的变量,在编译后是没有区别的,但是在编译时会有约束

可变变量

值可以改变的变量,称之为可变变量,但是变量类型无法发生改变,scala中可变变量使用关键字var进行声明

var username:String="lisi"

不可变变量

值一旦初始化后无法改变的变量,称之为不可变变量。Scala中不可变变量使用关键字val进行声明,类似于Java语言中的final关键字。

val username:String="lisi"

val使用的更加频繁一些。

标识符

基本规则

一般情况下,所谓的标识符就是起名
类名、对象名、方法名、参数名

java中的标识符规则:
1.数字、字符、下划线、美元符号
2.数字不能开头
3.长度没有限制
4.不鞥识关键字或者保留子
5.区分大小写
6.可以转换为unicode编码的文件都可以声明为标识符。

scala中的标识符的基本规则和java中识一致的。
如果非要使用和关键字同名的标识符,可以增加使用反引号

val `private`="123";

特殊符号

scala是一个完全面向函数式编程语言,所以可以声明特殊符号作为标识符。

val * ="zhangsan";

使用特殊符号作为Scala标识符,规则不要记,错了改就完了。如果非要记,常用在代码中的符号不要使用:=,{},[],(),‘’,“”
如果采用特殊符号形成特殊文字,标识特殊的含义,称之为颜文字。
因为特殊符号在编译后会被编译器进行转换,所以可以使用

// 在定义的时候两种方式都可以进行定义
val :-> = "zhangsan";
// 编译后的格式
val 
$colon$minus$greater = "zhangsan";

注意:不适用$开头

数据类型

任意值类型

scala与java有着相同的数据类型,但是又有不一样的地方

  • java的数据类型
    • ava的数据类型有基本数据类型和引用类型
      基本数据类型:byte、short、int、long、float、double、char、boolean
      引用类型:Object、数组、字符串、包装类、集合、POJO对象等
  • scala的数据类型
    • scala中没有基本数据类型
      所有的基本数据类型在scala中都有专门的类型
      任意值类型
      任意引用类型

在这里插入图片描述

Unit的返回值是一个()
StringOps是一个和字符串有关联的数据类型

object Scala01_DataType {def main(args: Array[String]): Unit = {println(test())}def test():Unit={}
}

在这里插入图片描述

任意引用类型

所有的java类型,所有的scala类型,scala类型都是引用类型
引用类型的取值为空时,一般会赋值为null,但是null本身也应该有类型NULL,也表示对象

val name:Null=null;

Nothing
一般常用于异常处理

def test1():Nothing={throw new Exception("")}

不同类型的数据转换

val i:Int=10;val a:String="10";println(i)println(a)// 赋值值类型val c:AnyVal=i;// 赋值引用类型val d:AnyRef=a;// 赋值任意类型val f:Any=i;println(c)println(d)println(f)// 不能进行赋值,因为数据类型不正确
//  val j:Int=null;
//  println(j)

自动(隐式)转换

// Byte和Int两个类型之间没有任何的关系,所以不应该能够转换// scala底层对类型进行了转换,所以代码上看不出来,所以称之为隐式(自动)转换val b1:Byte=10;val b2:Int=b1;println(b2)

强制类型转换

// 可以进行显式转换val b1:Byte=10;val b2:Int=b1.toInt;println(b2)

循环控制

for循环

var array = 1 to 5;var array1 = 1 until 5;var array2 = Range(1, 5);for (i: Int <- array) {println(i)}for (i: Int <- array1) {println(i)}for (i: Int <- array2) {println(i)}for (i <- array2) {println(i)}
循环守卫
 var array2 = Range(1, 5);for (i <- array2 if i!=3) {println(i)}
设置步长
var array3 = 1 to 5 by 2;for (i <- array3) {println(i)}for (i <- Range(1,6,2)) {println(i )}
双层for循环
for (i <- 1 to 5; j <- 1 to 5) {println(i + " " + j)}
引入变量
for (i <- 1 to 5) {var j = i - 1;println(i + " " + j)}// 简化for (i <- 1 to 5; j = i - 1) {println(i + " " + j)}
for循环的返回值

如果想要将集合中的数据进行处理后返回,可以采用特殊的关键字:yield

var result=for(i<-1 to 5) yield{i*2}println(result);
java中线程对象有yeild方法,在scala中如何调用
Thread.`yield`()

while循环

 while (true){println("*")}
循环中断

scala中没有break,continue

import scala.util.control.Breaks
import scala.util.control.Breaks._Breaks.breakable {for (i <- 1 to 5) {if (i == 3) {Breaks.break()}println("i=" + i)}}breakable {for (i <- 1 to 5) {if (i == 3) {break()}println("i=" + i)}}println("结束")

流程控制

分支判断

  • 1.if可以独立使用,称为单分支
val age=30;if(age==30){println("年龄等于30")}
  • 2.if可以和else联合使用,称为双分支
val age=3;if(age==30){println("年龄等于30")}else{println("年龄不等于30")}
  • 3.与elseif,else联合使用,称为多分支
val age=40;if(age==30){println("年龄等于30")}else if(age>30){println("年龄大于30")}else{println("年龄不等于30")}

分支控制都是有返回值的

// 这里的返回结果其实就是满足条件后的最后一行代码的执行结果// 返回结果是所有结果的通用类型val result=if(age==30){println("年龄等于30");"壮年";}println(result)

注意:scala中没有三元运算符,也没有switch语法

运算符

关系运算符

  • 双等号

scala 中的双等号可以理解为非空的equals操作。
比较内存地址值 使用eq方法

 val name1=new String("123");
//    val name1=null;val name2=new String("123");println(name1==name2)println(name1.equals(name2))// 比较内存地址值println(name1 eq name2 )

等号原理说明

在java中使用++运算(使用临时变量将值进行暂存)有歧义,容易理解错误,所以在scala中没有这样的语法,所以采用+=的方式来进行替代。

加法运算

    var r=1.+(1);var r1=1+1+2;println(r)println(r1)

字符串

scala中没有字符串,使用的是java中的字符串,它本身没有字符串
在这里插入图片描述

拼接方式

    // + 拼接println("name="+name1);// 传值字符串拼接printf("name=%s\n",name1);// 插值字符串拼接println(s"name=${name1}");// 多行字符串  |顶格字符串// 常用于json和sql字符串println("""|hello|scala|""".stripMargin);println("""#hello#scala#""".stripMargin('#'));

输入输出

输入

从控制台获取数据
val age:Int = scala.io.StdIn.readInt()println(age);

在控制台输入完成后,需要进行回车

scala获取文件中的数据,需要采用特殊的对象
val source:BufferedSource = Source.fromFile("");val iter = source.getLines()while (iter.hasNext){println(iter.next())}source.close();

输出

scala中没有输出,采用的是java中的输出

val writer = new PrintWriter("")writer.println("test")writer.println("scala")writer.flush()writer.close()

网络

Scala中进行网络交互,也是采用的java中的

  • server端代码
object Scala03_Net_Server {def main(array: Array[String]):Unit={val server = new ServerSocket(9999)println("服务器启动成功,等待客户端的链接。。。")val client = server.accept()val stream = client.getInputStreamval i = stream.read()println(i)stream.close()client.close()server.close()}
}
  • client端代码
object Scala03_Net_Client {def main(array: Array[String]):Unit={// 创建服务器val socket = new Socket("localhost",9999)println("链接成功,向服务器发送数据")val stream = socket.getOutputStreamstream.write(100)stream.close()println("向服务器发送给数据,100")socket.close();}
}

序列化

网络中传输的是256之间的ASCALL码,也可以理解为就是传输的数字
在这里插入图片描述

可以在网络中传输字节码,可以将对象转换为字节码,这个叫做序列化。
将字节码转换为对象,称之为反序列化

相关文章:

scala基础

Scala基础 scala基础Scala介绍第一个scala代码object和class的区别关键区别伴生类和伴生对象&#xff1a; 字节码解析在java中创建三个类 反编译代码编译User.class源码后的结果编译Emp.class源码后的结果 注释Scala类型推断&至简原则变量var和val之间的区别可变变量不可变…...

Linux中的查看命令

路径分为相对路径&#xff08;行相对当前工作目录开始的路径&#xff09;和绝对路径&#xff08;不管是&#xff09;#&#xff1a;命令提示符&#xff0c;从这个位置可以开始输入命令&#xff0c;另一个提示符为$&#xff0c;如果是root&#xff0c;则提示为#&#xff1b;如果是…...

深入了解 NAT 模式:网络地址转换的奥秘

深入了解 NAT 模式&#xff1a;网络地址转换的奥秘 在计算机网络的世界里&#xff0c;NAT 模式&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;扮演着至关重要的角色。它就像是网络中的翻译官&#xff0c;在不同网络地址之间进行转换&#xff0…...

HTML第二节

一.列表 1.列表的简介 2.无序列表 注&#xff1a;1.ul里面只能放li&#xff0c;不能放标题和段落标签 2.li里面可以放标题和段落等内容 3.有序列表 4.定义列表 注&#xff1a;要实现上图的效果需要CSS 二.表格 1.表格介绍 注&#xff1a;1.th有额外的效果&#xff0c;可以…...

203、【数组】NLP分词实现(Python)

题目描述 给定一个词典&#xff0c;比如[“杭州”,“西湖”,“博物馆”,“杭州西湖博物馆”,“我”]​ 对于输入的文本进分词&#xff1a;我在杭州的杭州西湖博物馆玩了一天​ 分词结果处理为如下形式的字符串: 我\W 在 杭州\W 的 杭州西湖博物馆\W 玩了一天​ 对于输入的文本…...

Qt 开源音视频框架模块之QtAV播放器实践

Qt 开源音视频框架模块QtAV播放器实践 1 摘要 QtAV是一个基于Qt的多媒体框架&#xff0c;旨在简化音视频播放和处理。它是一个跨平台的库&#xff0c;支持多种音视频格式&#xff0c;并提供了一个简单易用的API来集成音视频功能。QtAV的设计目标是为Qt应用程序提供强大的音视…...

在虚拟机CentOS安装VMware Tools

在虚拟机 CentOS 中安装 VMware Tools 可以增强虚拟机与宿主机之间的交互&#xff0c;例如实现文件共享、屏幕自适应等功能。以下是详细的安装步骤&#xff1a; 1.前提条件 已安装 VMware Workstation 或 VMware Fusion 等虚拟机软件。已在虚拟机中安装 CentOS 操作系统。 2…...

LeetCode热题100- 字符串解码【JavaScript讲解】

古语有云&#xff1a;“事以密成&#xff0c;语以泄败”&#xff01; 关于字符串解码&#xff1a; 题目&#xff1a;题解&#xff1a;js代码&#xff1a;代码中遇到的方法&#xff1a;repeat方法&#xff1a;为什么这里不用this.strstack.push(result)&#xff1f; 题目&#x…...

验证码介绍及生成与验证(HTML + JavaScript实现)

验证码介绍及生成与验证&#xff08;HTML JavaScript实现&#xff09; 验证码 验证码&#xff08;全自动区分计算机和人类的图灵测试&#xff0c;‌CAPTCHA &#xff0c;C‌ompletely ‌A‌utomated ‌P‌ublic ‌T‌uring test to tell ‌C‌omputers and ‌H‌umans ‌A‌…...

【深入探索 Caffeine:Java 缓存利器】

引言 咱搞软件开发的时候&#xff0c;缓存可是提升系统性能的关键。用好了缓存&#xff0c;能大大减少对数据库、远程服务这些后端数据源的访问&#xff0c;系统响应更快&#xff0c;吞吐量也能提高。Java 里有不少不错的缓存框架&#xff0c;不过 Caffeine 性能好、功能多&am…...

Spring Boot启动过程?

目录 1. 启动入口 2. SpringApplication 初始化 3. 准备环境 4. 创建应用上下文(ApplicationContext) 5. 准备应用上下文 6. 刷新应用上下文 7. 启动 Web 服务器(若为 Web 应用) 8. 发布 ApplicationStartedEvent 事件 9. 执行 Runner 10. 发布 ApplicationReady…...

数字可调控开关电源设计(论文+源码)

1 设计要求 在本次数字可调控开关电源设计过程中&#xff0c;对关键参数设定如下&#xff1a; &#xff08;1&#xff09;输入电压&#xff1a;DC24-26V,输出电压&#xff1a;12-24&#xff08;可调&#xff09;&#xff1b; &#xff08;2&#xff09;输出电压误差&#xf…...

驭势科技9周年:怀揣理想,踏浪前行

2025年的2月&#xff0c;驭势科技迎来9岁生日。位于国内外不同工作地的Uiseeker齐聚线上线下&#xff0c;共同庆祝驭势走过的璀璨九年。 驭势科技联合创始人、董事长兼CEO吴甘沙现场分享了驭势9年的奔赴之路&#xff0c;每一段故事都包含着坚持与拼搏。 左右滑动查看更多 Part.…...

Linux系统之DHCP网络协议

目录 一、DHCP概述 二、DHCP部署实操 2.1、安装DHCP软件 2.2、拷贝配置文件 2.3、配置文件详解 2.4、重启软件服务 2.5、新开一台服务器&#xff0c;查看dhcp地址获取 一、DHCP概述 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种应用层网络协…...

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…...

爬虫抓取数据时如何处理异常?

在爬虫开发中&#xff0c;处理异常是确保爬虫稳定运行的关键环节。爬虫在运行过程中可能会遇到各种问题&#xff0c;例如网络请求失败、目标页面结构变化、数据缺失等。合理处理这些异常可以提高爬虫的鲁棒性&#xff0c;避免因小问题导致整个爬虫程序崩溃。以下是一些常见的异…...

【DeepSeek探索篇(四)】高效学习与工作,从搭建DeepSeek个人知识库开始!

高效学习与工作&#xff0c;从搭建DeepSeek个人知识库开始&#xff01; 打工人和学习者必看&#xff01;你为何急需一个个人知识库&#xff1f;搭建个人知识库需要用到哪些技术呢&#xff1f;一、模型微调与RAG技术简介二、RAG技术原理剖析 揭秘Embedding&#xff1a;为何它是D…...

游戏引擎学习第125天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾并为今天的内容做准备。 昨天&#xff0c;当我们离开时&#xff0c;工作队列已经完成了基本的功能。这个队列虽然简单&#xff0c;但它能够执行任务&#xff0c;并且我们已经为各种操作编写了测试。字符串也能够正常推送到队…...

【大模型系列篇】大模型微调工具 LLama-Factory、Unsloth、ms-SWIFT

今日号外&#xff1a;&#x1f525;&#x1f525;&#x1f525; DeepSeek团队正式启动为期五天的开源计划 Day3&#xff1a;DeepGEMM。DeepGEMM 是一个专为简洁高效的 FP8 通用矩阵乘法&#xff08;GEMM&#xff09;设计的库&#xff0c;具有细粒度缩放功能&#xff0c;如 Deep…...

Zabbix问题记录2--踩坑HttpRequest,header添加无效

背景 在试图尝试通过Zabbix接入DeepSeek API的时候&#xff0c;由于使用了HTTP的方式&#xff0c;所以需要使用Zabbix 自带的HttpRequest库进行请求&#xff0c;产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…...

DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖

最近是接了一个需求咨询图像处理类的&#xff0c;甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全&#xff0c; 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件&#xff0c;能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…...

【嵌入式】RTOS安装和测试

RTOS 安装 安装RTOS&#xff0c;可采用RT-Linux框架 [RT-Linux — 快速使用手册](2. RT-Linux — 快速使用手册—基于LubanCat-RK356x系列板卡 文档)&#xff0c;apt没有安装包&#xff0c;更新ubuntu系统版本后仍然不行&#xff0c;后更新国内软件源仍然没有检测到安装包。后…...

MySQL的存储引擎

存储引擎的概念 存储引擎&#xff1a;负责将数据存储在物理存储设备&#xff08;如磁盘&#xff09;上的结构和机制。存储引擎决定了数据库如何管理、组织和访问数据。&#xff09; 因为在关系数据库中数据的存储是以表的形式存储的&#xff0c;所以存储引擎也可以称为表类型…...

瑞芯微RK安卓Android主板GPIO按键配置方法,触觉智能嵌入式开发

触觉智能分享&#xff0c;瑞芯微RK安卓Android主板GPIO按键配置方法&#xff0c;方便大家更好利用空闲IO&#xff01;由触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566四核处理器&#xff0c;树莓派卡片电脑设计&#xff0c;支持安卓Android、开源鸿蒙Open…...

数据安全_笔记系列09_人工智能(AI)与机器学习(ML)在数据安全中的深度应用

数据安全_笔记系列09_人工智能&#xff08;AI&#xff09;与机器学习&#xff08;ML&#xff09;在数据安全中的深度应用 人工智能与机器学习技术通过自动化、智能化的数据分析&#xff0c;显著提升了数据分类、威胁检测的精度与效率&#xff0c;尤其在处理非结构化数据、复杂…...

跨平台公式兼容性大模型提示词模板(飞书 + CSDN + Microsoft Word)

飞书云文档 CSDN MD编辑器 Microsoft Word 跨平台公式兼容方案&#xff1a; 一、背景痛点与解决方案 在技术文档创作中&#xff0c;数学公式的跨平台渲染一直存在三大痛点&#xff1a; 飞书云文档&#xff1a;原生KaTeX渲染与导出功能存在语法限制微软Word&#xff1a;Math…...

Redis面试题----Redis 的持久化机制是什么?各自的优缺点?

Redis 提供了两种主要的持久化机制,分别是 RDB(Redis Database)和 AOF(Append Only File),下面将详细介绍它们的原理、优缺点。 RDB(Redis Database) 原理 RDB 持久化是将 Redis 在某个时间点上的数据集快照以二进制文件的形式保存到磁盘上。可以通过手动执行 SAVE …...

Leetcode-接雨水(单调栈)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …...

[ComfyUI]官方已支持Skyreels混元图生视频,速度更快,效果更好(附工作流)

一、介绍 昨天有提到官方已经支持了Skyreels&#xff0c;皆大欢喜&#xff0c;效果更好一些&#xff0c;还有GGUF量化版本&#xff0c;进一步降低了大家的显存消耗。 今天就来分享一下官方流怎么搭建&#xff0c;我体验下来感觉更稳了一些&#xff0c;生成速度也更快&#xf…...

安宝特方案 | 电力行业的“智能之眼”,AR重新定义高效运维!

引言&#xff1a; 电力行业正经历智能化变革&#xff0c;安宝特AR数字化工作流以四大核心优势&#xff0c;为电力企业打造全场景智慧运维方案&#xff01; 四大颠覆性功能&#xff0c;直击行业痛点 1、高度自定义作业流程 支持图文指引、语音播报、AI实时识别&#xff08;如…...

游戏引擎学习第124天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天&#xff0c;我们已经介绍了多线程的一些基础知识&#xff0c;包括如何创建工作队列以及如何在线程中处理任务。今天&#xff0c;重点是解决那些我们之前没有注意到…...

微软推出Office免费版,限制诸多,只能编辑不能保存到本地

易采游戏网2月25日独家消息&#xff1a;微软宣布推出一款免费的Office版本&#xff0c;允许用户进行基础文档编辑操作&#xff0c;但限制颇多&#xff0c;其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论&#xff0c;业界人士对其背后的商业策略和用户体验…...

spring中的注解介绍

本篇文章专门用来介绍spring中的各种注解。 1、RestController 1、含义 2、举例 3、使用场景 RestController 通常用于开发 RESTful API&#xff0c;适合返回 JSON 或 XML 数据的场景 4、总结 RestController 是 Spring 中用于简化 RESTful Web 服务开发的注解&#xff0c;它结…...

修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板

前言 在博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 中,我们利用官方提供的BSP(FSL Yocto Project Community BSP)构建了写到SD卡中的完整镜像,然后启动后发现存在不少问题,首要的问题就是u-boot不能识别网卡,在这篇博文中,我们就找到FSL Yocto Pro…...

DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库

项目地址&#xff1a;https://github.com/deepseek-ai/DeepEP 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天 (2/5)&#xff01; ​ ​ 引言 在大模型训练中&#xff0c;混合专家模型&#xff08;Mixture-of-Experts, MoE&#xff09;因其动…...

计算机毕业设计 ——jspssm506Springboot 的旧物置换网站

作者&#xff1a;程序媛9688 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xf…...

观成科技:海莲花“PerfSpyRAT”木马加密通信分析

1.概述 在2024年9月中旬至10月&#xff0c;东南亚APT组织“海莲花”通过GitHub发布开源安全工具项目&#xff0c;针对网络安全人员发起了定向攻击。通过对相关攻击活动进行分析&#xff0c;可以将其与一些海莲花的样本关联起来。这些样本的通信数据结构与海莲花此前使用的攻击…...

在使用 npm link 进行本地 npm 包调试时,是否需要删除项目中已安装的依赖包取决于你的调试场景和依赖管理方式

1. 默认情况下不需要删除已安装的包 npm link 的工作原理&#xff1a; 当你在项目中运行 npm link <package-name> 时&#xff0c;npm 会创建一个符号链接&#xff08;symlink&#xff09;&#xff0c;将项目的 node_modules/<package-name> 指向全局的软链包&am…...

Springboot快速接入豆包大模型

背景 突然接到上面的通知&#xff0c;想要在系统里面接入各大模型的能力&#xff0c;我这边随机选了个豆包&#xff0c;然后快速对接了一下&#xff0c;很顺利&#xff0c;一把过&#xff0c;现在文档的快速入门还是很ok的&#xff0c;在此记录一下过程&#xff0c;给宝子们参考…...

w803|联盛德|WM IoT SDK2.X测试|window11|TOML 文件|外设|TFT_LCD|测试任务|(5):TFT_LCD_LVGL示例

TFT_LCD_LVGL 功能概述 此应用程序是使用 WM IoT SDK 进行 LVGL 功能的示例。它演示了如何初始化 TFT LCD 设备&#xff0c;并创建 LVGL DEMO Task 进行 LVGL 模块的初始化&#xff0c;并展示 LVGL 原生的不同 Demo 场景, 例如&#xff1a; Widgets, Music Player, Benchmark…...

java23种设计模式-观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;学习笔记 编程相关书籍分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145884039 1.…...

【MySQL 一 数据库基础】深入解析 MySQL 的索引(3)

索引 索引操作 自动创建 当我们为一张表加主键约束(Primary key)&#xff0c;外键约束(Foreign Key)&#xff0c;唯一约束(Unique)时&#xff0c;MySQL会为对应的的列自动创建一个索引&#xff1b;如果表不指定任何约束时&#xff0c;MySQL会自动为每一列生成一个索引并用ROW_I…...

本地部署 deepseek-r1 1.5B方法-ubuntu20.04 python3.10 pycharm虚拟环境

1. 环境安装 ubuntu20.04 python3.10 pycharm虚拟环境 2.拉取代码 虚拟环境下安装vllm&#xff1a; pip install vllm ubuntu命令窗口安装 sudo apt install git-lfs 初始化 Git LFS 安装 Git LFS 后&#xff0c;你需要虚拟环境命令窗口初始化它&#xff1a;git lfs i…...

【Qt】为程序增加闪退crash报告日志

背景 随着软件代码量的增加&#xff0c;软件崩溃闪退的肯能行越来越大&#xff0c;其中一些是难以复现的&#xff0c;比如访问了访问了非法地址、被操作系统杀死等。 为此&#xff0c;在软件出现闪退情况时&#xff0c;尽可能多的记录闪退发生时信息&#xff0c;对排查闪退原…...

Visual Studio打开文件后,中文变乱码的解决方案

文件加载 使用Unicode&#xff08;UTF-8&#xff09;编码加载文件 C:\WorkSpace\Assets\Scripts\UI\View\ExecuteComplateView.cs时&#xff0c;有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。...

某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠

摘要&#xff1a;纯电动商用车的工作环境存在路况复杂、工况恶劣等情况&#xff0c;导致整车电气设备的磨损速率加快&#xff0c;造成电气设备绝缘电阻持续下降&#xff0c;如不及时处理&#xff0c;可能存在安全隐患或引发重大安全事故。文章从绝缘故障检测原理出发&#xff0…...

eclogy后台运维笔记(写的很乱,只限个人观看)

组织权限&#xff1a; 矩阵管理 这个很重要&#xff0c;比如进行流程操作者的选择时&#xff0c;我们进行需要选择财务部的出纳&#xff0c;会计&#xff0c;总经理。我们不能去直接选定一个人&#xff0c;万一这个人离职了&#xff0c;那所有的流程都要手动修改&#xff0c;…...

结构型模式 - 适配器模式 (Adapter Pattern)

结构型模式 - 适配器模式 (Adapter Pattern) 适配器模式是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户希望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 类适配器&#xff0c;适用于要适配的类是一个接口&#xf…...

[2/11]C#性能优化-不要使用空析构函数-每个细节都有示例代码

前言 在C#开发中&#xff0c;性能优化是提升系统响应速度和资源利用率的关键环节。 当然&#xff0c;同样是所有程序的关键环节。 通过遵循下述建议&#xff0c;可以有效地减少不必要的对象创建&#xff0c;从而减轻GC的负担&#xff0c;提高应用程序的整体性能。记住&#xf…...

0-基于强化学习的图Transformer算法求解车辆路径问题(2023)

文章目录 Abstract1 Introduction2. Related Work2.1 引言2.2.基于RNN的VRP解决方案2.3.基于GNN的VRP解决方案2.4.基于Transformer的车辆路径问题求解方法3 边嵌入注意力模型3.1 编码器3.1.1 边嵌入多头注意力3.1.2. 前馈网络(FFN)、批量归一化和残差连接3.2 解码器3.2.1 解码…...