scala基础

scala基础:

hello world:

  • 写scala可运行文件的注意事项
  • 1、如果一个scala文件要运行,class要改成object
  • 2、如果是class,就仅单纯代表一个类,如果是object代表的是单例对象
  • 3、scala语法中,一句话结束不需要加分号
  • 4、scala文件中,可以无缝使用java中的类和方法
object HelloWorld {
  def main(args: Array[String]): Unit = {
    // 输出一句hello world
    println("hello world")

    // java语言的输出一句话
    System.out.println("hello world")
  }
}

变量、常量

/**
 * 变量:在程序的运行过程中,其值可以发生改变的量
 * 在scala中定义一个变量,需要使用一个关键词:var
 *常量: 定义一个常数,使用关键字:var
 * 注意:
 * 1、变量一旦定义,它的类型就确定,可以不用手动指定类型,根据赋的值自动推断出类型
 * 2、也可以手动的指定变量的数据类型,完整的写法:var 变量名:数据类型 = 值
 *
 * scala中的数据类型和java的数据类型对应关系(Byte->Double 按所占字节数的大小,从小到大进行排序):
 * java:              scala:
 * byte                Byte
 * short               Short
 * int                 Int
 * long                Long
 * float               Float
 * double              Double
 * boolean             Boolean
 * char                Char
 */
// var定义一个变量
    var a1 = 100
    println(a1)
    //获取变量的类型
    println(a1.getClass)
    // 更改a1的值
    a1 = 200
    println(a1)
    
    var a2: Int = 10
    println(a2.getClass)
    
    val a3: Int = 100
    println(a3)
    // val 定义常量,若是修改其值会报错
//    a3 = 200
    // * : 为一个函数,底层通过StringBuilder来实现字符的链接
    println("=" * 50)

字符串

/**
 * scala中字符串、及其函数的使用
 * 字符串:由若该字符串组成的序列
 */
// 可以使用双引号构建字符串
var s1: String = "这是一个字符串"
println(s1)

// 使用""" """" 构建一个长字符串
var sql: String =
  """
    |这是一个长字符串
    |真的很长
    |注意了!!!
    |""".stripMargin
println(sql)

// String类和Java是一个共同的字符串类,String类中的功能在scala中正常使用

var s3 = "hello,world,java,hadoop,scala"
val arr1: Array[String] = s3.split(",")
// scala中的数组下标也是从0开始的,不过取的时候要使用arr1(0)
println(arr1(0))
println(arr1(1))
println(arr1(2))

/**
 * scala中字符串的拼接:
 * 1、使用 + 进行拼接,不过这种方式很消耗性能
 * 2、使用StringBuilder
 * 3、使用scala的特有函数mkString,前提条件是:有一组可拼接的序列
 * 4、使用scala特有的字符串传递方式 s"{变量}” (类似于python语言) 底层就是使用StringBuilder方式拼接的
 */
var q1: String = "hello"
var q2: String = "hello"
var q3: String = "hello"
var res1: String = q1 + "," + q2 + "," + q3
println(res1)

var res2: StringBuilder = new StringBuilder()
res2.append(q1).append(",").append(q2).append(",").append(q3)
println(res2)

var res3: String = arr1.mkString(",")
println(res3)

// 使用s"${}", 功能强大可以在括号中调用函数
var res4: String = s"${q1.toUpperCase},${q2},${q3}"
println(res4)

运算符

/**
 * 运算符
 */
var x: Int = 3
var y: Int = 4

println(x + y)
println(x - y)
println(x * y)
//此处的 / 为整除,若想让其取小数,可以让两个数中的其中一个变成一个浮点数
println(x / y)
println(x * 1.0 / y)
println(x % y)

循环语句

/**
 * 循环语句:
 * 注:
 * 1、在scala语言中,没有++或--, 如 i++ 、 i--
 * 2、在scala语言中,不存在和java一样的普通for循环
 * 3、scala中的循环的写法不太一样
 */

