
能力说明:
精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明Scala函数的使用 1、定义 def 方法名(参数名: 参数类型): 返回值类型 = {//方法体} /** * @author Gjing **/ object Test { def main(args: Array[String]): Unit = { sayHello("Hello") } def sayHello(text: String):Unit = { println(text) } } 如果你不写等于号和方法主体,那么方法会被隐式声明为抽象(abstract),包含它的类型于是也是一个抽象类型。 2、默认值 调用方法时如果为传参,则会使用默认值 /** * @author Gjing **/ object Test { def main(args: Array[String]): Unit = { sayWorld() } def sayWorld(text: String = "World"):Unit = println(text) } 3、命名参数 可通过参数名指定你当前设置的值是哪一个参数 /** * @author Gjing **/ object Test { def main(args: Array[String]): Unit = { nameTest(text1 = "hello",text2 = "world") } def nameTest(text1: String, text2:String): Unit = { println(text1, text2) } } 4、可变参数 不限制参数的数量,如Java1.5出现的... /** * @author Gjing **/ object Test { def main(args: Array[String]): Unit = { varTest(1,2,3,4) } def varTest(a: Int*):Unit = println(a) } 5、条件表达式 和java类似 object Test { def main(args: Array[String]): Unit = { if (1 == 1) println(true) else println(false) } } 6、循环表达式 在循环时很多时候会用到区间,scala提供了两种方式,分别为to和until, to关键字会包含右边的值,比如1 to 10,此时循环输出会是1-10;until不包含, 循环输出会是1-9 a、while 运行一系列语句,如果条件为true,会重复运行,直到条件变为false object Test { def main(args: Array[String]) { // 局部变量 var a = 10; // while 循环执行 while( a < 20 ){ println( "Value of a: " + a ); a = a + 1; } } } b、for 用来重复执行一系列语句直到达成特定条件达成,一般通过在每次循环完成后增加计数器的值来实现 object Test { def main(args: Array[String]) { // for 循环 for( a <- 1 to 10){ println( "Value of a: " + a ); } } } c、do while 条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次 object Test { def main(args: Array[String]) { // 局部变量 var a = 10; // do 循环 do{ println( "Value of a: " + a ); a = a + 1; }while( a < 20 ) } }
Scala 提供了强大的模式匹配机制,应用也非常广泛。一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式 一、语法 变量 match { case value1 => 代码1 case value2 => 代码2 ... } match 对应 Java 里的 switch,但是写在选择器表达式之后。即: 选择器 match {备选项}。 match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配 二、简单案例 /** * @author Gjing **/ object MatchApp { def main(args: Array[String]) { // 打印 many println(matchTest(3)) } def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many" } } 三、类型匹配 /** * @author Gjing **/ object MatchApp { def main(args: Array[String]) { println(matchTest2("test")) println(matchTest2(6)) } def matchTest2(x: Any): Any = x match { case x: String => "Scala.String" case y: Int => "scala.Int" case _ => "many" } } 实例中第一个 case 对应整型数值 1,第二个 case 对应字符串值 two,第三个 case 对应类型模式,用于判断传入的值是否为整型,相比使用isInstanceOf来判断类型,使用模式匹配更好。第四个 case 表示默认的全匹配备选项,即没有找到其他匹配时的匹配项,类似 switch 中的 default 四、条件匹配 /** * @author Gjing **/ object MatchApp { def main(args: Array[String]) { println(matchTest3(1)) println(matchTest3("hello")) println(matchTest3(2)) } def matchTest3(value: Any): Any = value match { case 1 => "输入的是:1" case _ if (value.equals("hello")) => "world" case _ => value } } 如果输入的不是1,那么会先进行条件判断,满足第二个case的话会走第二个case,否则会走最后一个case 五、数组匹配 /** * @author Gjing **/ object MatchApp { def main(args: Array[String]) { // 满足第一个case println(matchTest4(Array(1))) // 不满足第一个和第二个 println(matchTest4(Array(1,2))) // 满足第二个 println(matchTest4(Array(2))) } def matchTest4(x: Array[Any]): Int = x match { case Array(1) => 1 case Array(2, _*) => 666 case _ => 0 } } 六、List匹配 和数组过滤类似,这里不再讲解,可以自己玩几把 七、样例类匹配 使用了case关键字的类定义就是就是样例类(case class),样例类是种特殊的类,经过优化以用于模式匹配 /** * @author Gjing **/ object MatchApp { def main(args: Array[String]): Unit = { println(matchTest5(Person("张三"))) println(matchTest5(Person("李四"))) println(matchTest5(Person("老王"))) } def matchTest5(x:Person):String = x match { case Person("张三") => "张三" case Person("李四") => "李四" case _ => "xx" } } // 样例类 case class Person(name: String) 八、异常处理 /** * @author Gjing **/ object MatchApp { def main(args: Array[String]): Unit = { try { val i = 10 / 0 println(i) } catch { case e: ArithmeticException => println("除数不能为0") case e:Exception => println("最大异常") }finally { // 资源释放的东西,和java类似 } } }
一、数组 Scala 语言中提供的数组是用来存储固定大小的同类型元素,数组对于每一门编辑应语言来说都是重要的数据结构之一。数组的第一个元素索引为0,最后一个元素的索引为元素总数减1 1、声明数组 不可变数组 /** * @author Gjing **/ object ArrayApp { def main(args: Array[String]): Unit = { // 声明一个长度为2的不可变数组 val arr = new Array[String](2) // 赋值 arr(0) = "java" arr(1) = "scala" // 使用另外一种方式声明数组 val arr2 = Array("java","scala") } } 不可变数组 /** * @author Gjing **/ object ArrayApp { def main(args: Array[String]): Unit = { val buffer = ArrayBuffer[String]() // 追加一个值 buffer += "java" // 追加一个数组 buffer ++= Array("scala", "vue") } } 2、数组的处理 列出常见的一些操作,其余的自行查阅文档 循环输出 /** * @author Gjing **/ object ArrayApp { def main(args: Array[String]): Unit = { val arr = Array("java", "scala") for (x <- arr) { println(x) } } } 合并数组 /** * @author Gjing **/ object ArrayApp { def main(args: Array[String]): Unit = { val arr = Array("java", "scala") val arr2 = Array("vue", "go") // 这种方式需要引入 import Array._ val arr3 = concat(arr, arr2) // 直接调用 val arr4 = arr.concat(arr2) } } 二、List List的特征是其元素以线性方式存储,集合中可以存放重复对象。 1、创建List 定长list /** * @author Gjing **/ object ListApp { def main(args: Array[String]): Unit = { // 数字列表 var l1 = List(1, 2, 3, 4) var l2 = 1 :: 2 :: 3 :: Nil // 生成空列表 var l3 = Nil } } 构造列表的两个基本单位是 Nil 和 :: Nil 也可以表示为一个空列表。 不定长 /** * @author Gjing **/ object ListApp { def main(args: Array[String]): Unit = { val l = ListBuffer[Int]() // 加一个元素 l += 2 // 加入多个元素 l += (3,4) // 加入一个集合 l ++= List(5,6) // 打印 2,3,4,5,6 println(l.mkString(",")) } } 2、列表的操作 基本操作(返回第一个元素、返回第一个元素以外的列表、判断列表是否为空) /** * @author Gjing **/ object ListApp { def main(args: Array[String]): Unit = { var l = List(1,2,3) // 打印 1 println(l.head) // 打印 List(2,3) println(l.tail) // 打印false println(l.isEmpty) } } 拼接 /** * @author Gjing **/ object ListApp { def main(args: Array[String]): Unit = { val l1 = List(1, 2, 3) val l2 = List(3,4) val l3 = l1 ::: l2 // 较第一种是后者加进去后再列表前面 val l4 = l1.:::(l2) val l5 = List.concat(l1,l2) println(l3.mkString(",")) println(l4.mkString(",")) println(l5.mkString(",")) } } 列表反转 /** * @author Gjing **/ object ListApp { def main(args: Array[String]): Unit = { val l1 = List(1, 2, 3) // 打印 3,2,1 println(l1.reverse.mkString(",")) } } 创建一个指定重复数量的元素列表 /** * @author Gjing **/ object ListApp { def main(args: Array[String]): Unit = { val l1 = List.fill(2)(1) // 打印 1,1 println(l1.mkString(",")) } } 三、Set Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象, 用法和list差不多,这里不过多介绍 四、Map Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。默认情况下 Scala 使用不可变 Map。如果你需要使用可变集合,你需要显式的引入import scala.collection.mutable.Map 类在 Scala 中 你可以同时使用可变与不可变 Map,不可变的直接使用 Map,可变的使用 mutable.Map 1、创建Map /** * @author Gjing **/ object MapApp { def main(args: Array[String]): Unit = { // 空map val m1 = Map() // 存在键值对 var m2 = Map("名字" -> "张三", "年龄" -> 12) println(m2.mkString(",")) // 加一个新的键值对进去 m2 += ("性别" -> "男") println(m2.mkString(",")) } } 2、基本操作 /** * @author Gjing **/ object MapApp { def main(args: Array[String]): Unit = { var m2 = Map("名字" -> "张三", "年龄" -> 12) // 返回所有key println(m2.keys) // 返回所有value println(m2.values) // 判断是否为空 println(m2.isEmpty) } } 3、合并 你可以使用 ++ 运算符或 Map.++() 方法来连接两个 Map,Map 合并时会移除重复的 key /** * @author Gjing **/ object MapApp { def main(args: Array[String]): Unit = { val map1 = Map("年龄" -> "12") val map2 = Map("性别" -> "男") println(map1 ++ map2) println(map1.++(map2)) } } 4、查看 Map 中是否存在指定的 Key object MapApp { def main(args: Array[String]): Unit = { var m1 = Map("名字" -> "张三", "年龄" -> 12) // 打印 true println(m1.contains("名字")) } } 四、元组 元组是不同类型的值的集合,与列表一样,元组也是不可变的,但与列表不同的是元组可以包含不同类型的元素 1、定义元组 /** * @author Gjing **/ object TupleApp { def main(args: Array[String]): Unit = { val t1 = (1, "呢", 1.1) val t2 = new Tuple3(1, "呢", 1.1) } } 元组的实际类型取决于它的元素的类型,比如 (99, "runoob") 是 Tuple2[Int, String], 目前 Scala 支持的元组最大长度为 22。对于更大长度你可以使用集合,或者扩展元组 2、访问元组 /** * @author Gjing **/ object TupleApp { def main(args: Array[String]): Unit = { val t1 = (1, "呢", 1.1) // 获取元组第一个内容 println(t1._1) // 获取元组第二个内容 println(t1._2) } } 3、元组的迭代 /** * @author Gjing **/ object TupleApp { def main(args: Array[String]): Unit = { val t1 = (1, "呢", 1.1) t1.productIterator.foreach(e => println(e)) } } 4、元组转字符串 /** * @author Gjing **/ object TupleApp { def main(args: Array[String]): Unit = { val t1 = (1, "呢", 1.1) println(t1.toString()) } }
讲述Scala中的面向对象相关知识点 一、特征 封装:属性和方法封装在类中 继承:父类和子类的一个关系 多态:父类引用指向子类对象 二、类的定义和使用 类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间 /** * @author Gjing **/ class Person { // 定义属性,Scala会自动帮var类型的属性生成get、set,val类型的属性生成get var name = "" val age = 10 // 可通过下划线作为一个占位符,使用占位符时就不允许使用val了 var idCard: String = _ def eat(): Unit = { println(name + "吃饭。。。") } } object Test { def main(args: Array[String]): Unit = { val person = new Person() person.name = "张三" person.idCard = "1234" person.eat() println(person.idCard) } } 三、主构造器与附属构造器 /** * @author Gjing **/ class Men(name: String, age: Int) { // 定义属性 var userName: String = name var userAge: Int = age var idCard: String = "" // 附属构造器 def this(name: String, age: Int, idCard: String) { this(name, age) this.idCard = idCard } } 四、继承 /** * @author Gjing **/ class Son(name: String, age: Int, val city: String) extends Men(name, age) { } object Test2 { def main(args: Array[String]): Unit = { val son = new Son("张三", 11, "厦门") println(son.city) println(son.userAge) println(son.userName) } } 五、重写 重写一个非抽象方法必须使用override修饰符;在子类中重写超类的抽象方法时,你不需要使用override关键字 /** * @author Gjing **/ class Son(name: String, age: Int, val city: String) extends Men(name, age) { override def toString: String = s"Son($name,$age,$city)" } 六、抽象类 /** * @author Gjing **/ abstract class Food { def name():Unit } class Apple extends Food { def name(): Unit = { print("Apple") } } 七、伴生类和伴生对象 如果有一个class和一个同名的object,那么就称这个object是class的伴生对象,class是object的伴生类 /** * @author Gjing **/ class ApplyTest { def apply(): Unit = { println("Executor class apply...") } } object ApplyTest { // 最佳实践,在object的apply方法去new class def apply(): ApplyTest = { println("Executor object apply...") new ApplyTest() } } object Test3 { def main(args: Array[String]): Unit = { // 直接通过类名加括号 是调用object中的apply方法 val test = ApplyTest() // 对象加括号,是调用class中的apply方法 test() } }
一、Scala概述 Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性。Scala把Erlang风格的基于actor的并发带进了JVM。开发者可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序,它会自动获得多核心处理器带来的优势,而不必依照复杂的Java线程模型来编写程序。Scala 运行在Java虚拟机上,并兼容现有的Java程序。Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库 二、Scala的安装 Scala下载地址 三、Scala使用入门 1、交互式 scala> 1+3 res0: Int = 4 scala> println("Hello World") Hello World 2、代码方式 object Test { def main(args: Array[String]): Unit = { println("Hello World") } } 四、Scala入门 1、基本数据类型 数据类型 描述 Byte 8位有符号补码整数。数值区间为 -128 到 127 Short 16位有符号补码整数。数值区间为 -32768 到 32767 Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 Float 32 位, IEEE 754 标准的单精度浮点数 Double 64 位 IEEE 754 标准的双精度浮点数 Char 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF String 字符串 Boolean true或false Unit 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 Null null 或空引用 Nothing Nothing类型在Scala的类层级的最底端;它是任何其他类型的子类型 Any Any是所有其他类的超类 AnyRef AnyRef类是Scala里所有引用类(reference class)的基类 上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的 2、变量 变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间。基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你可以在这些变量中存储整数,小数或者字母 a、变量声明 在 Scala 中,使用关键词 "var" 声明变量,使用关键词 "val" 声明常量 # 以上定义了变量 myVar,我们可以修改它 var myVar : String = "Foo" # 定义了常量 myVal,它是不能修改的。如果程序尝试修改常量 myVal 的值,程序将会在编译时报错 val myVal : String = "Foo" b、变量类型声明 变量的类型在变量名之后等号之前声明。定义变量的类型的语法格式如下 var age: Int = [Initial value] val name: String = [Initial value] c、变量类型引用 在 Scala 中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来的。所以,如果在没有指明数据类型的情况下声明变量或常量必须要给出其初始值,否则将会报错 var myVar = 10; val myVal = "Hello, Scala!"; d、Scala 多个变量声明 val a,b = 100 3、访问修饰符 Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。如果没有指定访问修饰符,默认情况下,Scala 对象的访问级别都是 public。Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员 a、私有(private) 用 private 关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用内部类 class Outer{ class Inner{ private def f(){println("f")} class InnerMost{ f() // 正确 } } (new Inner).f() //错误 } (new Inner).f( ) 访问不合法是因为 f 在 Inner 中被声明为 private,而访问不在类 Inner 之内。但在 InnerMost 里访问 f 就没有问题的,因为这个访问包含在 Inner 类之内。Java中允许这两种访问,因为它允许外部类访问内部类的私有成员 b、保护(protected) 在 scala 中,对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的的类的子类中被访问。而在java中,用protected关键字修饰的成员,除了定义了该成员的类的子类可以访问,同一个包里的其他类也可以进行访问 package p{ class Super{ protected def f() {println("f")} } class Sub extends Super{ f() } class Other{ (new Super).f() //错误 } } c、公共(Public) Scala中,如果没有指定任何的修饰符,则默认为 public。这样的成员在任何地方都可以被访问 class Outer { class Inner { def f() { println("f") } class InnerMost { f() // 正确 } } (new Inner).f() // 正确因为 f() 是 public }
2020年10月
2020年08月
2019年11月
环境一致性,容器化部署,部署更加的简单
你可以配置tomcat的超时时间
JPA里面会把你声明的接口注入一个代理对象,详细的你可以看我的这篇文章:SpringBoot使用JPA
看你运行什么项目啊,这个无法推荐的,根据项目来定
仔细问题
SpringBoot、SpringCloud系列,Mysql、redis、RabbitMQ。。。。
可以考虑用docker啊
保证多个操作要么全部成功,要么一个都不成功
使用SpringBoot+Mysql+redis即可
索引、大内容分表存放
redis和消息队列都行啊,要看你具体应用场景了
使用JPA
建议跟随文档学,书籍很多东西会出现过时的情况
Spring对servlet进行了封装,SpringBoot简化了Spring开发的配置
不能共享,因为你zuul和其他服务不在同一个jvm,你可以借助于redis
==是比较两个的地址,equals是比较其中的内容