scala的基本语法

news2024/11/19 1:47:35

注释

对于scala的注释,简而言之就是一句话,和java的注释一模一样
基本语法

(1)单行注释://
(2)多行注释:/* */
(3)文档注释:/**
              *
              */

代码示例:

package com.doitedu.demo01
object TestNotes {
 def main(args: Array[String]): Unit = {
 //(1)单行注释://
 println("涛哥")
 
 //(2)多行注释:/* */
 /*
 println("涛哥")
 println("行哥")
 */
 
 //(3)文档注释:
 /**
 *
 */
 /**
 * println("乃哥")
 * println("雨哥")
 * println("行哥")
 */
   } 
} 

变量和常量(重点)

// 回顾:Java 变量和常量语法
// 变量类型 变量名称 = 初始值 
int a = 10
// final 常量类型 常量名称 = 初始值 
final int b = 20
scala定义变量常量的基本语法
Scala
// var 变量名 [: 变量类型] = 初始值 
var i:Int = 10   variable :可变的
// val 常量名 [: 常量类型] = 初始值 
val j:Int = 20   value :值

var variable  可变的   代表声明变量

val  value  值    代表声明常量

注意:
• val 在编程的过程中我们大部分的操作是获取值或者是获取一个创建好的对象,然后操作对象中的属性,很少改变这个对象变量
• val 是线程安全的 , 在使用的时候效率更高
• 优先使用val ,但是当变量后续的需要变化的时候使用var

package com.doitedu.demo02
object TestVar {
 def main(args: Array[String]): Unit = {
 //(1)声明变量时,类型可以省略,编译器自动推导,即类型推导
     var age = 18
     age = 30
 //(2)类型确定后,就不能修改,说明 Scala 是强数据类型语言。
// age = "zhangsan" // 错误
 //(3)变量声明时,必须要有初始值
// var name //错误
//(4)在声明/定义一个变量时,可以使用 var 或者 val 来修饰,var 修饰的变量可改变,val 修饰的变量不可改。
 var num1 = 10 // 可变
 val num2 = 20 // 不可变
 num1 = 30 // 正确
 //num2 = 100 //错误,因为 num2 是 val 修饰的
     } 
}


object demo03{
 def main(args: Array[String]): Unit = {
 // p1 是 var 修饰的,p1 的属性可以变,而且 p1 本身也可以变
 var p1 = new Person()
 p1.name = "zhangsan"
 p1 = null
 // p2 是 val 修饰的,那么 p2 本身就不可变(即 p2 的内存地址不能变),
但是,p2 的属性是可以变,因为属性并没有用 val 修饰。
 val p2 = new Person()
 p2.name="jinlian"
// p2 = null // 错误的,因为 p2 是 val 修饰的
 } 
}
class Person{
 var name : String = "jinlian"
} 

练一练:
多易现在开售了一个小课堂来卖课(小型的电商平台):
对于销售这块而言,我们是不是要存在一些属性字段:
店铺名称:多易教育
课程名称:java基础,mysql,hadoop.....
讲课老师:源哥,涛哥,星哥,行哥
课程的价格:199,299,399,99
红包类型: 首次购买红包,老学员红包
红包金额:9.9 18.8
活动名称:老用户再次购买,新用户首次购买,学员推荐购买
活动类型:6.18 10.24 11.11
活动折扣力度:9折 5折 8.8折
购买用户用户名:zhangsan,lisi
用户手机号:18860875775,18860875776
用户现在的职位:etl工程师,大数据开发工程师,数仓工程师
用户的邮箱:email
订单号:111122223333
订单金额:398
代码:

package com.doitedu

object demo01{