var i: Int = 0
while (i < arr2.length){
  println(arr2(i))
}

// 1 to 10 : 相当于闭区间的1到10
for (e <- 1to 10){
  println(e)
}

for(e <- 1 until 10){
  println(e)
}

控制语句

/**
   * 控制语句
   * 注:在scala中没有break、continue关键字
   * 要想使用break得导包:import scala.util.control.Breaks.break
   */
  //TODO 在break后,程序的执行结束,如若想继续执行,那么需要再加上一个breakable
  breakable{
    for (e <- 1 to 10) {
      if (e == 5) {
        //TODO:底层为一个异常抛出, def break(): Nothing = { throw breakException }
        break;
      }
      println(e)
    }
  }
  println("太牛了!")
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

IO流

def main(args: Array[String]): Unit = {
  //读取一个文件内容
  //使用java的方式读取文件, 使用带缓冲区的字符输入流
      val br: BufferedReader = new BufferedReader(new FileReader("scala/data/words.txt"))
      var line:String = br.readLine()
      while (line!=null){
        println(line)
        line = br.readLine()
      }

  //scala中的读取文件的方式
  //Source.fromFil 底层是使用了字节输入流读取数据FileInputStream
  val bs: BufferedSource = Source.fromFile("scala/data/words.txt")
  // getLines();返回的是一个迭代器对象, 使用迭代器的hasNext()、next() 方法进行数据的输出
  val lineIterator: Iterator[String] = bs.getLines()
      while (lineIterator.hasNext){
        val s: String = lineIterator.next()
        println(s)
      }

  // 既然返回的是一个迭代器,那么就可以使用for循环来进行输出
  for (e <- bs.getLines()) {
    println(e)
  }

  //java写文件
  /**
   * FileWriter对象被用作参数来创建一个BufferedWriter对象。
   * 这样,就可以通过BufferedWriter来写入字符,而实际的写入操作(包括可能的缓冲)将由BufferedWriter处理。
   */
  val bw = new BufferedWriter(new FileWriter("scala/data/words2.txt"))
  bw.write("写入数据!")
  // newLine()方法用于写入一个行分隔符
  bw.newLine()
  bw.write("太棒了!")
  //flush()方法用于将缓冲区中的数据强制写入到底层输出流(如FileWriter)中,并清空缓冲区。

  bw.flush()

  //TODO 纯scala中没有写文件的方式!!

}

异常抛出(与java中很像)

手动抛出异常:

val sc = new Scanner(System.in)
print("输入除数:")
val cs: Int = sc.nextInt()
if(cs!=0){
  println(10/cs)
}else{
  throw new ArithmeticException("您输入的除数是0")
}

使用try、catch捕获异常

def main(args: Array[String]): Unit = {
  /**
   *  scala中的异常和java的很像
   */
  try {
    println(10/2)
    val arr1: Array[Int] = Array(1, 2, 3, 4, 5)
    println(arr1(2))

    val br: BufferedReader = new BufferedReader(new FileReader("scala/data/words888.txt"))
        
    val sc = new Scanner(System.in)
    print("输入除数:")
    val cs: Int = sc.nextInt()
    
      println(10/cs)

    // 异常被捕获后,后续代码都可以运行
  }catch{
    //类似于sql语句中case when
    // 使用case来选择抛出的异常
    case e:ArithmeticException=>
      println("除0异常")
        e.printStackTrace()
    case e:ArrayIndexOutOfBoundsException=>
      println("数组越界异常")
    // TODO _ : 表示所有的异常都可以抛出,相当于Exception
    case _ =>
      println("出现异常")
  }finally {
    //TODO 用于确保无论是否发生异常,都会执行一段代码。
    //  今后finally中的处理大部分情况下都与释放资源有关
    println("这是finally代码块")
  }

  println("hello world")
}

scala中的函数

