文末
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的相关的几十套腾讯、头条、阿里、美团等公司21年的面试专题,其中把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【延伸Android必备知识点】
这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
//java
int a = 2;
a = 3;
//kotlin
var a = 2
a = 3
val 称为只读变量(不能称为常量,因为是在运行时才确定的值,也称作运行时常量)。如下和java对比所示:
//java
final int a = 2;
//kotlin
val a = 2
const val 和 java静态常量类似,称作编译时常量(在编译期间即可确定的值)。
只能定义在全局范围
只能修饰基本类型
必须立即用字面量初始化
//java
static final int b = 3;
//kotlin
const val b = 3
const val b = 3 编译器即可确定常量的值 , 并用值替换调用处
val c : Int 运行时才能确定的值 , 调用处通过引用获取值
如下:
//const val b = 3 字面量必须立即初始化
const val b = 3
//val c : Int 只有在运行时 才确定 c的值 所以也称作 运行时常量
val c: Int
if (b == 2) {
c = 2
} else {
c = 3
}
==========================================================================
kotlin里面if…else可以当作表达式使用,例如:
c = if(a==3) 4 else 5
与java switch对比如下:
//java
switch(a){
case 0 : c = 5; break;
case 1 : c = 4; break;
default : c = 20 ;
}
//kotlin
when(a){
0 -> c = 5
1 -> c = 4
else -> c = 20
}
when 多个值相同 可用,间隔 如下所示:
when(a){
0 , 2 -> c = 5
1 -> c = 4
else -> c = 20
}
//也可写为
c = when(a){
0 , 2 -> 5
1 -> 4
else -> 20
}
try…catch 也是表达式,可直接将变量提取使用
//java
try{
c = a/b;
}catch(Exception e){
e.printStactTrace();
c = 0;
}
//kotlin
c = try{
a/b
}catch(e:Exception){
e.printStactTrace()
0
}
======================================================================================
运算符operator,kotlin支持运算符重载,但是运算符的范围仅限官方指定的符号:官网路径
用于重载运算符的所有函数都必须使用operator关键字标记。如下简单的demo所示:
// 一个简单的数据类
data class Foo(val x: Int, val y: Int) {
operator fun plus(other: Foo) : Foo = Foo(x + other.x, y + other.y)
}
fun main(args: Array) {
// 使用的时候
val f1 = Foo(10, 20)
val f2 = Foo(30, 40)
// 直接用+运算符代替plus函数,事实上会调用plus函数
println(f1 + f2) // 打印内容为Foo(x=40, y=60)
}
也可以使用扩展函数对运算符进行重载,如下所示:
// 自定义复数运算符 重载运算符
/**
-
@param real 实部
-
@param image 虚部
*/
class Complex(var real: Double, var image: Double) {
override fun toString(): String {
return “real: r e a l i m a g e : real image: realimage:{image}i”
}
}
// 使用扩展方法 进行运算符重载
operator fun Complex.plus(other: Complex): Complex {
return Complex(this.real + other.real, this.image + other.image)
}
operator fun Complex.plus(other: Double): Complex {
return Complex(this.real + other, this.image)
}
operator fun Complex.plus(other: Int): Complex {
return Complex(this.real + other, this.image)
}
operator fun Complex.minus(other: Complex): Complex {
return Complex(this.real - other.real, this.image - other.image)
}
fun main(){
// 运行 自定义复数例子
val complex1 = Complex(3.0, 2.0)
val complex2 = Complex(2.0, 3.0)
//使用
println((complex1 + complex2).toString())
println((complex1 + 1).toString())
println((complex1 + 1.2).toString())
println((complex1 - complex2).toString())
}
除了上述的加减之外,kotlin还支持其他类型的运算符重载,具体可上,官网查看。
Demo:为String实现四则运算
// 为string实现四则运算
// minus 减
operator fun String.minus(right: Any?): String {
val str = right?.toString() ?: “”
return this.replaceFirst(str, “”)
}
// times
operator fun String.times(right: Int): String {
return (1…right).joinToString(“”) { this }
}
// div 除
operator fun String.div(right: Any?): Int {
val str = right?.toString() ?: “”
// windowed 返回给定大小的窗口的快照列表,这些快照沿着给定步骤的字符序列滑动,其中每个快照都是一个字符串。 count 返回为true的个数
return windowed(str.length, 1) {
it == str
}.count { true }
}
fun main() {
val str = “hello world world”
// minus
println(str - “hello”)
// times
println(“*” * 20)
// div
println(str / “l”)
}
中辍表达式使用infix标记
那什么是中辍表达式呢?
在第一章学习的时候,我们知道Pair是一个对象 包含两个值,frist以及second 。源码如下所示:
public data class Pair<out A, out B>(
public val first: A,
public val second: B
) : Serializable {
/**
- Returns string representation of the [Pair] including its [first] and [second] values.
*/
public override fun toString(): String = “($first, $second)”
}
如何快速生成Pair呢? 如下所示
val pair1: Pair<Int, Int> = 2 to 3
这个to就是一个中辍表达式,定义源码如下:
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
仿照上方源码,我们自定义一个中辍表达式,如下:
// 定义中辍表达式
infix fun String.rotate(count: Int): String {
推荐学习资料
-
Android进阶学习全套手册
-
Android对标阿里P7学习视频
-
BAT TMD大厂Android高频面试题
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
air(this, that)
仿照上方源码,我们自定义一个中辍表达式,如下:
// 定义中辍表达式
infix fun String.rotate(count: Int): String {
推荐学习资料
-
Android进阶学习全套手册
[外链图片转存中…(img-fLuNSOpi-1715667697031)]
-
Android对标阿里P7学习视频
[外链图片转存中…(img-FD5pD7w2-1715667697031)]
-
BAT TMD大厂Android高频面试题
[外链图片转存中…(img-uhLHV9km-1715667697032)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!