  /**
   * 店铺名称:多易教育
   * 课程名称:java基础,mysql,hadoop.....
   * 讲课老师:源哥,涛哥,星哥,行哥
   * 课程的价格:199,299,399,99
   * 红包类型: 首次购买红包,老学员红包
   * 红包金额:9.9  18.8
   * 活动名称:老用户再次购买,新用户首次购买,学员推荐购买
   * 活动类型:6.18     10.24  11.11
   * 活动折扣力度:9折   5折   8.8折
   * 购买用户用户名:姜海涛,江一
   * 用户手机号:18860875775,1886087,5776
   * 用户现在的职位:etl工程师,大数据开发工程师,数仓工程师
   * 用户的邮箱:email
   * 订单号:111122223333
   * 订单金额:119.4
   */
  def main(args: Array[String]): Unit = {
    //店铺名称:多易教育
    val shopName = "多易教育"
    //课程名称:java基础,mysql,hadoop.....
    val subjectName = "java基础"
    //讲课老师:源哥,涛哥,星哥,行哥
    val tName = "涛哥"
    //课程的价格:199,299,399,99
    val subjectPrice = 199.00
    //红包类型: 首次购买红包,老学员红包
    val bonusType = "new"
    //红包金额
    val bonus = 9.9
    //活动名称
    val activeName = "老用户再次购买"
    //活动类型:6.18     10.24  11.11
    val activeType = "程序员节"
    //活动折扣力度
    val activeDiscount = 0.6
    //购买用户用户名
    val userName = "haiTao Jiang"
    //用户手机号
    val tel = "13372090488"
    //用户邮箱
    val email = "34650965@qq.com"
    //订单号
    val orderId = "111122223333"
    //订单金额
    val orderAmount = 119.4
  }

}

标识符的命名规范