/**
 * def: 定义函数或者方法的关键字
 * main: 是函数或者方法的名字,符合标识符的命名规则
 * args: 函数形参的名字
 * Array[String]: 参数的数据类型是一个元素为字符串的数组
 * =: 后面跟着函数体(与Java中不同之处)
 * Unit: 等同于java中的void 表示无返回值的意思
 *
 *形式:
 * def main(args: Array[String]): Unit = {
 *
 * }
 *
 * 在不同的地方定义,称呼不一样
 * 函数:在object中定义的叫做函数
 * 方法:在class中定义的叫做方法
 */

object Demo5Function {
  def main(args: Array[String]): Unit = {
    //调用函数
    val res1: Int = add(3, 4)
    println(res1)


    // scala中的函数可以嵌套定义,函数中可以再定义函数
    def plus(x: Int, y: Int): Int = {
      return x + y
    }

    //调用必须在定义之后
    val res2: Int = plus(10, 20)
    println(res2)

    // 函数无法成功调用
//    val res3: Int = add2(11, 22)
//    println(res3)

    val d1: Demo1 = new Demo1()
    val res4: Int = d1.add2(11, 22)
    println(res4)

    //调用形式1:object中的函数可以使用类名调用,类似于静态一样
    val res5: Int = Demo5Function.add(100, 200)
    println(res5)

    //调用形式2:object中的函数调用时,可以省略类名
    val res6: Int = add(200, 300)
    println(res6)

    val res7: Int = fun1("1000")
    println(res7)

    //TODO 如果方法调用的函数只有一个参数的时候,可以将.和小括号用空格代替调用
    val res9: Int = Demo5Function.fun1("1000")
    val res8: Int = Demo5Function fun1 "1000"   //  "=" * 50 -> "=".*(50)
    println(res8)

    //TODO 如果定义的时候,没有小括号,调用的时候,就不需要加小括号(无需传入参数)
    show

  }

  //定义格式1:如果函数有返回值,且最后一句话作为返回值的话,return关键字可以不写
  def add3(a1: Int, b1: Int): Int = {
    a1 + b1
  }
  //定义格式2:如果函数体中只有一句实现,那么大括号也可以不写
  def add4(a1: Int, b1: Int): Int = a1 + b1

  //定义格式3:如果函数没有参数的时候,小括号省略不写
  def show= println("好好学习,天天向上!")



  //需求1:定义一个求两个数之和的函数,返回结果
  def add(a1: Int, b1: Int): Int = {
    return a1 + b1
  }

  def fun1(s:String): Int = {
    return s.toInt
  }


}


//TODO 函数或者方法必须定义在class或者object中,否则将会报错,无法进行编译
//def add2(a1: Int, b1: Int): Int = {
//  return a1 + b1
//}

class Demo1{
  //这里叫方法,将来调用时需要创建该类的对象才可以调用
  def add2(a1: Int, b1: Int): Int = {
    return a1 + b1
  }
}

递归调用

/**
 * scala中的函数也可以递归
 * 方法定义时,自身调用自身的现象
 *
 * 条件:要有出口(停止递归调用条件),不然就是死递归
 */
object Demo6Function {
  def main(args: Array[String]): Unit = {
    //求阶乘 5!
    val res1: Int = factorial(5)
    println(s"5的阶乘是$res1")

    println(s"5的阶乘是${Demo6Function factorial 5}")

  }

  def factorial(number: Int): Int = {
    if (number == 1) {
      1
    } else {
      number * factorial(number - 1)
    }
  }


}

scala中定义class类

object Demo7Class {
  def main(args: Array[String]): Unit = {
    //    val s1: Student = new Student()

    //    val s1: Student = new Student("张三",18)
    val s2: Student = new Student("张三", 18, "男")

    println(s2)

    //如果调用的是一个类的无参构造方法,new的时候小括号可以不用写
    val s3: Student2 = new Student2
    s3.fun1()

    //也可以使用多态的方式创建对象
    val s4:Object = new Student("张三111", 19, "男")
//    s4.fun1()
    println(s4.toString)
  }
}

