Scala语言入门

2023-11-19

一.Scala安装

https://www.runoob.com/scala/scala-install.html

IDEA创建Scala项目
在这里插入图片描述
在这里插入图片描述

二.类和对象

1.Scala基本数据类型

基本与java类似,但首字符要大写

类型 说明
Byte -128-127
Short -32768-32767
Int -2147483648-2147483647
Long 64位
Float 32位单精度浮点数
Double 64位双精度浮点数
Char 16位无符号Unicode字符
Boolean true或者false
Unit 等同void
Null null或者空引用
Nothing 类的最底层
String 字符序列
Any 所有类的超类

Scala使用关键词 "var" 声明变量,使用关键词 "val" 声明常量,可以省略类型,会自动检测类型

val name = "song";  // 常量
var age = 18  // 变量
var num:Int = 10 // 变量
2.Scala定义类

属性定义:类的括号里可以定义参数,但必须指明类型,格式val 参数名:类型或者var 参数名:类型,可以看到,类似于java的有参构造函数,有了参数就有了构造,默认有set和get方法,只有var变量可以set

方法声明:def functionName ([参数列表]) : [return type]

class Person (){

  var name : String = _
  var age : Int = _

  println("1.父类的主构造器")

  def this(name : String,age : Int){
    this()
    println("2.父类的辅助构造器")
    this.name = name
    this.age = age
  }

  def printInfo() = {
    println(s"Person : $name,$age")
  }
}


class Teacher(name : String,age : Int) extends Person(){

  var address : String = _

  println("3.子类的主构造器")

  def this(name : String,age : Int,address : String){
    this(name,age)
    println("4.子类的辅助构造器")
    this.address = address
  }
    override def printInfo() = {
      println(s"Teacher : $name,$age,$address")
    }
}

object PsersonDemo {
  def main(args: Array[String]): Unit = {
    val jack: Person = new Person("jack", 36)
    println("=============================================")
    val teacher: Teacher = new Teacher("rose", 30, "gz")

    jack.printInfo()
    teacher.printInfo()
  }
}

在这里插入图片描述

枚举类

case class Schedule(name:String)

object Schedule{
  val day = Schedule("day")
  val hour = Schedule("hour")
}
3.Scala单例对象

在 Scala 中,是没有 static 这个关键字,但是它也为我们提供了单例模式的实现方法,那就是使用关键字object,object相当于java的单例,定义全是静态的

object Lesson_ClassAndObj {
  val name = "static test"  // 等同于java中用static声明的属性

  def main(args: Array[String]): Unit = {  // 主函数
    val person = new Person("song", 24) // 对象
    println(person.name); // get方法
    println(person.age);

    // 如果age是var类型  person.age = 18相当于调用set方法
    person.sayName() // 调用方法
  }
}

在这里插入图片描述

4.伴生对象

作用:实现类似Java中那种既有实例成员又有静态成员的类的功能,这样伴生对象中的属性或者方法就好像加上了一个java中static的关键字那样,可以通过类.属性或者类.method()

1.定义一个class并在这里面实现所有的实例成员

2.添加一个 object ,这个object 要与上面的class同名,然后在这里面实现所有的静态成员,也即伴生对象

3.定义的 class 与 object 必须在同一个文件内

当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员

apply()方法会帮助我们免除new关键字

// 普通类
class CompanionTest (val color : String) {

  private val name: String = "Java"

  def out(): Unit = {  // 访问伴生对象的私有属性  object.属性
    println("伴生对象的私有属性: " + CompanionTest.addrss)
  }

}

// 伴生对象,与类名字相同,可以访问类的私有属性和方法
object CompanionTest{

  private val addrss = "gz" // CompanionTest.address  等同于实现了java中的类.属性

  // 伴生类的实例
  private val companionTest: CompanionTest = new CompanionTest("red")


  def out2(): Unit = {
    println(companionTest.name)  // 访问伴生类的私有属性  实例.属性
  }

  def apply(color: String): CompanionTest = new CompanionTest(color)
}


