Java&Android零碎的知识点
2017-02-20 23:05
441 查看
1、怎样理解内部类里引用的方法的参数必须定义为final?
内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。这样理解就很容易得出为什么要用final了,因为两者从外表看起来是同一个东西,实际上却不是这样,如果内部类改掉了这些参数的值也不可能影响到原参数,然而这样却失去了参数的一致性,因为从编程人员的角度来看他们是同一个东西,如果编程人员在程序设计的时候在内部类中改掉参数的值,但是外部调用的时候又发现值其实没有被改掉,这就让人非常的难以理解和接受,为了避免这种尴尬的问题存在,所以编译器设计人员把内部类能够使用的参数设定为必须是final来规避这种莫名其妙错误的存在。
2、开发中哪些资源要主动释放?
在实际开发中,经常需要在程序中打开一些物理资源,如数据库连接、网络连接、磁盘文件等,打开这些物理资源之后必须显式关闭,否则将会引起资源泄漏。JVM的垃圾回收机制不会回收这些资源,垃圾回收机制属于Java内存管理的一部分,它只是负责回收堆内存中分配出来的内存,至于程序中打开的物理资源,垃圾回收机制是无能为力的。
3、汉字比较
String s1 = new String(this.name.getBytes(“GB2312”), “ISO-8859-1”);
String s2 = new String(another.name.getBytes(“GB2312”), “ISO-8859-1”);
return (s1).compareTo(s2);
4、时间格式化
SimpleDateFormat f=new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss”);
HH表示24进制,hh表示12进制。
5、Java初始化顺序
静态块—父类实例块–父类构造器–子类实例块—子类构造器
6、finish()当前页面或者按下返回键或者按home键后点击应用回到上一个界面,上一个界面执行的生命周期函数:onRestart—onStart–onResume
7、&作为逻辑运算符时,即使第一个操作符是false,那么它仍然会计算第二个操作符;&&,如果第一个操作符为false,那么它不会再去计算第二个操作符。
8、System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序。在一个if-else判断中,如果我们程序是按照我们预想的执行,到最后我们需要停止程序,那么我们使用System.exit(0),而
System.exit(1)一般放在catch块中,当捕获到异常,需要停止程序,我们使用System.exit(1)。这个status=1是用来表示这个程序是非正常退出。
9、当执行break语句的时候,退出的是它所在的循环结构,对外层循环没有任何影响。
continue语句是这5种结束循环的方式中最特殊的,因为它并没有真的退出循环,而是只结束本次循环体的执行。
如果在程序中遇到return语句,那么代码就退出该函数的执行,返回到函数的调用处,如果是main()函数,那么结束整个程序的运行。
exit()函数与return语句的最大区别在于,调用exit()函数将会结束当前进程,同时删除子进程所占用的内存空间,把返回信息传给父进程。
当exit()中的参数为0时,表示正常退出,其他返回值表示非正常退出,执行exit()函数意味着进程结束;而return仅表示调用堆栈的返回,其作用是返回函数值,并且退出当前执行的函数体,返回到函数的调用处,在main()函数中, return n和exit(n)是等价的。
10、数组排序倒序输出:
Arrays.sort(list, Collections.reverseOrder());
11、a.equals(b),a不能为null
12、 << : 左移运算符,num << 1,相当于num乘以2
13、负数转换成二进制分为3步:
14、通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据;
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
context.getCacheDir()
路径:/data/data/com.android.volley/cache
15、
16、 定义long型数据
long a = 1024*1024*1024*5L; 或 long a = (long)1024*1024*1024*5;
17、 颜色
XML定义方法接受6位和8位两种表示法,而且开头必须是#,8位定义时前两位表示透明。
直接定义色值,如:
int color = 0xff00ff00;
这种方法必须使用0x开头,而不是用我们常用的#。与方法3不一样,值也必须用8位表示,不接受6位的颜色表示。分组一下
0x|ff|ff00ff,0x是代表颜色整数的标记,ff是表示透明度,ff00ff表示RGB颜色值。
18、 File f = new File(path);
path不能为空。
19、 四舍五入 int(a + 0.5)
20 、查看应用的uid和签名方式
adb pull /data/system/packages.list Desktop
21、 ArrayList 的remove(object)方法每次只能删除一个,即使list中存在多个相同的元素;当remove的元素不存在时,返回false,不会报错。
22、 与(&)、非(~)、或(|)、异或(^)
23 、1 byte = 8 bit
Unicode和UTF-16:1个字符占2个字节(不管是哪国语言)
UTF-8:1个英文字符占1个字节,一个汉字(包括日文和韩文等)占3个字节
Java中的char默认采用Unicode编码,所以Java中char占2个字节
1 char = 2 byte
1 int = 4 byte
24、 函数传参传的是拷贝还是对象?
25 、Comparable和Comparator区别比较
Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
26 为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢?
看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。
仔细想一下这么做是有道理的。
因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。但即时这样,Collection也只能同时存在一个当前迭代位置。而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。多个迭代器是互不干扰的。
27、 根据包名启动应用(同home键行为)
28、 Serializable 和Parcelable的对比
序列化,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
Serializable(Java自带):
Parcelable(android 专用):
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。Parcel的序列化和反序列化的读写全是在内存中进行,所以效率比JAVA序列化中使用外部存储器会高很多。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。
编码上:
Serializable代码量少,写起来方便
Parcelable代码多一些
效率上:
Parcelable的速度比高十倍以上;
serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了 。
29、接口中的属性的默认是public static final 、方法是public abstract
。。。。。。。。。。。。。。。。。持续更新。。。。。。。。。。。。。。。。。
内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。这样理解就很容易得出为什么要用final了,因为两者从外表看起来是同一个东西,实际上却不是这样,如果内部类改掉了这些参数的值也不可能影响到原参数,然而这样却失去了参数的一致性,因为从编程人员的角度来看他们是同一个东西,如果编程人员在程序设计的时候在内部类中改掉参数的值,但是外部调用的时候又发现值其实没有被改掉,这就让人非常的难以理解和接受,为了避免这种尴尬的问题存在,所以编译器设计人员把内部类能够使用的参数设定为必须是final来规避这种莫名其妙错误的存在。
2、开发中哪些资源要主动释放?
在实际开发中,经常需要在程序中打开一些物理资源,如数据库连接、网络连接、磁盘文件等,打开这些物理资源之后必须显式关闭,否则将会引起资源泄漏。JVM的垃圾回收机制不会回收这些资源,垃圾回收机制属于Java内存管理的一部分,它只是负责回收堆内存中分配出来的内存,至于程序中打开的物理资源,垃圾回收机制是无能为力的。
3、汉字比较
String s1 = new String(this.name.getBytes(“GB2312”), “ISO-8859-1”);
String s2 = new String(another.name.getBytes(“GB2312”), “ISO-8859-1”);
return (s1).compareTo(s2);
4、时间格式化
SimpleDateFormat f=new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss”);
HH表示24进制,hh表示12进制。
5、Java初始化顺序
静态块—父类实例块–父类构造器–子类实例块—子类构造器
6、finish()当前页面或者按下返回键或者按home键后点击应用回到上一个界面,上一个界面执行的生命周期函数:onRestart—onStart–onResume
7、&作为逻辑运算符时,即使第一个操作符是false,那么它仍然会计算第二个操作符;&&,如果第一个操作符为false,那么它不会再去计算第二个操作符。
8、System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序。在一个if-else判断中,如果我们程序是按照我们预想的执行,到最后我们需要停止程序,那么我们使用System.exit(0),而
System.exit(1)一般放在catch块中,当捕获到异常,需要停止程序,我们使用System.exit(1)。这个status=1是用来表示这个程序是非正常退出。
9、当执行break语句的时候,退出的是它所在的循环结构,对外层循环没有任何影响。
continue语句是这5种结束循环的方式中最特殊的,因为它并没有真的退出循环,而是只结束本次循环体的执行。
如果在程序中遇到return语句,那么代码就退出该函数的执行,返回到函数的调用处,如果是main()函数,那么结束整个程序的运行。
exit()函数与return语句的最大区别在于,调用exit()函数将会结束当前进程,同时删除子进程所占用的内存空间,把返回信息传给父进程。
当exit()中的参数为0时,表示正常退出,其他返回值表示非正常退出,执行exit()函数意味着进程结束;而return仅表示调用堆栈的返回,其作用是返回函数值,并且退出当前执行的函数体,返回到函数的调用处,在main()函数中, return n和exit(n)是等价的。
10、数组排序倒序输出:
Arrays.sort(list, Collections.reverseOrder());
11、a.equals(b),a不能为null
12、 << : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
13、负数转换成二进制分为3步:
1、首先将负数转换为对应的原码 -3的原码为(也就是+3转换成二进制后的字符串): 0000 0000 0000 0000 0000 0000 0000 0011 2、再将原码的每一位做取反操作得到反码。 取反操作:0变为1 1变为0; 取反后的结果即为: 1111 1111 1111 1111 1111 1111 1111 1100 3、将反码+1得到补码 1111 1111 1111 1111 1111 1111 1111 1101
14、通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据;
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
context.getCacheDir()
路径:/data/data/com.android.volley/cache
15、
File file = new File("C:\\Program Files"); System.out.println(file.getAbsolutePath()); ------- C:\Program Files File file = new File("C:\\Program Files"); System.out.println(file.getPath()); ------- C:\Program Files File file = new File("aa/bb/cc"); System.out.println(file.getAbsolutePath()); ------- D:\workspace\JavaTest1\aa\bb\cc File file = new File("aa/bb/cc"); System.out.println(file.getPath()); ------- aa\bb\cc File path = new File("."); ---当前目录 D:\workspace\JavaTest1\.
16、 定义long型数据
long a = 1024*1024*1024*5L; 或 long a = (long)1024*1024*1024*5;
17、 颜色
XML定义方法接受6位和8位两种表示法,而且开头必须是#,8位定义时前两位表示透明。
直接定义色值,如:
int color = 0xff00ff00;
这种方法必须使用0x开头,而不是用我们常用的#。与方法3不一样,值也必须用8位表示,不接受6位的颜色表示。分组一下
0x|ff|ff00ff,0x是代表颜色整数的标记,ff是表示透明度,ff00ff表示RGB颜色值。
18、 File f = new File(path);
path不能为空。
19、 四舍五入 int(a + 0.5)
20 、查看应用的uid和签名方式
adb pull /data/system/packages.list Desktop
21、 ArrayList 的remove(object)方法每次只能删除一个,即使list中存在多个相同的元素;当remove的元素不存在时,返回false,不会报错。
22、 与(&)、非(~)、或(|)、异或(^)
23 、1 byte = 8 bit
Unicode和UTF-16:1个字符占2个字节(不管是哪国语言)
UTF-8:1个英文字符占1个字节,一个汉字(包括日文和韩文等)占3个字节
Java中的char默认采用Unicode编码,所以Java中char占2个字节
1 char = 2 byte
1 int = 4 byte
24、 函数传参传的是拷贝还是对象?
public class V { private int a = 3; public static void main(String[] args) { V v = new V(); Per 4000 p = new Per("libiao", 24); v.post(p); v.post(v.a); System.out.println(p); System.out.println(v.a); } private void post(Per p) { p.age = 50;//1 p = null;//2 } private void post(int b) { b = 5; } private static class Per{ String name; int age; public Per(String name, int age){ this.name = name; this.age = age; } @Override public String toString() { if(this == null){ return null; } return "name="+name+",age="+age; } } } 输出: name=libiao,age=50 //1 name=libiao,age=30 //2 3
25 、Comparable和Comparator区别比较
Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
26 为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢?
看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。
仔细想一下这么做是有道理的。
因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。但即时这样,Collection也只能同时存在一个当前迭代位置。而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。多个迭代器是互不干扰的。
public interface Iterable<T> { Iterator<T> iterator(); }
public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
27、 根据包名启动应用(同home键行为)
private void startActivityByPkg(String pkg) { ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> infos = am.getRunningTasks(100); int taskId = -1; if(infos != null) { for(ActivityManager.RunningTaskInfo taskInfo : infos){ if(pkg.equals(taskInfo.baseActivity.getPackageName())){ taskId = taskInfo.id; break; } } } if(taskId >= 0){ am.moveTaskToFront(taskId, ActivityManager.MOVE_TASK_WITH_HOME); }else{ Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(pkg); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); mContext.startActivityAsUser(intent, UserHandle.CURRENT); } }
28、 Serializable 和Parcelable的对比
序列化,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
Serializable(Java自带):
Parcelable(android 专用):
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。Parcel的序列化和反序列化的读写全是在内存中进行,所以效率比JAVA序列化中使用外部存储器会高很多。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。
编码上:
Serializable代码量少,写起来方便
Parcelable代码多一些
效率上:
Parcelable的速度比高十倍以上;
serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了 。
29、接口中的属性的默认是public static final 、方法是public abstract
。。。。。。。。。。。。。。。。。持续更新。。。。。。。。。。。。。。。。。
相关文章推荐
- Java&Android零碎的知识点2
- 【Java&Android】名企面试题和涉及知识点整理
- Android Java 框架基础[知识点汇总]
- javaweb & android 对比理解图 系列 图一
- Java&Android的线程池ExecutorService
- Android Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
- android 零碎知识点
- [Android] "Failed to find Java version for 'C:\Windows\system32\java.exe"问题的解决方法
- Android C 直接調用JNI ->JAVA
- android java.net.UnknownHostException: Unable to resolve host "...": No address associated 错误
- JAVA&Android: 如何显示比当前DATE时间,提前一个月的时间
- Android Java 框架基础[知识点汇总]
- java->android->java
- 开源2D游戏引擎(Java&Android),LGame-0.3.2版正式发布
- Java&Android的线程池---ExecutorService
- 几个常见的错误(java&android)问题
- 开源2D游戏引擎(Java&Android),LGame-0.3.2版正式发布
- Android Java Timer & TimerTask 学习
- android&java 正则表达式
- Java&&Android Socket简单用法