/**
 * 可以在scala程序定义类
 * 类:构造方法 成员方法 成员变量
 *
 * 构造方法:
 * 1、在scala中构造方法的编写和在java中不太一样,类所拥有的大括号中都是构造代码块的内容
 * 2、默认情况下,每一个类都应该提供一个无参的构造方法
 * 3、构造方法可以有许多
 */
class Student(name: String, age: Int) {
  /**
   * 定义成员变量
   */
  val _name: String = name
  val _age: Int = age
  // _: 这个下划线,就表示将来不传值时,会赋予其默认值。String的默认值是一个特殊的值,即null
  var _gender: String = _

  /**
   * 构造方法也可以写多个
   */
    // TODO def this () :为重载的构造器,有着不同的参数列表,
    //  在创建类的对象时,若传递三个参数,则会使用该构造方法进行初始化对象
  def this(name: String, age: Int, gender: String) {
      /**
       * this():
       * 用于在辅助构造器中调用主构造器或其他辅助构造器,
       * 以确保对象被正确初始化。需要注意的是,this(...)调用必须是构造器体中的第一条语句。
       */
      this(name: String, age: Int)
      _gender = gender
  }

  //  println("好好学习,天天向上!")


  /**
   * 也可以重写方法
   * 此处定义的类的父类都是Object,重写继承自父类的toString方法
   */
  override def toString: String = {
    // 使用s"${}"的形式会报错
    "姓名:" + _name + ", 年龄:" + _age + ", 性别:" + _gender
  }

  //  override def toString: String = super.toString
}

class Student2{
  def fun1()={
    println("666")
  }
}

样例类

/**
 *  scala提供了一个非常好用的功能:样例类
 *  较少用户创建类所编写代码量,只需要定义成员变量即可,自动扩充成员变量,构造方法,重写toString方法
 */
object Demo8CaseClass {
  def main(args: Array[String]): Unit = {
    val t1 = new Teacher("小虎", 16, "学习")
    println(t1)
    println(t1.name)
    println(t1.age)
    println(t1.like)

    t1.like = "敲代码"
    println(t1)
  }
}

/**
 * 样例类中的成员变量,编译后默认是被jvm添加了final关键字,用户是改变不了的
 * 对于scala来说,默认是被val修饰的
 * 如果将来想要被改变,定义的时候需要使用var进行修饰
 */
case class Teacher(name:String,age:Int,var like:String)

伴生对象(apply方法)

object Demo9Apply {
  def main(args: Array[String]): Unit = {
        val b: Book1 = new Book1()
        b.apply() // 定义在class中是一个普通的方法


    // TODO: 若定义在object中,那么可以直接用Book("中华上下五千年", 999)的形式来调用这个方法
    val b1: Book = Book("中华上下五千年", 999)

    println(b1)
  }
}

class Book1 {
  def apply(): Unit = {
    println("哈哈哈")
  }
}

// TODO object Book 为 class Book的伴生对象
object Book {
  def apply(name:String,price:Int): Book = {
    new Book(name,price)
  }
}

class Book(name: String, price: Int) {
  val _name: String = name
  val _price: Int = price

  override def toString: String = "书名:" + _name + ", 价格:" + _price
}

scala面向函数式编程

/**
 * scala中的函数式编程
 *
 * 面向对象编程:将对象当作参数一样传来传去
 * 1、对象可以当作方法参数传递
 * 2、对象也可以当作方法的返回值返回
 * 当看到类,抽象类,接口的时候,今后无论是参数类型还是返回值类型,都需要提供对应的实现类对象
 *
 * 面向函数式编程:将函数当作参数一样传来传去
 * 1、函数A当作函数B的参数进行传递
 * 2、函数A当作函数B的返回值返回
 *
 * 在scala中,将函数也当作一个对象,对象就有类型
 * 函数在scala也有类型的说法
 * 函数的类型的形式为:
 * 参数类型=>返回值类型
 *
 */