object Test{
  def main(args: Array[String]): Unit = {
    // 免new apply方法
    val test: CompanionTest = CompanionTest("blue")
    println(test.color)
    test.out()
  }
}
5.控制抽象

控制抽象 主要在在一个方法中调用某个代码块 也没有返回值

object OpTest {
  def main(args: Array[String]): Unit = {
    // 柯里化
    def a (name : String)(op : => Unit): Unit ={
      println("我是控制抽象op前的操作" + "名字"+name)
      op
      println("我是控制抽象op后的操作" + "名字"+name)
    }

    // 方法中的代码块将作为op
    a("zhang"){
      println("我是op")
    }
    
  }
}

在这里插入图片描述

三.简单语法

1.if-else
object IfElse {
  def main(args: Array[String]): Unit = {
    var x = 30;

    if (x == 10) {
      println("X 的值为 10");
    } else if (x == 20) {
      println("X 的值为 20");
    } else if (x == 30) {
      println("X 的值为 30");
    } else {
      println("无法判断 X 的值");
    }
  }
}

在这里插入图片描述

2.循环
  • while 循环 运行一系列语句,如果条件为true,会重复运行,直到条件变为false
  • do…while 循环 类似 while 语句区别在于判断循环条件之前,先执行一次循环的代码块
  • for 循环 用来重复执行一系列语句直到达成特定条件达成,一般通过在每次循环完成后增加计数器的值来实现
  • break 语句 中断循环
object Circle {
  def main(args: Array[String]): Unit = {


    for(num <- 1 to 10){ // 1到10,包括10
      print(num+"-");
    }
    println()

    for(num <- 1 until(10,2)){  // 10到9,步长为2
      print(num+"-")
    }
    println()

    for(num <- 1 to 10 ; if(num % 2 == 0) ; if(num > 5)){ // 可以加判断条件
      print(num+"-")
    }
    println()

    // 局部变量
    var a = 1
    // do 循环
    do {
      print("Value of a: " + a +"-")
      a = a + 1
    } while ( {
      a < 3
    })

  }
}

在这里插入图片描述

3.方法

def functionName ([参数列表]) : [return type]

  • 如果有return,则必须指定返回值类型
  • 没有return,默认将最后一行计算的结果当做返回值
  • 传入的参数必须指定类型
object Method {
  def main(args: Array[String]): Unit = {

    def max(a:Int,b:Int):Int = {
      if(a > b) return a;
      else return b;
    }

//    def max(a:Int,b:Int):Int = {
//      if(a > b)  a else b;
//    }

    val result : Int = max(100,20);
    println(result)
  }
}

在这里插入图片描述
递归方法

递归方法必须指定返回值类型

def fun(num:Int):Int = {
  if(num == 1) return 1
  else return num * fun(num - 1)
}

println(fun(5))

有参数默认值的方法

def fun(a:Int=10,b:Int=20) = {
  a + b;
}
println(fun()) // 不覆盖
println(fun(100,300)) // 全部覆盖
println(fun(100)) // 覆盖a
println(fun(b = 50)) // 覆盖b

在这里插入图片描述
可变长参数的方法

def fun(s:String*)={
  s.foreach(elem=>{println(elem)})// 两种输出方式
  for(string <- s) println(string)
}

fun("zhang","liu","wang")

在这里插入图片描述
匿名函数

=>就是匿名函数

def fun = (a:Int,b:Int)=>{
     a+b
   }

println(fun(1,6))

在这里插入图片描述
嵌套

def fun(a:Int): Int ={

 def fun1(b:Int): Int ={
   if(b == 1) 1
   else b * fun1(b - 1)
 }

 fun1(a)

}

println(fun(5))

在这里插入图片描述
偏应用函数

def show(date:Date,log:String)={
  println(s"date is $date,log is $log")  // s $引用外部的属性
}

def fun = show(date = new Date(),_:String) // _ 占位符
fun("a")
fun("b")
fun("c")

在这里插入图片描述
方法参数是函数

