1,Throwable的子类,有Error和Exception。其中Error属于严重的错误,不应该尝试捕获;Exception里面异常分为编译时异常和运行时异常RuntimeException。
try catch和直接抛异常不一样的是:如果是直接抛异常,是一级一级往上抛,如果不处理继续,直到main抛到JVM,打印异常信息,并且退出,而try catch是试图自己处理,且catch执行完之前要先执行finally。
2,throws和throw的区别,throws是跟在类的后面,表示类可以抛出异常。而throw是跟在代码区,表示抛出。throw new Exception("exception")这样。
3,字符流和字节流是按操作类型分的,字节流可以操作任何数据,而字符流实际上是操作字节流+编码表,也就是字符流的。字节流抽象父类InputStream,OutputStream;字节流抽象父类Reader,Writer。字节流读取的是byte而字符流读取的是char。
4,读取中文的时候,可能会读取半个中文,解决方法可以1)用字符流读取;2)将文件上的所有字节一次读取到内存中,在内存中将所有字节转换成对应的字符串。
字节流写中文的时候,必须转换成字节数组写出去。fos.write("你好".getBytes())。
copy的时候,字符流对于没转换成功的就会变为?,所以字符流只能操作纯文本的文件。而字节流可以操作的是任意的文件。
5,用BufferedReader里面的readline()方法读取的时候String line 应该用while((line == br.readline()!= null){bw.write(line);bw.write("\r'n");}因为读取的时候去掉了\r\n,所以写入的时候应该加上。只支持windows系统,所以在linux系统的时候,不同。所以直接用bw.newLine();这样可以多系统都有用。
6,SequenceInputStream可以将两个流对象整合成一个,可以用vector对象接受多个流对象直接传入;
7,ByteArrayOutputStream相当于在内存中根据文件大小创建一个字节数组,但这样不就不能读取太大的文件了吗,否则内存溢出,而且这样的话有什么意义,是为了直接操作这些流数据吗?
8,无论是普通的字节输出流还是字符输出流,都没有办法读取写入对象。要用ObjectOutputStream进行写入,但是这样写入需要类进行序列化implements Serializable,影响了效率啊,怎么办呢?实际上序列化就是写入,取出。用ObjectInputStream进行读取。
9,RandomAccessFile类可以创建一个可以随机读写的文件,这样可以用seek()等设置指针的位置,从而开启多线程下载文件。
DataInputStream可以读取readInt()这类的,这样用DataOutputStream可以读取。
10,Property类是可以继承的HashTable类的,是线程安全的。property.load(InputStream),然后可以通过prop.setProperty()来改变属性key = value
11,多线程里的守护线程实际上是守护其他的线程,当其他的线程结束,则守护线程也结束。而线程的t.join()指的是等待当前线程执行完再执行t线程。
12,同步代码块,实际上就是上锁,synchronized(lock){},取同一把锁,才有不可抢夺的意义。锁可以是任意对象
非静态的同步方法,锁对象是this。静态的同步方法,锁对象是所属类的字节码对象(对象还没加载)。多线程里面的yield()是表示礼让线程。
13,在同步代码块中锁对象是谁,就让谁调用wait()和notify()方法。notify()是随机唤醒一个进程,多个线程进行通信,将if改成while就可以了。jdk1.5以后,有了ReentranLock这个类,试图替换synchronized,Condition是可以await()或者signal()进行线程的加解锁。
14,加载器,包括根加载器,扩展加载器和系统类加载器。Bootstrap,Extension,System ClassLoader。负责Java核心类的加载,扩展目录中jar包的加载,系统类加载,加载来自java语言的class文件。
15,反射是指,在运行过程中,对于任意一个类,可以获取这个类的所有属性和方法。有三种方法:1)clazz1 = obj.getClass通过对象反向获取();2)clazz2 = Class.forName("com.it.bean.Object")通过路径获取;3)Object.class通过字节码文件获取。
16,动态代理,本来自己做的事,让别人完成,通过反射来进行执行前后的添加步骤操作。
jdk1.8的新特性:1)自动装拆箱;2)泛型;3)可变参数。。。args;4)静态导入;5)增强循环foreach;6)互斥锁reentranLock;7)枚举。