将函数当作对象,赋值给类型是函数类型的变量
//是一个参数为字符串类型,返回值是整数类型的函数
    def fun1(s: String): Int = {
      s.toInt + 1000
    }

    val res1: Int = fun1("1000")
    println(res1)

    //定义变量的方式,定义一个函数
    //将函数当作对象,赋值给类型是函数类型的变量,将来可以直接通过变量调用函数
    val fun2: String => Int = fun1

    val res2: Int = fun2("2000")
    println(res2)
        
        
        
        
        
    /**
     * 函数A作为函数B的参数定义
     *
     * 本质上是将函数A的处理逻辑主体传给了函数B,在函数B中使用这个处理逻辑
     */
//     show1 show2 相当于函数A
//     fun1   相当于函数B
    //定义
        def fun1(f: String => Int): Int = {
          val a1: Int = f("1000")
          a1 + 3000
        }

        def show1(s:String): Int = {
          s.toInt
        }

        //调用
        val res1: Int = fun1(show1)
        println(res1)

        def show2(s: String): Int = {
          s.toInt+11111
        }

        val res2: Int = fun1(show2)
        println(res2)
            
            
            
            
            
      //定义一个函数fun1, 函数的参数列表中,既有正常的类型参数,也有函数类型的参数
    def fun1(s: String, f: String => Int): Int = {
      val a1: Int = f(s)
      a1 + 1000
    }

        def show1(s: String): Int = {
          s.toInt
        }

        def show2(s: String): Int = {
          s.toInt + 1111
        }

    //.....
        val res1: Int = fun1("2000", show2)
        println(res1)

    //使用lambda表达式改写函数作为参数传递的调用形式:(s: String) => s.toInt
    fun1("2000", (s: String) => s.toInt)
    fun1("2000", (s: String) => s.toInt+1000)

    //在scala中,数据类型可以自动类型推断
    fun1("2000", s => s.toInt+1000)
    //如果当作参数的函数的参数只在函数主体使用了一次,那么可以使用_代替
    fun1("2000", _.toInt+1000)

    val res2: Int = fun1("2000", _.toInt+1000)
    println(res2)

函数当作参数传递的应用

object Demo11Fun {
  def main(args: Array[String]): Unit = {
    val arr1: Array[Int] = Array(11, 22, 33, 44, 55)

    // for循环输出数组
    for (e <- arr1) {
          println(e)
        }

    // 定义一个函数
    def fun1(i: Int): Unit = {
      println(i*2)
    }

    //def foreach[U](f: A => U): Unit
    //foreach函数需要一个参数,它和数组元素一样的类型,返回值是Unit的函数
    //foreach函数的主要作用是将调用该方法的序列中的元素,依次取出并传递给传入的函数进行处理
    arr1.foreach(fun1)

    // scala自带的一个函数
    def println(x: Any) = Console.println(x)
    // Any可以接收任意的数据类型元素
    arr1.foreach(println)
  }
}

函数当作返回值返回

//定义返回值是函数的函数方式1:
    def fun1(s1: String): String => Int = {
      def show(s: String): Int = {
        s.toInt + s1.toInt
      }
      show
    }


    val resFun1: String => Int = fun1("1")
    val res1: Int = resFun1("1000")
    println(res1)
//定义方式2(是方式1的简化写法):

/**
 * 方式2这种将参数分开定义,今后调用时可以分开传递,这种做法,在scala中叫做函数柯里化
 *
 * 面试题:什么是函数柯里化?
 *  1、本身是一个数学界的一个名词,本意是原来一次传递多个参数,现在被改成了可以分开传递的形式,这种做法叫做柯里化
 *  2、在scala中体现柯里化,指的是函数的返回值也是一个函数,将来调用时参数可以分开传递。
 *  3、提高了程序的灵活性和代码复用性
 *  4、在scala中也可以通过偏函数实现参数分开传递的功能
 */
def fun1(s1: String)(s: String): Int = {
  s.toInt + s1.toInt
}

