字符串比较
1 | var str1 = "chaychan" |
比较两个字符串,如果两个字符串的内容一致,在Java中使用 str1 == str2 时,是比较两个字符串的地址值,很清楚两个字符串的地址不一样,返回false,但是在kotlin中,则不是如此,比较的只是字符串的内容,而===相当于Java中的==,用来比较引用对象, 上述代码返回的是true。
equal函数
equals(str:String)
方法中的参数是与之对比的字符串,默认不忽略大小写,即大小写敏感,比如:
1 | var str1 = "chaychan" |
打印结果为false,因为不忽略大小写的话,两个字符串内容对比是不一致的,所以返回false。
equals(str:String,ignoreCase:Boolean)
方法中有两个参数,第一个参数是与之对比的字符串,第二个参数是布尔类型的值,是否忽略大小写,如:1
2
3var str1 = "chaychan"
var str2 = "ChayChan"
println(str1.equals(str2,true))
返回结果为true。
源码优化分析
1.Lateinit
在View声明阶段,都会需要使用lateinit来延迟声明变量。
1 | class TaskActivity : AppCompatActivity(){ |
kotlin中延迟声明还包括lazy的方式
1 | val name:String by lazy {"cangwang"} |
区别在于:
- .lazy{}只能用再val类型,lateinit只能用在var类型
- .lateinit不能用在可空的属性上和java的基本类型上
lateinit var name:String
会报错 - .lateinit可以在任何位置初始化并且可以初始化多次,因为其衔接var变量.而lazy在第一次被调用时就被初始化,其衔接的是val常量,想要被改变只能重新定义
2.findViewById
Api26前:
1 | @Override |
Api26之后
1 | @SuppressWarnings("TypeParameterUnusedInFormals") |
五个kotlin Standard.kt里面的函数:apply,with,let,run,also
- apply作用
1
2
3
4
5setSupportActionBar(findViewById<Toolbar>(R.id.toolbar))
supportActionBar?.apply{
setDisplayHomeAsUpEnabled(true)
setDisplayShowHomeEnabled(true)
}
在函数内可以通过this指代该对象,返回值为该对象自己
- with函数
将某对象作为函数的参数,在函数内可以通过this指代该对象.返回值为函数块的最后一行或指定return表达式
1
2
3
4
5
6
7
8
9
10
11
12
13
14override fun getView(i:Int,view:View?,viewGroup:ViewGroup):View{
val rowView=Vview?:LayoutInflater.from(viewGroup.context).inflate(R.layout.task_item,viewGroup,false)
val task = getItem(i)
with(rowView.findViewById<TextView>(R.id.title)){
text = task.titleForList
}
with(rowView.findViewById<CheckBox>(R.id.complete)){
isChecked=task.isCompleted
rowView.setBackgroundDrawable(...)
setOnClickListener{
}
}
}
3.lat函数
1 | private fun showMessage(message:String){ |
将对象作为函数参数,在函数块内可以通过it指代该对象.返回值为函数块的最后一行或指定return表达式
4. run函数
其有两种表达式:
- 第一种无参数输入
- 第二种会将对象本身this给函数调用 返回值为函数块最后一行,或者指定return表达式
Object
单例对象是使用Object申明 Kotlin没有静态属性和方法,需要使用单例对象来实现类似的功能.
data
相当于java中定义的数据bean类,其可以直接在属性之后编写get和set方法