您的位置:首页 > 移动开发 > Android开发

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

>> : 右移运算符,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 编程