//调用函数的返回值是函数的方式1:
val resFun1: String => Int = fun1("1")
val r1: Int = resFun1("11")
println(r1)
val r2: Int = resFun1("12")
println(r2)
val r3: Int = resFun1("13")
println(r3)

    //调用方式2:
    val res2: Int = fun1("1")("1000")
    println(res2)

def function1(s1: String, s2: String): Int = {
  s1.toInt + s2.toInt
}
    val res1: Int = function1("1", "1000")
    println(res1)
/**
 * 偏函数
 */
//TODO 将第二个参数用 _ 代替,则会返回一个函数(由底层代码进行操作)
val f1: String => Int = function1("1", _)
val res1: Int = f1("1000")
val res2: Int = f1("2000")
val res3: Int = f1("3000")
println(s"res1:$res1,res2:$res2,res3:$res3")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux——进程间通信一(共享内存、管道、systrem V)

一、进程间通信介绍 1.1、进程间通信的概念和意义 进程间通信(IPC interprocess communication)是一组编程接口&#xff0c;让不同进程之间相互传递、交换信息(让不同的进程看到同一份资源) 数据传输:一个进程需要将它的数据发送给另外一个进程 资源共享:多个进程之间共享同样…

Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行

章节内容 上一节我们完成了&#xff1a; Metastore的基础概念配置模式&#xff1a;内嵌模式、本地模式、远程模式实机配置远程模式 并测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 V…

Hadoop-YARN-Tutorial

Hadoop-YARN-Tutorial 1 What is YARN? Yarn is the acronym for yet another resource negotiator. Yarn是yet another resource negotiator的缩写。 Yarn is a resource manager created by separating the processing engine and the management function of mapreduce. …

YOLOv8_obb数据集可视化[旋转目标检测实践篇]

