Scala入门随笔一

1.scala变量有两种定义方式,一种是用val关键字定义的,另一种是用var定义的,val相当于java里面的final关键字,用它定义后的变量,其值不能进行更改,但var则可以。scala可以根据变量值来自动推断出变量的具体数据类型,也可以由我们自己来显示的声明变量值的类型。此外,两种方式定义的变量必须要进行初始化赋值,否则运行时会报错。(赋值时也可以通过占位符“_”进行初始化,但要声明变量类型,否则会报错。)通过占位符进行初始化的String类型变量默认值为null,Int类型变量默认值为0,Float类型变量默认为0.0,Char类型变量默认为?。

2.scala中的数据类型基本上与java相同(byte、short、int、long、float、double、char),但在使用的时候首字母均需要大写(Byte、Short、Int、Long、Float、Double、Char),因为scala中一切皆对象。

3.lazy关键字的作用是可以让变量在被使用时进行赋值,lazy关键字不能修饰var变量,这是为了防止在变量首次使用之前值被修改。

4.对象比较运算操作中,scala不同于java,scala是“内容比较”,而java是“引用比较”。例如比较String类型的对象时,scala使用“==”符号和使用“equals()”方法的作用是相同的,都是内容进行比较,如果要想使用引用比较则需要调用“eq()”方法。

5.元组和符号类型也是scala中特殊的类型,元组类型可以是不同类型的值的聚集,还可以将元组内容进行提取对变量进行初始化。符号类型(Symobols)主要起到标识作用。

对4的补充及更正:
这里要补充说明的是:这个eq()方法我一次在使用时发现它“失效”了。
情况时这样的:

val s1="Hello"
val s2="Hello"
s1==s2   //结果true
s1.equals(s2) //结果true
s1.eq(s2) //结果true

val s3=new String("Hello")
val s4=new String("Hello")
s3==s4  //结果true
s3.equals(s4) //结果true
s3.eq(s4)  //结果false

这里面我第一感觉是s1.eq(s2)中的eq()方法失效了,不由得虎躯一震,因为说明之前写的这篇文章可能误导一些人。所以这里强调一下,当我们采用val s1=”Hello”创建的s1是一个字符串常量,是存储在静态存储区的,采用val s3=new String(“Hello”)创建的s3是一个对象存放在堆区中。
这里写图片描述
从上面这个图我们可以看到,两种不同方式所定义的s1、s2与s3、s4的存储方式是不同的,s1、s2是指向相同字符串常量,所以无论怎么比较都是内容比较。而后一种定义方式定义 s3、s4实际上是两个不同的引用,所以对于使用val s1=“Hello”,val s2=“Hello”这种,无论用“==”、“.equals()”、“.eq()”,结果都将是true,而val s3=new String(“Hello”)、val s3=new String(“Hello”),用“==”、“.equals()”是内容比较,结果为true,而“.eq()”是引用比较,结果是false。
总而言之:对定义成对象形式(val s3=new String(“Hello”))的字符串变量进行比较时,使用eq()方法才是对引用的比较。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值