Results 39 comments of Petterp

上面的老哥都讲的很好,但是大多数同学都用的是java,难免有些不友好,所以我用koltin+java字节码的方式,便于大家有一个概念(虽然暂时没有使用kotlin)。 后面3个看不太懂,还得继续学习。 下面,我用实际操作来演示吧; ```java public class Test { public static void main(String[] args) { System.out.println(sum(10)+sum(5)); } private static int sum(int a){ int sum=8; sum+=a; return sum; } } ``` 这是一段java代码,简单的不能再简单了吧,就是重复的相加,别注意逻辑,只是为了演示。...

快速排序是从冒泡排序演变而来的算法,但是其比冒泡排序要高效,所以叫做快速排序,简单理解如下。 我举个简单例子来理解吧: 比如我们即将排序的数组如下: ``` 1 8 9 5 6 3 0 ``` 我们一般将首位 1 或者最后一个数字 0 认为是基准元素,然后左右对比,大致规律如下: 第一次 : 将 1 移出,从最右边 数字0 开始,如果

MVC架构将视图和数据进行分离,但是View既要与model(数据层)通信,也要与Controller(控制器)通信,既当爹又当妈,这样的话,随着项目较大时,维护改动的成本就会很高,因为它们之间耦合性比较高。所以MVP框架补了这个坑,在MVP里,View层与Presenter(主持层)进行通信,Persenter又与model层进行通信,这样当View变化的时候,Persenter就相当于一个中间人,负责将数据储存到model,也负责通知View层进行变化,这样就避免了View与model的直接接触。但在我们实际开发中,如果项目本身不是特别复杂,mvc更简单明了点。

gradle 降到3.2.1之后可以了。 classpath 'com.android.tools.build:gradle:3.2.1'

好的,非常感谢

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址。因此如果其中一个对象改变了地址,就会影响到另一个对象。 深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢而且花销大。 **如何选择:** 如果对象的属性全是基本类型的,那么可以使用浅拷贝,但是如果对象有引用属性,那就要基于具体的需求来选择浅拷贝还是深拷贝。我的意思是如果对象引用任何时候都不会被改变,那么没必要使用深拷贝,只需要使用浅拷贝就行了。如果对象引用经常改变,那么就要使用深拷贝。没有一成不变的规则,一切都取决于具体需求。

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。 应用场景: 1. 逆向代码,例如反编译 2. 与注解相结合的框架,如 Retrofit 3. 单纯的反射机制应用框架,例如 EventBus(事件总线) 4. 动态生成类框架 例如Gson

ArrayList的扩容,又称自动扩容机制,就像一个动态数组一样。内部是用数组实现的,而且数组默认长度为10。当它插入元素的时候,如果当前插入元素后长度大于默认长度,这时候就会扩容。扩容是指每次扩容数组长度为1.5倍,如果扩容后还不够,那么会直接扩容到需求长度。然后使用System.arraycopy()方法将原来数组里的内容复制到新数组。所以我们在使用的时候,最好能给出预估值的大小。 核心源码如下 > private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; // 扩展为原来的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); // 如果扩为1.5倍还不满足需求,直接扩为需求值 if (newCapacity -...

> _No description provided._ 目前暂不支持多浮窗,后期会考虑增加api支持