先贴代码,周末再补充解析。 这个篇章主要是对标注好的标签进行可视化,虽然比较简单,但是可以从可视化代码中学习到YOLOv8是如何对标签进行解析的。 import cv2 import numpy as np import os import randomdef read_obb_labels(label_file_path):with open(label_file_path,…

ViewController 生命周期

ViewController 生命周期 ViewController 生命周期测试程序&#xff1a;ViewControllerLifeCircle ViewController 生命周期 ViewController 是 iOS 开发中 MVC 框架中的 C&#xff0c;ViewColllecter 是 View&#xff08;视图&#xff09;的 Collecter&#xff08;控制器&…

Vim编辑器与Shell命令脚本

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、Vim文本编辑器 二、编写Shell脚本 三、流程控制语句 四、计划任务服务程序 致谢 一、Vim文本编辑器 “在Linux系统中一切都是文件&am…

TQ15EG开发板教程:MPSOC创建fmcomms8工程

链接&#xff1a;https://pan.baidu.com/s/1jbuYs9alP2SaqnV5fpNgyg 提取码&#xff1a;r00c 本例程需要实现在hdl加no-OS系统中&#xff0c;通过修改fmcomms8/zcu102项目&#xff0c;实现在MPSOC两个fmc口上运行fmcomms8项目。 目录 1 下载文件与切换版本 2 编译fmcomms8项…

【SpringCloud】概述 -- 微服务入门

在Java的整个学习过程中&#xff0c;大家势必会听见一些什么分布式-微服务、高并发、高可用这些专业术语&#xff0c;给人的感觉很高级&#xff0c;有一种高深莫测的感觉。可以看一下这篇博客对这些技术架构的演变有一个初步的认识: 服务端⾼并发分布式结构演进之路-CSDN博客文…

Java开源ERP系统Axelor汉化方法初探

Axelor简介 汉化过程介绍 定义语言和本地化 导出多语言记录 导入翻译 验证翻译 调整翻译 Axelor简介 2024年6月份Axelor ERP发布了8.1版本&#xff0c;适配JDK11及PostgreSQL12及以上版本&#xff08;7及以前版本适配JDK8及PostgreSQL10&#xff09;数据库。v8版本较之前…

kubernetes集群部署:node节点部署和cri-docker运行时安装(四)

安装前准备 同《kubernetes集群部署&#xff1a;环境准备及master节点部署&#xff08;二&#xff09;》 安装cri-docker 在 Kubernetes 1.20 版本之前&#xff0c;Docker 是 Kubernetes 默认的容器运行时。然而&#xff0c;Kubernetes 社区决定在 Kubernetes 1.20 及以后的…

昇思MindSpore学习入门-评价指标

当训练任务结束&#xff0c;常常需要评价函数&#xff08;Metrics&#xff09;来评估模型的好坏。不同的训练任务往往需要不同的Metrics函数。例如&#xff0c;对于二分类问题&#xff0c;常用的评价指标有precision&#xff08;准确率&#xff09;、recall&#xff08;召回率&…

代码随想录算法训练Day58|LeetCode417-太平洋大西洋水流问题、LeetCode827-最大人工岛

太平洋大西洋水流问题 力扣417-太平洋大西洋水流问题 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个…

调度系统揭秘(下):调度算法与架构设计

文章目录 一、调度算法1.1、广度优先:1.2、深度优先1.3、总结广度优先搜索&#xff08;BFS&#xff09;深度优先搜索&#xff08;DFS&#xff09; 二、架构设计2.1、Master/Slave架构优劣分析 2.2、Leader架构优劣分析 2.3、总结 一、调度算法 在调度系统中&#xff0c;调度算…

【】AI八股-神经网络相关

Deep-Learning-Interview-Book/docs/深度学习.md at master amusi/Deep-Learning-Interview-Book GitHub 网上相关总结&#xff1a; 小菜鸡写一写基础深度学习的问题&#xff08;复制大佬的&#xff0c;自己复习用&#xff09; - 知乎 (zhihu.com) CV面试问题准备持续更新贴 …

本安防爆手机:危险环境下的安全通信解决方案

在石油化工、煤矿、天然气等危险环境中&#xff0c;通信安全是保障工作人员生命安全和生产顺利进行的关键。防爆智能手机作为专为这些环境设计的通信工具&#xff0c;提供了全方位的安全通信解决方案。 防爆设计与材料&#xff1a; 防爆智能手机采用特殊的防爆结构和材料&…

机械硬盘故障分析及损坏处理(坏道屏蔽)

机械硬盘故障分析&#xff1a; 1、加电后没有声音就是电机不转&#xff0c;是电路问题&#xff0c;更换电路板解决。 2、加电后电机转&#xff0c;有连续敲击声音&#xff0c;或有异响&#xff0c;磁头损坏或机械故障。 3、加电后电机转&#xff0c;运行正常&#xff0c;BIOS无…

建立数据通路(一)

指令周期(Instruction Cycle) 指令种类 Fetch(取得指令) 也就是从PC寄存器里找到对应的指令地址&#xff0c;根据指令地址从内存里把具体的指令&#xff0c;加载到指令寄存器中然后把PC寄存器自增&#xff0c;好在未来执行下一条指令 Decode(指令译码) 也就是根据指令寄存器里…

Apache Seata新特性支持 -- undo_log压缩

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata新特性支持 – undo_log压缩 Seata新特性支持 – undo_log压缩 现状 & 痛点…

类与对像(1)

好几个月没有写了&#xff0c;差了好多&#xff0c;这些天补回来吧。 接下来&#xff0c;让我们正式步入C与C语言开始不同的地方。 我对类的理解&#xff1a;类是对于具有相同或相似属性的数据集合。 类的关键词&#xff1a;class&#xff0c;public&#xff0c;protected&a…

2024年加密货币市场展望:L1、L2、LSD、Web3 和 GameFi 板块的全面分析与预测

随着区块链技术的快速发展&#xff0c;加密货币市场在2024年继续展现出蓬勃的生机和创新的潜力。本文将深入分析L1、L2、LSD、Web3和GameFi这五大板块的发展趋势和预测&#xff0c;帮助投资者和爱好者更好地理解和把握市场机遇。 一、L1&#xff1a;基础层协议的持续进化 L1&a…