Scala 对各种变量、方法、函数等命名时使用的字符序列称为标识符。即:凡是自己可
以起名字的地方都叫标识符。
命名规则:
Scala 中的标识符声明,基本和 Java 是一致的,但是细节上会有所变化,总结后有三点:

  1. 以字母或者下划线开头,后接字母、数字、下划线 正常情况下:字母加下划线偶尔来个数字
  2. 以操作符开头,且只包含操作符(+ - / # !等)
  3. 用反引号....包括的任意字符串,即使是 Scala 关键字(39 个)也可以

• package, import, class, object, trait, extends, with, type, for
• private, protected, abstract, sealed, final, implicit, lazy, override
• try, catch, finally, throw
• if, else, match, case, do, while, for, return, yield
• def, val, var
• this, super
• new
• true, false, null

练一练:
需求:判断 hello、Hello12、1hello、h-b、x h、h_4、ab、Int、、+-/#!、+-/#!1、if、if,这些名字是否合法。

object Test01 {
 def main(args: Array[String]): Unit = {
 // (1)以字母或者下划线开头,后接字母、数字、下划线
 var hello: String = "" // ok
 var Hello12: String = "" // ok
 var 1hello: String = "" // error 数字不能开头
 var h-b: String = "" // error 不能用-
 var x h: String = "" // error 不能有空格
 var h_4: String = "" // ok
 var _ab: String = "" // ok
 var Int: String = "" // ok 因为在 Scala 中 Int 是预定义的字符,不是关键字,但不推荐
 var _: String = "hello" // ok 单独一个下划线不可以作为标识符,因为_被认为是一个方法println(_)
 //(2)以操作符开头,且只包含操作符(+ - * / # !等)
 var +*-/#! : String = "" // ok
 var +*-/#!1 : String = "" // error 以操作符开头,必须都是操作符
 //(3)用反引号`....`包括的任意字符串,即使是 Scala 关键字(39 个)也可以
 var if : String = "" // error 不能用关键字
 var `if` : String = "" // ok 用反引号`....`包括的任意字符串,包括关键字
 } 
}

字符串输出

基本语法:

  1. 字符串,通过+号连接
  2. printf 用法:字符串,通过%传值。
  3. 字符串模板(插值字符串):通过$获取变量值

代码测试:

package com.doitedu.demo04
object TestString{
 def main(args: Array[String]): Unit = {
 var name: String = "jinlian"
 var age: Int = 18
 
 //(1)字符串,通过+号连接
 println(name + " " + age)
 
 //可以用$来引用变量,大括号{}可以写也可以不写,如果不写,中间要用空格隔开
//最前面小写的s就是固定写法,写了他相当于就是一个模板字符串,咱们可以用$去引用变量了
println(s"${name}今年${age}岁了")
 
 //(2)printf 用法字符串,通过%传值。 他是不换行的,如果需要换行,那么要用\r\n来写在末尾换行
 printf("name=%s age=%d\r\n",name,age)
 
 val price = 119.99
printf("这个商品的价格是%.2f",price)

 //(3)字符串,通过$引用
//多行字符串,在 Scala中,利用三个双引号包围多行字符串就可以实现。
//输入的内容,带有空格、\t 之类,导致每一行的开始位置不能整洁对齐。
//应用 scala 的 stripMargin 方法,在 scala 中 stripMargin 默认
是“|”作为连接符,//在多行换行的行头前面加一个“|”符号即可。
val sql =
  """
    |select
    |name,
    |count(1) as cnt
    |from
    |table_a
    |where name = "zhangSan"
    |and age = 18
    |group by name;
    |""".stripMargin
println(sql )
//如果需要对变量进行运算,那么可以加${}
val sql01 =
  """
    |select
    |name,
    |count(1) as cnt
    |from
    |table_a
    |where name = "$name"
    |and age = ${age+2}
    |group by name;
    |""".stripMargin
 println(sql01 )
 val s2 = s"name=$name"
 println(s2)
 } 
}
printf中格式化输出的模板
 %d 十进制数字
 %s 字符串
 %c 字符
 %e 指数浮点数
 %f 浮点数
 %i 整数(十进制)
 %o 八进制
 %u 无符号十进制
 %x 十六进制

数据类型(重点)

Java基本类型:char、byte、short、int、long、float、double、boolean
Java引用类型:(对象类型)
Java基本类型的包装类:Character、Byte、Short、Integer、Long、Float、Double、Boolean
由于Java有基本类型,而且基本类型不是真正意义的对象,即使后面产生了基本类型的包装类,但是仍然存在基本数据类型,所以Java语言并不是真正意思的面向对象。
• scala中的数据类型和java中数据类型最大的区别就是scala中的数据类型都是对象 , 也就是scala中没有原生的数据类型!
• scala中的数据类型分成两类 AnyVal(值类型)和AnyRef(引用类型) , 两种对象都属于Any ,都是对象
val age:Int = 23
age是一个Int数值类型的变量 , 数值类型的变量也属于一个对象 , 所以age变量就是一个对象,也拥有很多方法
注意:Java中基本类型和引用类型没有共同的祖先。

  1. Any : 所有类型的父类 , 类似于java中的Object
  2. AnyVal: 数值类型(简单类型) ==-》 对应的是java中的基本数据类型
  3. AnyRef: 引用数据类型
  4. Null: 引用类型的子类,类似于java中的null ==》 写了一个类,将null这个值封装在了这个Null里面
  5. Unit:对应Java中的void,表示方法没有返回值 ,他的值:() ==》 因为针对这个对象,重写了toString 方法
  6. Nothing: 所类型的子类,主要用在一个函数没有明确返回值时使用,通常异常时使用,表示此处有错

数据类型详细表:


Unit 类型、Null 类型和 Nothing 类型

数据类型描述
Unit表示无值,和其他语言中 void 等同。用作不返回任何结果的方法的结果类型。Unit 只有一个实例值,写成()。
Nullnull , Null 类型只有一个实例值 null
NothingNothing 类型在 Scala 的类层级最低端;它是任何其他类型的子类型。当一个函数,我们确定没有正常的返回值,可以用 Nothing 来指定返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数或者变量(兼容性)

类型转换

当Scala 程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型,这
个就是自动类型转换(隐式转换)。数据类型按精度(容量)大小排序为:


说明:

  1. 自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
  2. 把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。toInt toDouble
  3. (byte,short)和 char 之间不会相互自动转换。
  4. byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型。

测试案例:

object Test {
 def main(args: Array[String]): Unit = {
 //(1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数值类型,然后再进行计算。
 var n = 1 + 2.0
 println(n) // n 就是 Double
 //(2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。
 var n2 : Double= 1.0
 //var n3 : Int = n2 //错误,原因不能把高精度的数据直接赋值和低精度。
 //(3)(byte,short)和 char 之间不会相互自动转换。
 var n4 : Byte = 1
 //var c1 : Char = n4 //错误
 var n5:Int = n4
 //(4)byte,short,char 他们三者可以计算,在计算时首先转换为 int类型。
 var n6 : Byte = 1
 var c2 : Char = 1
 // var n : Short = n6 + c2 //当 n6 + c2 结果类型就是 int
 // var n7 : Short = 10 + 90 //错误
 } 
}

运算符

算术运算符


测试代码:

object Test {
  def main(args: Array[String]) {
    var a = 10;
    var b = 20;
    var c = 25;
    var d = 25;
    println("a + b = " + (a + b) );
    println("a - b = " + (a - b) );
    println("a * b = " + (a * b) );
    println("b / a = " + (b / a) );
    println("b % a = " + (b % a) );
    println("c % a = " + (c % a) );
  }
}

关系运算符

代码测试:

def main(args: Array[String]) {
  var a = 10;
  var b = 20;
  println("a == b = " + (a == b) );
  println("a != b = " + (a != b) );
  println("a > b = " + (a > b) );
  println("a < b = " + (a < b) );
  println("b >= a = " + (b >= a) );
  println("b <= a = " + (b <= a) );
}

逻辑运算符


代码测试:

val a = true
val b = false

println("a && b = " + (a && b))//false

println("a || b = " + (a || b))//true

println("!(a && b) = " + !(a && b))//true

赋值运算符

注意:scala中是没有++ -- 替换 += -=

代码测试:

object Test {
 def main(args: Array[String]): Unit = {
 var r1 = 10
 r1 += 1 // 没有++
 r1 -= 2 // 没有--
 }
}

位运算符

测试代码:

object TestPosition {
 def main(args: Array[String]): Unit = {
 // 测试:1000 << 1 =>10000
 var n1 :Int =8
 n1 = n1 << 1
 println(n1)  //16 
 } 
} 

优先级

流程控制

Scala中的流程控制和java基本一致

范围数据循环(To)

基本语法

for(i <- 1 to 10){
  println(i)
}

(1)i 表示循环的变量,<- 规定 to 
(2)i 将会从 1-3 循环,前后闭合

需求:输出 5 句 "hello world"

object TestFor {
 def main(args: Array[String]): Unit = {
 for(i <- 1 to 5){
 println("hello  world"+i)
 }
 } 
}

范围数据循环(Until)

基本语法:

for(i <- 1 until 5) {
    println(i)
}

(1)这种方式和前面的区别在于 i 是从 1 到 5-1 即[0,5)
(2)即使前闭合后开的范围
练习:
需求:用until输出 5 句 "hello  world"
Scala
object TestFor {
 def main(args: Array[String]): Unit = {
 for(i <- 1 until 5+1){
 println("hello  world"+i)
 }
 } 
}

循环守卫

基本语法

for(i <- 1 to 3 if i != 2) {
     println(i)
}

// 循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为 true 则进入循环体内部,为 false 则跳过,类似于 continue。 
// 代码等价:

for (i <- 1 to 3){
    if (i != 2) {
        print(i + " ")
    } 
}    

// 需求:输出 1 到 5 中,不等于 3 的值
object TestFor {
 def main(args: Array[String]): Unit = {
 for (i <- 1 to 5 if i != 3) {
 println(i + "doit")
 }
 } 
} 

循环步长
基本语法:
说明:by 表示步长

    for (i <- 1 to 10 by 2) {
     println("i=" + i)
    }

// 需求:输出 1 到 10 以内的所有奇数
for (i <- 1 to 10 by 2) {
println("i=" + i)
}

结果:
i=1
i=3
i=5
i=7
i=9

引入变量:

基本语法:

for(i <- 1 to 3; j = 4 - i) {
 println("i=" + i + " j=" + j)
}

说明:
(1)for 推导式一行中有多个表达式时,所以要加 ; 来隔断逻辑
(2)for 推导式有一个不成文的约定:当 for 推导式仅包含单一表达式时使用圆括号,当包含多个表达式时,一般每行一个表达式,并用花括号代替圆括号,如下
举例:

for {
 i <- 1 to 3
 j = 4 - i
} {
 println("i=" + i + " j=" + j)
} 
// 等价得代码:
Scala
for (i <- 1 to 3) {
 var j = 4 - i
 println("i=" + i + " j=" + j)
}

循环返回值

基本语法:

val res = for(i <- 1 to 10) yield i
println(res)
// 说明:将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字。

// 练习:需求:将原数据中所有值乘以 2,并把数据返回到一个新的集合中。
object TestFor {
 def main(args: Array[String]): Unit = {
     var res = for(i <-1 to 10) yield {
         i * 2
     }
     println(res)
 } 
}

输出结果:
Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

倒序打印

说明:如果想倒序打印一组数据,可以用 reverse。
需求:倒序打印 10 到 1

for(i <- 1 to 10 reverse){
 println(i)
}

循环中断

基本说明:
Scala 内置控制结构特地去掉了 break 和 continue,是为了更好的适应函数式编程,推荐使用函数式的风格解决break和continue的功能,而不是一个关键字。Scala中使用breakable控制结构来实现 break 和 continue 功能。

方式 1:采用异常的方式退出循环

object Demo_while {
  def main(args: Array[String]): Unit = {
    try {
      for (emel <- 1 to 10) {
        println(emel)
        if (emel == 5) {
          throw new RuntimeException
        }
      }
    } catch {
      case e: Exception =>
    }
    println("hello")
  }
}

方式 2:采用 Scala 自带的函数,退出循环

import scala.util.control.Breaks

object Demo_while {
  def main(args: Array[String]): Unit = {
    Breaks.breakable(
      for (emel <- 1 to 10) {
        println(emel)
        if (emel == 5) {
          Breaks.break()
        }
      }
    )
    println("正常结束循环")
  }
}

对breaks进行省略

object Demo_while {
  def main(args: Array[String]): Unit = {
    breakable(
      for (emel <- 1 to 10) {
        println(emel)
        if (emel == 5) {
          break()
        }
      }
    )
    println("正常结束循环")
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

samaphore、countdownlatch、cyclinarrier

目录 一、samaphore 1、介绍 2、应用 3、原理 二、countdownlatch 三、cyclicbarrier 一、samaphore 1、介绍 信号量&#xff0c;用来限制同时访问共享资源的线程上限。可以理解为停车场入口的提示排&#xff0c;标识有多少车位&#xff0c;有车位才能进去停车&#xf…

ElasticSearch-使用IK分词器进行分词

使用KIbana测试IK分词器 打开开发工具台 ik_smart 最少分词器 分词结果比较少 GET _analyze{"analyzer": "ik_smart","text": "中国共产党"}ik_max_word 颗粒度最细分词器 分词结果比较多,组成各种结果,穷尽词库的可能&#xff01…

easypan前端学习

文章目录 前端项目node 版本node镜像构建项目创建项目安装项目所有依赖 图片资源网站encodeURI & decodeURIapp.config.globalProperties与getCurrentInstanceObject.assignvue-cookies安装vue-cookies 使用vue-cookiesrouter.currentRoutepreserve logimport.meta.envRequ…

QPaint绘制图形

流程 继承QWidget类&#xff0c;重写paintEvent方法&#xff0c;在其中使用QPainter进行绘图。 举例 创建项目&#xff0c;项目结构如下&#xff1a; // widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget…

TypeScript ~ TS 掌握编译文件配置项 ⑥

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

git 上传下载

文章目录 gitee/GitHub 是用来做什么的&#xff1f;什么时候需要学习上传项目到 gitee&#xff1f;为什么要将本地项目上传到 gitee&#xff1f;创建 gitee 仓库&#xff1a;在本地新建一个项目将仓库拉取到本地使用 idea 实现项目的上传下载gitee 仓库查看 下面我就来为大家介…

第六章 习题(6789B)【计算机系统结构】

第六章 习题【计算机系统结构】 前言推荐第六章 习题678911 最后 前言 2023-6-24 10:43:46 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 第五章 作业&#xff08;149A&#xff09;【计算机系统结构】 答案参考&#xff1a; https://www.docin.com/p-28456…

LVDS (Low Voltage Differential Signaling)基础知识

LVDS(Low Voltage Differential Signaling&#xff09;: 是一种小振幅差分信号技术&#xff0c;它使用非常低的幅度信号 (250mV~450mv&#xff09;通过一对平行的 PCB 走线或平衡电缆传输数据。 在两条平行的差分信号线上流经的电流及电压振幅相反&#xff0c;噪声信号同时耦…

小鱼C python - 集合的练习

题一&#xff1a;用字典实现集合的去重特性 1. 生成100个1&#xff5e;100的随机值 思路&#xff1a; 1. range 范围 2. random.randint(a,b) import random x [] for I in range(100):x.append(random.randint(1,100)) print(x) 2. x和y的交集 思路&#xff1a;1.遍历x,…

通过 pGina 对 Windows 设备进行管理

文章目录 前言1、环境信息1.1、服务器端1.2、客户端 2、pGina 安装及配置2.1、下载并安装2.2、配置2.3、模拟测试2.4、Windows 远程登录测试 总结 前言 对 Windows 设备进行管理&#xff0c;一般是通过 AD 进行的&#xff0c;但是这玩意儿是收费的&#xff0c;而且还挺贵。有没…

SpringSecurity(二):自定义认证(源码+落地实现)。

自定义认证 自定义资源权限规则资源分类自定义资源权限规则为什么我们要自定义呢&#xff1f;如何去覆盖呢&#xff1f;WebSecurityConfigurerAdapter它是干什么用的实例 自定义登录界面步骤源码解析 自定义登录成功处理&#xff08;前后端分离的情况&#xff09;项目环境succe…

Axure中使用echarts图标

第一步&#xff1a;axure中防一个矩形框 第二步&#xff1a;将矩形框命名为Demo 这步很重要&#xff0c;后续会引用这个名字 第三步&#xff1a;打开Echarts示例&#xff0c;选择需要的样式&#xff0c;并调整数值 Examples - Apache ECharts 第四步&#xff1a;代码准备 需…

Windows10host文件修改方法

1、首先打开“此电脑”&#xff0c;定位到&#xff1a; C:\Windows\System32\drivers\etc 2、使用鼠标右键单击“hosts”&#xff0c;弹出来的菜单中选择“属性” 3、弹出“文件属性”窗口后单击“上方的”安全“栏”。 选中“ALL APPLICATON PACKAGES”后单击“编辑” 4、同…

Jmeter核心结构和运行原理(1)

Jmeter核心结构和运行原理 一、Jmeter核心结构和运行原理1、JMeter核心结构2、JMeter的体系结构3、JMeter运行原理a、GUI模式&#xff1a;b、非GUI模式&#xff1a;c、单机模式&#xff1a;d、分布式模式 一、Jmeter核心结构和运行原理 1、JMeter核心结构 测试计划 线程组 配…

MongoDB基本使用(一)

MongoDB基本使用 Nosql简介 NoSQL(NoSQL Not Only SQL )&#xff0c;意即”不仅仅是SQL”。 在现代的计算系统上每天网络上都会产生庞大的数据量&#xff0c; 这些数据有很大一部分是由关系数据库管理系统&#xff08;RDBMS&#xff09;来处理。 1970年 E.F.Codd’s提出的关系…

总结910

目标规划&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化5讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日规划 今日已做 1.早上回顾之前背诵的文章 2.写自我总结&#…

Java 中常见的数据结构

数据结构简介 数据结构是计算机科学中用于组织和存储数据的一种方式或方法。它定义了不同数据元素之间的关系&#xff0c;以及对这些数据元素进行操作和访问的规则和技术。 数据结构可以用来描述问题的抽象模型&#xff0c;并提供处理该问题的操作和算法。它可以通过逻辑和物…

wpf增加系统托盘图标

使用系统托盘&#xff0c;可以为用户提供一个简便快捷的操作习惯。 wpf中增加系统托盘图标有2种 第一种&#xff0c;使用Hardcodet.NotifyIcon.Wpf开源组件 1.建立一个wpf程序 2.安装Hardcodet.NotifyIcon.Wpf 3.增加图片 图片选择资源&#xff0c;否则获取不到路径 4.界面…

TypeScript - 函数(上)

目录 1、介绍 2、函数类型表达式 3、呼叫签名 4、构造签名 5、泛型函数 6、推论 7、约束 8、使用约束值 9、指定类型参数 1、介绍 函数是JavaScript应用程序的基础。 它帮助你实现抽象层&#xff0c;模拟类&#xff0c;信息隐藏和模块。 在TypeScript里&#xff0c…

Linux——进程的概念

task_struct task_struct 是linux下管理进程的结构&#xff0c;称为PCB&#xff0c;进程控制块。linux所有的指令本质上都是一个进程。进程 task_struct 进程的数据、代码、可执行程序&#xff0c;有属性、有内容。 进程是系统的工作单元。系统由多个进程组成&#xff0c;包…