1、try catch finally 用法
try {
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
} catch {
//除非try里面执行代码发生了异常,否则这里的代码不会执行
} finally {
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}
finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。如关闭数据库连接等等。
注意:如果没有catch语句块,那么finally块就是必须的。
如果你不希望在这里处理异常,而当异常发生时提交到上层处理,但在这个地方无论发生异常,都要必须要执行一些操作,就可以使用try finally,
很典型的应用就是进行数据库操作:
用下面这个原语来说明:
try
{
DataConnection.Open();
DataCommand.ExecuteReader();
...
return;
}
finally
{
DataConnection.Close();
}
无论是否抛出异常,也无论从什么地方return返回,finally语句块总是会执行,这样你有机会调用Close来关闭数据库连接(即使未打开或打开失败,关闭操作永远是可以执行的),以便于释放已经产生的连接,释放资源。
顺便说明,return是可以放在try语句块中的。但不管在什么时机返回,在返回前,finally将会执行。
参考文章:https://www.cnblogs.com/aspirant/p/6789040.html?utm_source=itdadao&utm_medium=referral
2、Java中ArrayList和LinkedList区别
LinkedList简介
LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
LinkedList 实现 List 接口,能对它进行队列操作。
LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
LinkedList 是非同步的。
ArrayList和LinkedList的大致区别如下:
1)、ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2)、对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3)、对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
3、synchronized锁住的是代码还是对象
在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。
关键是,不要认为给方法或者代码段加上synchronized就万事大吉。
实际上,synchronized(this)以及非static的synchronized方法(至于static synchronized方法请往下看),只能防止多个线程同时执行同一个对象的同步代码段。
回到本文的题目上:synchronized锁住的是代码还是对象。答案是:synchronized锁住的是括号里的对象,而不是代码。对于非static的synchronized方法,锁的就是对象本身也就是this。
当synchronized锁住一个对象后,别的线程如果也想拿到这个对象的锁,就必须等待这个线程执行完成释放锁,才能再次给对象加锁,这样才达到线程同步的目的。即使两个不同的代码段,都要锁同一个对象,那么这两个代码段也不能在多线程环境下同时运行。
所以我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步。这叫减小锁的粒度,使代码更大程度的并发。原因是基于以上的思想,锁的代码段太长了,别的线程是不是要等很久,等的花儿都谢了。
比较多的做法是让synchronized锁这个类对应的Class对象。
class Sync {
public void test() {
synchronized (Sync.class) {
System.out.println("test开始..");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test结束..");
}
}
}
class MyThread extends Thread {
public void run() {
Sync sync = new Sync();
sync.test();
}
}
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
Thread thread = new MyThread();
thread.start();
}
}
}
运行结果: test开始.. test结束.. test开始.. test结束.. test开始.. test结束..
上面代码用synchronized(Sync.class)实现了全局锁的效果。
static synchronized方法,static方法可以直接类名加方法名调用,方法中无法使用this,所以它锁的不是this,而是类的Class对象,所以,static synchronized方法也相当于全局锁,相当于锁住了代码段。
参考文章:https://www.cnblogs.com/QQParadise/articles/5059824.html
4、Java compareTo() 方法
compareTo() 方法用于将 Number 对象与方法的参数进行比较。可用于比较 Byte, Long, Integer等。
该方法用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比较。
语法
public int compareTo( NumberSubClass referenceName )
参数
referenceName -- 可以是一个 Byte, Double, Integer, Float, Long 或 Short 类型的参数。
返回值
如果指定的数与参数相等返回0。
如果指定的数小于参数返回 -1。
如果指定的数大于参数返回 1。
参考文章:http://www.runoob.com/java/number-compareto.html
5.Android Studio 安装 SVN客户端需要注意事项
Android Studio 只能通过关联SVN客户端,需要特别注意的是安装SVN时必须安装command line 功能,只有安装带有 command line 功能的 SVN 客户端,AndroidStudio才能使用。安装SVN时需要用户自定义选择 command line ,默认是不会自动安装的。
参考文章:https://www.cnblogs.com/songmeng/p/4389446.html
6、隐藏应用图标
不可用状态:COMPONENT_ENABLED_STATE_DISABLED
可用状态:COMPONENT_ENABLED_STATE_ENABLED
默认状态:COMPONENT_ENABLED_STATE_DEFAULT
调用 setComponentEnabledSetting 方法,设置 状态为不可用状态 COMPONENT_ENABLED_STATE_DISABLED。
参考文章:
setComponentEnabledSetting 的使用
https://blog.csdn.net/yqda_justdo/article/details/47130197
7、隐藏任务列表
android:excludeFromRecents="true",设置为true后,
当用户按了“最近任务列表”时候,该Task不会出现在最近任务列表中,可达到隐藏应用的目的。
参考文章:
android属性之excludeFromRecents
https://blog.csdn.net/yayun0516/article/details/52108210
8、break和continue的区别和作用
break和continue都是用来控制循环结构的,主要是停止循环。
1.break
有时候我们想在某种条件出现的时候终止循环而不是等到循环条件为false才终止。
这是我们可以使用break来完成。break用于完全结束一个循环,跳出循环体执行循环后面的语句。
2.continue
continue和break有点类似,区别在于continue只是终止本次循环,接着还执行后面的循环,break则完全终止循环。
可以理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
9、SharedPreferences 跨进程获取值
1) 对于跨应用使用sharedPreferences,使用模式Context.MODE_PRIVATE,这样就不能被其他程序访问到
Activity.MODE_PRIVATE:默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Activity.MODE_APPEND
Activity.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取,
Activity.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入;
如果希望文件被其他应用读和写,可以传入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE
Activity.MODE_APPEND:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
所以,这样来说在保存值的时候如果要被外界访问,一定要加上Activity.MODE_WORLD_READABLE,要是被外界改写的话一定要加上Activity.MODE_WORLD_WRITEABLE
2)这里面还有一个关键的地方,就是跨应用获取上下文环境(context),这里用到的是
configContext = createPackageContext("com.example.putshare", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
其中Context.CONTEXT_IGNORE_SECURITY这个一定要加上,这个是忽略警告,如果包名没有找到的话会抛出异常。
3)android7.0给SharedPreferences设置Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE,会触发SecurityException,这个怎么解决?
Starting from N(N is for Nougat), attempting to use this mode will throw a SecurityException.
7.0后不能这样用了。
解决办法就是:Use more formal mechanism for interactions such as ContentProvider, BroadcastReceiver, and Service.
或者采用写入、读取文件形式。
10、获取Java类的名字
例: A.class.getName() ; ---> 包名.A
A.class.getSimpleName() ; ---> A
11、String、StringBuffer
如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。
对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
12、try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后?
会在return中间执行!
try 中的 return 语句调用的函数先于 finally 中调用的函数执行,也就是说 return 语句先执行,finally 语句后执行,但 return 并不是让函数马上返回,而是 return 语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行 finally 语句后才真正开始返回!但此时会出现两种情况:
①、如果finally中也有return,则会直接返回并终止程序,函数栈中的return不会被完成!;
②、如果finally中没有return,则在执行完finally中的代码之后,会将函数栈中的try中的return的内容返回并终止程序;