JAVA&Android随记

来源:互联网 发布:屠龙大陆翅膀进阶数据 编辑:程序博客网 时间:2024/05/29 03:38

1. JAVA中存在向上转型(upcasting)个人感觉是多态的一种表现形式。

2. Android中自定义Adapter(一般为继承BaseAdapter)中会自定义一个类为ViewHolder作为存放view的类,具体作用应该是更好的规范代码,并且在布局有两种或以上不同类型item的时候使逻辑更清晰。网上很多人说创建ViewHolder是为了少使用findViewById(解析XML需要消耗时间和内存),其实不然,使用convertView缓存才是。

3. Android中有时候notifyDataSetChanged无效是因为你重新建立了一个新容器(比如NewList),然后OldList = NewList,这样会使OldList的引用指向NewList的对象(OldList,NewList指向同一个对象),但是Adapter内部的List的引用仍然指向旧的OldList所指向的对象,所以使得notifyDataSetChanged无效。正确的做法应该是在OldList上操作数据,比如OldList.clear();OldList.addAll(NewList); 不让OldList的引用指向新的对象即可。

4.Java中基本类型有boolean,char,byte,int,long,double,float,void 8个。它们的赋值,如int i = 10; 创建的是一个自动变量,存储在堆栈中(并非和其他new出来的一样存储在堆中)。因此更加高效(堆栈速度比堆快,仅次于寄存器)。

5. Java中存在一个fInalize()函数,虽然不能用该函数做清理对象(类似C++中析构函数)的事,但是可以用来判断对象的终结条件。因为在System.gc()后会先调用finalize(),可以在该函数中判断对象是否需要回收。

6. 垃圾回收:引用计数常用来说明垃圾回收的机制,但实际操作却太缓慢,Java并没有采用引用计数。另外两种机制:“停止-复制”。“标记-清理”。

7. static:static方式是和类,而并非类的单个对象相关。当一个事物是static时,就意味着这个域或者方法不会与包含它的那个类的任何对象实例关联在一起。static的域,方法或者代码块会在包含它的类加载(一个类仅加载一次)的时候初始化,在类加载完成之后,类的实例化对象才会被初始化。当static作用在域的时候,表明该域对包含它的类来说只有一份存储空间,即只会初始化一次。但是当static作用在方法上的时候,没有这个性质,它只表明这个方法可以在没有类实例化对象的时候就可以调用。构造函数就是一种隐式的static方法。静态代码块(static {.......})和static域的作用类似。而普通的代码块{.......}使得不论调用那个构造函数的时候,这些操作都会发生。并且在构造函数之前执行。

8. 静态内部类:防止内部类持有外部类的引用,减少内存消耗。(Android中的ViewHolder就应该设计成静态内部类)。

9. 关于String的一些知识:

(1) 两种关键方式 String str = "a"     String str = new String("a")

第一种方式系统会创建对象到String池,如果之后还有String str2 = "a",系统会寻找池中是否有"a",如果有的话就将str2的引用指向“a",而不会重新创建对象。

第二种方式系统会先创建一个String object = "a",然后String str = new String(obejct),所以会先在String池中创建对象Object然后在堆中创建str。如果之后还有String str2 = new String("a"),系统会先在String池中寻找是否有"a"如果有则返回"a"的对象object然后String str2 = new String(obejct)。

所以String str = "a" ,String str2 = "a"一共创建一个对象。而 String str = new String("a"),String str2= new String("a")一共创建3个对象。所以应该尽可能的使用第一种创建方式。

String str = "a",String str2 = "b",str + str2,系统会在中间创建一个StringBuilder所以如果有一段代码是str + str2 + str3 +......+str100,系统就会创建很多个StringBuilder,这样是会消耗内存的,所以遇到string的+,特别是很多个string的时候,应该直接使用StringBuilder的append方法。

10. private方法默认是final的,所以不可以重写和重载。如果父类有private void function(),其子类也有private void function(),这不表示重写,而是两个毫不相干的方法。

11. 域和static方法不存在多态的性质。详见Java编程思想P156。

12.在继承关系中方法调用的顺序:

  (0)  先调用static方法。

(1)调用基类构造器。这个步骤会不断地反复递归下去,首先是构造这个层次结构的根,然后是下一层导出类,等等,直到最底层的导出类。

(2)按声明的顺序调用成员的初始化方法。

(3)调用导出类的构造器主体。

12. 有关于基类构造函数中有子类重写的函数 详见Java编程思想P163.

13. 组合,继承和代理。详见Java编程思想P125-P130.

14. Android的gc机制: Dalvik虚拟机使用Mark-Sweep算法来进行垃圾收集。顾名思义,Mark-Sweep算法就是为Mark和Sweep两个阶段进行垃圾回收。其中,Mark阶段从根集(Root Set)开始,递归地标记出当前所有被引用的对象,而Sweep阶段负责回收那些没有被引用的对象。(从老罗的博客中看来的  http://blog.csdn.net/luoshengyang/article/details/41822747)Java将引用关系考虑为图的有向边,有向边从引用者指向引用对象。线程对象可以作为有向图的起始顶点,该图就是从起始顶点开始的一棵树,根顶点可以到达的对象都是有效对象,GC不会回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。 (http://mobile.51cto.com/aprogram-380459.htm)


这就是这次的全部内容了,第一次写博客,我也只是菜鸟,如果有什么错误之处请大家批评指出,本人一定虚心接受,希望能百尺竿头,更进一步!


0 0
原创粉丝点击