类型指定(Int,Int) =>Int

def fun(f:(Int,Int)=>Int,s:String):String={
  val res:Int = f(100,200)
  res + ""+s
}

val result = fun((a:Int,b:Int)=>{a*b},"scala")
println(result)

在这里插入图片描述
返回值是函数

def fun(s:String):(String,String)=>String={
 def fun1(s1:String,s2:String):String={
   s + s1 + s2
 }

 fun1
}

println(fun("zhang")("liu","wang"))

在这里插入图片描述
方法参数和返回值都是函数

def fun(f:(Int,Int)=>Int,s:String):(String,String)=>String={
 val a:Int = f(100,200)

 def fun1(s1:String,s2:String):String={
   s1+s2+s+a.toString
 }

 fun1
}

val res = fun((a:Int,b:Int)=>{a+b},"hello")("zhang","kun")
println(res)

在这里插入图片描述
柯里化函数

def fun(a:Int,b:Int)(c:Int,d:Int)={
   a+b+c+d
 }
  println(fun(1,2)(3,4))

在这里插入图片描述

4.字符串
object StringTest {
  def main(args: Array[String]): Unit = {
    val s = "zhang"  // 普通字符串
    val s1 = "zhang1"

    val sb = new StringBuffer(); // 可变字符串
    sb.append(s).append("liu")

    println(sb)

    val i = s.compareTo(s1)  // compareTo
    println(i)

    println(s1.charAt(1)) // 索引

    val chars = s.toCharArray // 字符串转数组
    chars.foreach(c=>{print(c+" ")})

  }
}

在这里插入图片描述

5.数组
object ArrayTest {
  def main(args: Array[String]): Unit = {

    val array = Array[String]("ab","bc") // 直接赋值
    array.foreach(s=>{print(s + " ")})
    println()

    val array2 = new Array[Int](3) // 先声明再赋值,new不可以省略
    array2(0) = 2
    array2(1) = 3
    array2(2) = 10
    array2.foreach(num=>{print(num + " ")}) // 遍历数组
    println()


    val array3 = new Array[Array[Int]](3) // 二维数组 三行
    array3(0) = Array[Int](1,2,3,8)
    array3(1) = Array[Int](1,6,2)
    array3(2) = Array[Int](8,12,9)

    array3.foreach(arr=>{arr.foreach(num=>{print(num+" ")});println()}) // 遍历二维数组


    var myList1 = Array(1.9, 2.9, 3.4, 3.5)  // 合并数组
    var myList2 = Array(8.9, 7.9, 0.4, 1.5)
    var myList3 =  Array.concat(myList1, myList2)
    // 输出所有数组元素
    for ( x <- myList3 ) {
      print( x + " ")
    }
    println()

    var myArr = Array.range(10,20)// 区间数组
    myArr.foreach(num=>{print(num+" ")})

  }
}

在这里插入图片描述

6.集合

List

实际开发使用ListBuffer较多,创建时不使用new关键字,可以初始化ListBuffer,例如
ListBuffer[String](“kun”,“zhang”)

object ListTest {
  def main(args: Array[String]): Unit = {
    val list: List[String] = List[String]("hadoop", "spark")


    // List添加元素到最前面   注意 List是不可变的,这里只是生成了新的一个List了  List(brfore, hadoop, spark)
    println(list.+:("brfore") )
    // List添加元素到最后面 List(hadoop, spark, after)
    println(list :+ "after")

    val newList = list.+:("before")
    // 连接两个List List(hadoop, spark, before, hadoop, spark)
    println(list ::: newList)


    val list2: ListBuffer[Int] = ListBuffer[Int]()  // 可变ListBuffer
    list2.append(66)  // append添加元素
    list2.append(33,66,66,99) // append批量添加
    40 +=: list2 // +=: 加到前面
    println(list2) // ListBuffer(40, 66, 33, 66, 66, 99)

    list2 -= 66  // -=删除已知元素
    list2.remove(2) // 删除下标为index的元素

    list2.update(3,1000) // 改元素 index,new data
    println(list2(0)) // 根据索引查元素  40
  }
}



