我发现使用 C++ 的人经常用指针表示对象,比如像下面这样: Object *myObject = new Object; 而不是, Object myObject; 或者在调用成员函数的时候,都会这样...: myObject->testFunc(); 而不是, myObject.testFunc(); 我有点想不明白为什么这么做?...你需要延长对象生命周期。 意思是说你想一直使用某个地址位置的变量,而不是它的副本,对于后者,我们更应该使用 Object myObject; 的语法。 你需要很多内存。...大家都知道,栈空间比堆空间小的多。 当你确实要用动态内存分配的话,我们应该用智能指针或者其它的 RAII 技术来管理这部分资源。 什么时候该使用指针?...切片的意思就是说:在函数传参处理多态变量时,如果一个派生类对象在向上转换(upcast),用的是传值的方式,而不是指针和引用,那么,这个派生类对象在 upcast 以后,将会被 slice 成基类对象,
剑指-->Offer 01 Array和ArrayList的不同点: ①Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。...②Array大小是固定的,ArrayList的大小是动态变化的。 ③ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。...④对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。...02 写在后面 本文章将以“指导面试,智取Offer”为宗旨,为广大Java开发求职者扫清面试道路上的障碍,成为面试官眼中的精英,朋友圈里的大神。...在面试场上“胸有成竹”,坦然面对每个面试官的“拷问”,做到进可攻“项目经理、项目总监”等高级职务,视之为翘首可及;退可守“Java工程师、Java测试工程师”等职务,视之为探囊取物。
天人菊 T.5: Combine generic and OO techniques to amplify their strengths, not their costs T.5:结合使用泛型和面向对象技术应该增强它们的效果而不是成本...泛型和面向对象技术是互补的。...静态协助动态:使用静态多态技术实现动态多态接口。...动态帮助静态:提供通用,舒适的静态边界的接口,但是内部进行动态分发,这样就可以提供一致的对象布局。示例代码引入了和std::shared_ptr的删除器一样的类型消除机制。...在类模板中,非虚函数只有在被使用时才会实例化-但是虚函数任何时候都会实例化。这会使代码膨胀,并且因为实例化根本不用的功能而过度约束通用类型。要避免这个问题,即使标准库有时也会犯这样的错误。
不过事实上这种对调用栈的优化的效果非常小,小到了应该被忽略的程度。是应该被忽略,不是可以被忽略,因为这种优化不仅没啥用,而且还可能因为代码多处拷贝而导致编译生成的字节码膨胀,从而变成负优化。...因为 Java 并没有对函数类型的变量的原生支持,Kotlin 需要想办法来让这种自己新引入的概念在 JVM 中落地。而它想的办法是什么呢?...因为这种优化会导致函数中的函数类型的参数无法被当做对象使用,也就是说,这种优化会对 Kotlin 的功能做出一定程度的收窄。而当你需要这个功能的时候,就要手动关闭优化了。...这也是 inline 默认是关闭、需要手动开启的另一个原因:它会收窄 Kotlin 的功能。 那么,我们应该怎么判断什么时候用 noinline 呢?...那这样的话规则就简单了: Lambda 里的 return,结束的不是直接的外层函数,而是外层再外层的函数; 但只有内联函数的 Lambda 参数可以使用 return。
= user.name // 更新 UI(主线程) }) 这里只是展示了一个代码片段,launch并不是一个顶层函数,它必须在一个对象中使用,launch 函数加上实现在 {} 中具体的逻辑,就构成了一个协程...2.协程好在哪 前面提到,launch 函数不是顶层函数,是不能直接用的,可以使用下面三种方法来创建协程: // 方法一,使用 runBlocking 顶层函数 runBlocking { getImage...(imageId) } // 方法二,使用 GlobalScope 单例对象 // 可以直接调用 launch 开启协程 GlobalScope.launch { getImage...函数的创建者对函数的使用者的提醒:我是一个耗时函数,我被我的创建者用挂起的方式放在后台运行,所以请在协程里调用我。...使用它就可以实现刚才提到的等待类型的耗时操作: suspend fun suspendUntilDone() { while (!
Unit 的本质 大家好,我是扔物线朱凯。 今天来讲一讲 Unit 这个特殊的类型。...} 包括你也可以这样写: val unit: Unit = Unit 也是一样的道理,等号左边是类型,等号右边是对象——当然这么写没什么实际作用啊,单例你就直接用就行了。...也就是在 Kotlin 里,并不存在真正没有返回值的函数,所有「没有返回值」的函数实质上的返回值类型都是 Unit,而返回值也都是 Unit 这个单例对象,这是 Unit 和 Java 的 void 在本质上的不同...比如在 Java 里面,由于 void 并不是一种真正的类型,所以任何有返回值的方法在子类里的重写方法也都必须有返回值,而不能写成 void,不管你用不用泛型都是一样的: public abstract...所以如果你什么时候想「随便拿个对象过来」,或者「随便拿个单例对象过来」,也可以使用 Unit,它和你自己创建一个 object 然后去使用,效果是一样的。
加了问号 值小的情况下 两个地址相等,值大的情况下,两个地址不等??Kotlin是不是煞笔啊??是不是有问题啊?...带着疑问我们继续往下看: 然后我使用kotlin插件自带的一个工具,直接查看Kotlin编译出的class文件,再由class文件反编译出Java代码,来进一步分析: ? 输入图片说明 ?...,所以kotlin直接编译成两个等号的意思。...可选值的时候,就当成Java基本数据类型进行比较 而Java基本数据类型比较的话,地址与值都是相等的,为了节省这个比较地址的开销, kotlin直接编译成JVM执行的 == 的意思, 而当你加了问号...这个可能就与JVM的机制有关系了,【据说在JVM里面有一个常量池,如果是这个值存在于这个常量池里,那么jvm会直接拿常量池里的对象进行替换。所以你值小的时候得到的结果是相等的】。
,kotlin中所有的类成员变量都是通过类访问器get和set去访问成员变量的,例如下面的代码中对price的调用并不是直接操作price变量,而是通过get/set访问器去访问的.所以我们可以将price...代码需要多少行才能实现了. 1.4、object 对象 我们能使用object关键字直接实现单例模式: object DataBaseHelper { ... } 它翻译成java是这样的: public...super T". java中使用类型的关系去设计了通配符,这样做的确在实现上是比较清晰的.但是我个人其实更加喜欢kotlin中直接通过功能去规定类型安全的类型上下界. public void...(dest: Array, src: Array) { ... } 直接用in/out这种功能描述是不是比java用super/extends这种类型描述直接了很多?...java相互调用.以前写的java代码不用任何处理就能直接在kotlin中使用,而java也能无缝调用kotlin代码.
这也是南尘最开始喜欢使用的方式,没有技术却有一颗装 ✘ 的内心,直接写成 Java 文件,再直接一键转换为 Kotlin。...这是 Kotlin 在 Android 开发中的很牛逼的一大特性,想必不少小伙伴都被此 Android 的 NullPointException 困扰许久。我们直接转换 Java 文件造成的各种 !!...当我第一次使用 Kotlin 的时候,我以为val 和 var 的区别在于val 代表不可变,而 var 代表是可变的。但事实比这更加微妙:val 不代表不可变,val 意味着只读。。...对于其他类型的常量,最好在它们自己的主类对象而不是伴生对象中来存储公共的全局常量。...难道又一个对象? 之前有人写过这样的代码,表示很不解,一个接口类型的成员变量,访问外部类的成员变量 name。这不是理所应当的么?
写过 Java 程序的程序员有可能不知道 JetBrains,但是没听过 IntelliJ IDEA 的应该不多。...就像所有的黑帮片一样,想要坐上大哥的位子并不是那么容易的,Java 花了十几年的时间打败了 C,C 依然排在第二位,下一个王者是谁,没有人知道,但是这件事一定会发生,只是什么时候和由谁完成的问题。...Kotlin 的语言有什么特点呢? 1、简洁,同样的功能实现比 Java 的代码要少很多。 2、原生支持函数式编程和面向对象编程。支持协程。 3、安全,可以有效防止程序员疏忽导致的类型错误。...大部分错误都会在编译时发现,而不是在运行时。 4、类型推导,和 Swift 一样,Kotlin 的编译器可以根据变量在上下文的环境中推导出它的数据类型,而不是强制声明。...关于 Kotlin,我也在学习过程中,未来还会写一些学习笔记,希望大家喜欢。
在 Kotlin 里,一个函数名的左边加上双冒号,它就不表示这个函数本身了,而表示一个对象,或者说一个指向对象的引用,但,这个对象可不是函数本身,而是一个和这个函数具有相同功能的对象。...因为只有函数类型的对象有这个自带的 invoke() 可以用,而函数,不是函数类型的对象。那它是什么类型的?它什么类型也不是。函数不是对象,它也没有类型,函数就是函数,它和对象是两个维度的东西。...e: val e = d 我等号右边的 d,应该加双冒号还是不加呢?...另外呢,Kotlin 是不支持使用 Lambda 的方式来简写匿名类对象的,因为我们有函数类型的参数嘛,所以这种单函数接口的写法就直接没必要了。那你还支持它干嘛?...因为 Kotlin 期望我们直接使用函数类型的参数,而不是用接口这种折中方案。 总结 好,这就是 Kotlin 的高阶函数、匿名函数和 Lambda。
使用它来强制推断f类型为String类型: ? 在我看来,Kotlin的类型系统中所有这些类似scala的东西!,?和!!,实在是太复杂了。为什么Kotlin从Java的T类型推断到T!而不是T?呢?...我是面向对象的,而静态成员不是面向对象的,” Kotlin回答。 “好吧,但我需要用于 MyClass 日志记录器,该怎么办?” “没问题,可以使用伴生对象。” “伴生对象是什么鬼?”...“嗯……是的,但是它不是静态成员!它只是一个对象。可以想像那是一个匿名内部类的单例实现。而实际上,这个类并不是匿名的,它的名字是 Companion,你可以省略这个名称。明白吗?这很简单。”...可能是因为 Java 程序员过度使用了继承,可能你应该在允许类被继承之前想想清楚。不过我们生活在框架和时代,而框架往往喜欢 AOP。...最后的想法 ? 学习新技术就像投资。我们投入时间,然后此技术应该给予(我们)回报。我不是说Kotlin是一种糟糕的语言。 我只是说按照我们的状况,其成本超过了收益。 ?
=构建者模式; 关于 arrayOf() 的使用细节。 好了,让我们开始吧! 密封类的小细节 密封类用来表示受限的类继承结构:当一个值为有限几种的类型、而不能有任何其他类型时。...总结如下: 因为内联函数会将方法函数移动到调用处,会增加调用处的代码量,所以对于较长的方法应该避免使用; 内联函数应该用于使用了 高阶函数(lambda) 的方法,而不是普通方法。...const val DEFAULT_MIN = 1 const val LOGIN_KEY = 99 } 2022/12/6补充 使用 kotlin 文件形式去写,这种写法属于以增加静态类的方式避免伴生对象的内存损耗...背景:Java 中,万物皆对象,而八大基本类型不是对象,所以 Java 为每种基本类型都提供了相应的包装类型。 装箱就是指将基本类型转为包装类型,拆箱则是将包装类型转为基本类型。...参阅 Kotlin代码检查在美团的探索与实践 关于我 我是 Petterp ,一个三流 Kotlin 使用者,如果本文对你有所帮助,欢迎点赞评论收藏,你的支持是我持续创作的最大鼓励!
typealias ,穿了马甲,我就不认识你了? 今天的主角是 inline ,这不是一个 Kotlin 特有的概念,大多数编程语言都支持内联。...然而问题的关键并不是如何使用 inline ,而是什么时候使用 inline ? 既然 Kotlin 提供了内联,它肯定是为了性能优化而存在的,那么,它又真的是包治百病的性能良药吗?...Kotlin 标准库中有一个叫 runCatching 的函数,我在这里实现一个简化版本 runCatch ,参数是一个函数类型。...说直白一点,第一次调用 invokeddynamic 时,会找到此处应该运行的方法并绑定, 后续运行时就直接告诉你这里应该执行哪个方法。...这样的场景叫做 局部返回 。 还有一种场景,我是 API 的设计者,我不想 API 使用者进行非局部返回 ,改变我的代码流程。同时我又想使用 inline ,这样其实是冲突的。
对于optionals没有本地支持:虽然有Optional 类,但它的使用意味着生成大量的样板代码,如果对选项的支持是在语言本身内构建的,而不是扩展的,我们可以保存这些代码。...(事实上,它的创建者应该为他所说的“十亿美元的错误”道歉),而这些检查中有多少是为了避免在我们的应用程序中出现崩溃而做出的补丁呢?...在这个方向上,许多可能性已经被探索,其中一些是使用Swift或Scala,尽管没有一个是非常有希望的。所有这些都随着Kotlin语言的出现而改变。...我们可以在一个collection中直接调用 .flatMap {}或者.filter {}、.map {}等等。类型的推断使得使用Lambdas变得特别容易。...T类型的输入参数,并返回一个对象类型的R。
Int was expected map.put("5","e") ^ Kotlin中有类型推断的功能,有些类型参数可以直接省略不写。...也就是说,List并不是List的子类型,而是两种不存在父子关系的类型。 而List类型的参数化,通配符则用于定义使用的对象类型的参数化。 使用泛型、通配符提高了代码的复用性。同时对象的类型得到了类型安全的检查,减少了类型转换过程中的错误。...而另一方面,泛型不是协变的。...泛型函数独立于其所在的类。我们应该尽量使用泛型方法,也就是说如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法,因为它可以使事情更明白。 本章小结 泛型是一个非常有用的东西。
——http://kymjs.com/ (点击原文链接可以直接访问) Kotlin Primer · 第一章 · 启程 Kotlin 语言是一种新的静态类型编程语言,可运行于 JVM 环境同时也能用来开发...可以根据弹出窗口中提示的(或直接在 JetBrains 插件市场搜索)下载链接,使用国内网盘的离线下载功能,下载到网盘后再从网盘下载到本地。...Kotlin 程序非常简单,简单到只需要三行代码,相比起 Java 连包名都不是必须的。...细心查看代码,Kotlin 创建对象的时候并不需要new关键字,而是像调用普通方法一样直接调用构造方法就可以了。...冒号,在分隔两个类型的时候,应该在左右都有空格,在实例和类型之间,应该紧靠实例变量,例如: interface Foo : Bar { fun foo(a: Int)
为什么Kotlin从Java的T类型推断到T!而不是T?呢?似乎Java互操作性破坏了Kotlin的杀手特性——类型推断。看起来您应该显式地声明类型(如T?)...这个多余的字母到底起什么作用?为什么要把名称和类型分隔开?我不知道。不过我知道这会加大使用Kotlin的难度。 第二个问题。...我是面向对象的,而静态成员不是面向对象的,” Kotlin回答。 “好吧,但我需要用于 MyClass 日志记录器,该怎么办?” “没问题,可以使用伴生对象。” “伴生对象是什么鬼?”...“嗯……是的,但是它不是静态成员!它只是一个对象。可以想像那是一个匿名内部类的单例实现。而实际上,这个类并不是匿名的,它的名字是 Companion,你可以省略这个名称。明白吗?这很简单。”...最后的想法 学习新技术就像投资。我们投入时间,然后此技术应该给予(我们)回报。我不是说Kotlin是一种糟糕的语言。 我只是说按照我们的状况,其成本超过了收益。
而面试是测试一个人能力最直接的方式,我今年前前后后面了10家公司,下面就放上我遇到的所有面试题,并且提供一些面试技巧给各位即将面试的同志们。...loop方法,什么时候,哪个类 3.Handler导致的内存泄露原因及其解决方案 4.一个线程可以有几个Handler,几个Looper,几个MessageQueue对象 5.Message对象创建的方式有哪些...使用Binder进行数据传输的具体过程 Binder框架中ServiceManager的作用 什么是AIDL AIDL使用的步骤 AIDL支持哪些数据类型 AIDL的关键类,方法和工作流程 如何优化多模块都使用...SystemServer来做,而专门设计一个Zygote Zygote的IPC通信机制为什么使用socket而不采用binder 21.App启动&打包&安装 应用启动流程 apk组成和Android的打包流程...LruCache原理 Retrofit源码流程,动态代理 LeakCanary弱引用,源码流程 Eventbus Rxjava 文末 好记性不如烂笔头,永远抱着一个“我应该会”的心态去刷面试题,在自己脑子过了一篇
领取专属 10元无门槛券
手把手带您无忧上云