Set

object SetTest {
  def main(args: Array[String]): Unit = {
    val set = Set[Int](1,2,2,2,3,4,5)
    val set1 = Set[Int](4,5)

    set.foreach((num)=>print(num+" "))  // set有去重功能
    println()

    val ints = set.intersect(set1) // 集合差集 也可以 set & set1
    val ints1 = set.diff(set1) // 差集

    val set2 = mutable.Set[Int](1,2,3)  // 可变set
    set2 += 4
    set2 -= 2
    set2.foreach((num) =>{print(num+" ")})
    println()

  }
}

在这里插入图片描述

Map

object MapTest {
  def main(args: Array[String]): Unit = {
    val map = Map[String,Int]("aa"->20,("b",30),("b",40));

    val value = map.get("aa").get // 获取value 20

    for(elem <- map){  // 遍历map
      println(elem)
    }

    map.foreach(kv=>{ // 遍历集合
      println(kv)
    })

    val keys = map.keys // 获取所有键值

    keys.foreach(key=>{  // 遍历key获取value
      val value1 = map.get(key).get
      println(s"key == $key,value = $value1")
    })

    val values = map.values // 获取所有value

    val map1 = Map[String,Int]("aa"->20,("b",30),("c",40));
    val map2 = Map[String,Int]("aa"->30,("b",40),("c",50));

    val map3 = map1.++(map2)   // map2替换map1
    val map4 = map1.++:(map2)  // map1替换map2

    var map5 = Map[String,Int]()  // 可变map
    map5 += ("age" -> 20)
    map5 += ("length" -> 40)

    map5.foreach(println)

    val map6 = mutable.Map[String,Int]()  // 可变map

  }
}

在这里插入图片描述
Tuple

object TupleTest {
  def main(args: Array[String]): Unit = {
    // 元组可以存不同类型的元素
    val tuple = new Tuple1("zhang")
    val tuple2 = new Tuple2("zhang",'C')
    val tuple4 = new Tuple4("zhang", false, 'C', 16)

    val value = tuple2._1 // ._xx取值
    println(value)

    val value1 = tuple4._4
    println(value1)

    val iterator = tuple4.productIterator  // 遍历,只能先拿到迭代器
    iterator.foreach(value=>{println(value)})

  }
}

在这里插入图片描述

四.常用语法

1.Trait

Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大

与接口不同的是,它还可以定义属性和方法的实现

一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承

Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait

trait Audi{
  val name = "Audi"
  def runAudi(time:Int)={
    println(name+"running....."+time)
  }
}

trait Benz{
  val name1 = "Benz"
  def runBenz(time:Int)={  // 实现的方法
    println(name1+"running....."+time)
  }

  def recreate():String  // 未实现的方法
}

class Car extends Audi with Benz {   // 继承第一个用extends,第二个用with
  override def recreate(): String = {
    "recreate.."
  }
}

object TraitTest {
  def main(args: Array[String]): Unit = {
    val car = new Car
    car.runBenz(10)
    car.runAudi(20)
  }

}

在这里插入图片描述

2.Match

一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式

case _ 什么都不匹配
可以匹配类型,也可以匹配值

object MatchTest {
  def main(args: Array[String]) {
    println(matchTest("two"))
    println(matchTest("test"))
    println(matchTest(1))
    println(matchTest(6))
    println("偏函数"+myTest("ooo"))

  }
  def matchTest(x: Any): Any = x match {
    case 1 => "one"
    case "two" => 2
    case y :Int => "scala.Int"  // 匹配Int类型
    case _ => "no match" // case _ 什么都不匹配,类似 switch 中的 default
  }

  def myTest:PartialFunction[String,Int] = {  // 偏函数相比match没有match了,匹配String,返回Int
    case "abc" => 22
    case "bcd" => 66
    case _ => 84
  }
}

在这里插入图片描述

3.样例类

当我们定义一个样例类,编译器自动帮助我们实现了apply方法,无需new关键字,而且自动实现了以下的方法

toString方法:可直接调用

equals方法:可以直接使用==比较两个样例类是否相等,即所有的成员变量是否相等

hashCode方法:样例类自动实现了hashCode方法,如果所有成员变量的值相同,则hash值相同,只要有一个不一样,则hash值不一样

copy方法:样例类实现了copy方法,可以快速创建一个相同的实例对象,可以使用带名参数指定给成员进行重新赋值

使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类,经过优化以用于模式匹配,默认有get和set(对var类型)方法

object CaseClass {
  def main(args: Array[String]) {
    val alice = Person("Alice", 25)
    val bob = Person("Bob", 32)
    val charlie = Person("Charlie", 32)

    for (person <- List(alice, bob, charlie)) {
      person match {
        case Person("Alice", 25) => println("Hi Alice!")
        case Person("Bob", 32) => println("Hi Bob!")
        case Person(name, age) =>
          println("Age: " + age + " year, name: " + name )
      }
    }
  }
  // 样例类
  case class Person(name: String, age: Int)
}

在这里插入图片描述

4.隐式值与隐式参数
  • 用implicit修饰的值就是隐式值
  • 用implicit修饰参数就是隐式参数,注意,如果方法中部分参数是隐式参数,必须使用柯里化的方式

作用

当调用方法时,不必手动传入方法中隐式参数,Scala会自动在作用域内寻找隐式值并自动传入,所以在一个作用域内不能定义多个类型一样的隐式值

object ImplicitTrans {
  def main(args: Array[String]): Unit = {
    implicit val name:String = "zhang"  // implicit声明隐式值柯里化的方式

    def sayName(age:Int)(implicit name:String) ={  // 
      println(s"$name is student... age = $age")
    }

    sayName(10)

  }
}

在这里插入图片描述

5.隐式转换函数

作用

实现类中方法的共享

class Red{
  def sayWho()={
    println("Red Red Red")
  }
}

class Green{

}

object ImplicitTest {

  implicit def greenToRed(green: Green):Red = {  // 隐式函数
    new Red
  }

  def main(args: Array[String]): Unit = {
    val green = new Green
    green.sayWho()
  }

}

在这里插入图片描述
上面的例子中,创建了green对象,但我想用Red类中的方法,于是我就声明一个隐式函数,传入green对象,返回一个red对象,就可以调用了

注意:相同作用域内,不可以定义相同的传入参数和返回类型相同的隐式函数

6.隐式类
class Dog{
  
}
object ImplicitClass {
  implicit class Animall(dog: Dog){
    def sayName(): Unit ={
      println("dog隐式类...")
    }
  }

  def main(args: Array[String]): Unit = {
    val dog = new Dog
    dog.sayName    // 创建了一个dog对象
  }
}

创建了一个dog对象,调用了sayName方法,但实际类中是没有这个方法的,于是就去找有没有一个隐式类,参数是Dog类型的,有的话就可以调用里面的方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala语言入门 的相关文章

  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 如何使用 Spark 2 屏蔽列?

    我有一些表 我需要屏蔽其中的一些列 要屏蔽的列因表而异 我正在读取这些列application conf file 例如 对于员工表如下所示 id name age address 1 abcd 21 India 2 qazx 42 Ger
  • Scala中有类似Java Stream的“peek”操作吗?

    在Java中你可以调用peek x gt println x 在 Stream 上 它将对每个元素执行操作并返回原始流 这与 foreach 不同 foreach 是 Unit Scala 中是否有类似的东西 最好是适用于所有 Monady
  • andThen 类型不匹配的 Scala 链接函数

    我有一堆函数可以清理文本并将它们分成单词 最小的例子 val txt Mary had a little nlamb val stopwords Seq a def clean text String String text replace
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 具有继承类型的 Aux 模式推理失败

    我有一个复杂的玩具算法 我希望纯粹在类型级别上表示 根据饮食要求选择当天菜肴的修改 对卷积表示歉意 但我认为我们需要每一层才能达到我想要使用的最终界面 我的代码有一个问题 如果我们表达一个类型约束Aux 模式生成的类型基于另一个泛型类型 它
  • IntelliJ:线程“主”java.lang.NoClassDefFoundError中的异常:org/apache/spark/sql/types/DataType

    附言 有一个类似的问题here https stackoverflow com questions 40287289 java lang noclassdeffounderror org apache spark logging 但那是在
  • 获取SettingKey[T]的值

    我正在开发一个用于文档生成的插件 我想将所有生成的文件输出到我选择的目录中 该目录可以是SBT的子目录target目录 如下 val newTargetDirectory SettingKey File document target di
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • Kafka 分区键无法正常工作

    我正在努力解决如何正确使用分区键机制的问题 我的逻辑是设置分区号为3 然后创建三个分区键为 0 1 2 然后使用分区键创建三个KeyedMessage 例如 KeyedMessage 主题 0 消息 KeyedMessage 主题 1 消息
  • Java 拥有闭包后 Scala 的优势 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着 Java 中添加了闭包 作为语言选择 Scala 相对于 Java 的优势是什么 有人可以详细说明一下有什么优点吗 除了闭包 J
  • 在spark-kafka中使用schema将ConsumerRecord值转换为Dataframe

    我正在使用 Spark 2 0 2 和 Kafka 0 11 0 并且 我正在尝试在火花流中使用来自卡夫卡的消息 以下是代码 val topics notes val kafkaParams Map String Object bootst
  • 使用 scalapb 在 Spark Streaming 中解码 Proto Buf 消息时出错

    这是一个 Spark Streaming 应用程序 它使用编码的 Kafka 消息Proto Buf Using scalapb图书馆 我收到以下错误 请帮忙 gt com google protobuf InvalidProtocolBu
  • 将下划线分配给变量。下划线是做什么的?

    最近我遇到了这样的代码 var myVariable variableKind 这似乎是一种分配方式null to myVariable 谁能解释一下背后的理由 在这种情况下 分配之间有什么区别 and null到一个变量 它使用默认值初始
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • 如何使方法通用而不出现“未找到匹配的形状”

    除了编写大量样板文件之外 我不知道如何克服这个 找不到匹配的形状 错误 要点中说明的基本思想是 我有一个非常基本的方法版本 有效 但非常具体 然后是一个采用mapper参数并且更通用 也可以工作 但特定于一种特定类型 然后是第三个版本 它采
  • ScalaTest v3:为什么需要实现convertToLegacyEqualizer

    Using 斯卡拉测试3 0 0 http www scalatest org install环境 Scala 2 11 8 sbt 0 13 5 IntelliJ 14 1 4 build sbt 只有 NOTE not using or

随机推荐

  • response实现文件下载(java)

    import javax servlet ServletException import javax servlet ServletOutputStream import javax servlet http HttpServlet imp
  • 阿里云多台内网ECS公用一条EIP实现访问外网

    第一步 开启ECS的ip转发功能 有公网的ECS上操作 1 vi etc sysctl conf 找到 net ipv4 ip forward 1 这一条 确保后面的值为1就行 如果没有这一条 手动加进去 保存退出 然后使用 sysctl
  • Linux内核源码学习(1)

    一 内核简介 1 在安装好的Linux系统中 内核的源代码位于 usr src linux 2的10次方就是1K 1024 16位CPU的地址空间是64K X86结构的80386是32位CPU 段描述结构伪代码 typedef struct
  • java.lang.Long cannot be cast to java.lang.Integer解决办法

    Integer属于不可更改类型 而且Long和Integer没有任何继承关系 当然不能这样转换 例如 public Integer getUsersCount String hql select count from Users List
  • vscode实现文件单步调试保姆级教程

    第一步 第二步 第三步 第四步 第五步 第六步 第七步 第八步 第九步 第十步 点击终端 gt 配置任务 第十一步 第十二步 第十三步 第十四步 设置完毕 可以在源程序打断点按F5执行了
  • Spring中Quartz的详细配置

    关于cron表达式 来自网络 Cron 表达式包括以下 7 个字段 秒 分 小时 月内日期 月 周内日期 年 可选字段 特殊字符 Cron 触发器利用一系列特殊字符 如下所示 反斜线 字符表示增量值 例如 在秒字段中 5 15 代表从第 5
  • 常见状态码

    SWITCH PROTOCOL 101 Switching Protocols OK 200 OK CREATED 201 Created ACCEPTED 202 Accepted NO CONTENT 204 No Content PA
  • 雷军 1994 年写的代码,经典老古董~

    整合整理 程序员的那些事 id iProgrammer 雷军的代码像诗一样优雅 有些网友在评论中质疑 说雷军代码不会是 屎 一样优雅吧 说这话的网友 也许是开玩笑的 也许是真没看过雷军写过的代码 在 2011 年的时候 我们在微博转过雷军在
  • 《计算机网络》——第四章知识点

    1 终点不可达 当路由器或主机不能交付数据报时就向源点发送终点不可达报文 无法交付 源点抑制 当路由器或主机由于拥塞而丢弃数据报时 就向源点发送源点抑制报文 使源点知道应当把数据报的发送速率放慢 拥塞丢数据 3 时间超过 当路由器收到生存时
  • [UE5蓝图基础一]13.类似”人类一败涂地”掉落一定距离会回到空中 最终着落点还是设定地形上

    利用合体触发器Box Conllision 目标点 在放置actor里 实现 修改盒体范围为2W 当人物与盒子重叠就瞬移到空中
  • 苹果美区app内购方法及经验

    苹果美区app内购方法及经验 方法一 礼品卡 失败 淘宝or亚马逊购买苹果礼品卡 经测试账号充值成功 也可以购买付费app 但内购会经典限购 等了n周依然没有解除 如果养号成功大概就没什么问题 但苯人等不及了 方法二 美区转国区 实在太想氪
  • 编译安装mysql5.7.10

    1 gt cmake MySQL使用cmake跨平台工具预编译源码 用于设置mysql的编译参数 如 安装目录 数据存放目录 字符编码 排序规则等 安装最新版本即可 2 gt make3 75 mysql源代码是由C和C 语言编写 在Lin
  • 算法 {掃描線}

    算法 掃描線 掃描線 定義 題目 二維空間上 給定若干個 凸多邊形 求他們的並集的面積 思路 用若干個x 與Y軸平行的線 將目標區域T劃分成若干個子區域Ai 即S A1 A2 然後單獨求每個Ai 性質 與積分有點類似 都是求一個區域的面積
  • SQLite、MySQL和PostgreSQL 三种关系数据库哪个好?

    https www ssdax com 2188 html
  • 优化MyBatisPlus的autoResultMap生成策略

    前言 使用MyBatis Plus的字段类型处理器 只需一个注解 就可以很方便的将数组 对象等数据直接映射到实体类中 Data Accessors chain true TableName autoResultMap true public
  • Android 12读写存储卡权限申请

  • mysql报错:Host is not allowed to connect to this MySQL server(设置远程连接)

    一般出现在 localhost可以连接mysql 但是远程不行 输入shell命令 mysql u root p 然后输入密码进入mysql mysql命令行输入 use mysql update user set host where u
  • Linux-centos

    目录 一 Linux入门概述 1 1概述 1 2 下载地址 1 3 Linux特点 1 4 Linux和Windows区别 二 Linux目录结构 2 1 概览 2 2 树状目录结构 三 VI VIM编辑器 3 1 概述 3 2 测试数据准
  • 链队列的基本操作

    define CRT SECURE NO WARNINGS 链栈 include
  • Scala语言入门

    Scala入门 一 Scala安装 二 类和对象 1 Scala基本数据类型 2 Scala定义类 3 Scala单例对象 4 伴生对象 5 控制抽象 三 简单语法 1 if else 2 循环 3 方法 4 字符串 5 数组 6 集合 四