发表于: 2019-11-01 22:14:10
1 881
今天做了什么:
状态不好,看看基础.
36.Java与JavaScript
JavaScript是种脚本语言. 是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言.
37.什么是断言assert
assert(a > 0); // throws an AssertionError if a <= 0
是一种常用的调试方式. 断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true;如果表达式的值为false,那么系统会报告一个AssertionError.
38.异常处理
Error与Exception
Error表示系统级的错误和程序不必处理的异常,比如内存溢出
Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题. 它表示如果程序运行正常,从不会发生的情况。
39.finally与return的执行顺序
finally在return之前执行.
在finally中改变返回值的做法是不好的. 如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。
40.java如何进行异常处理. throws、throw、try、catch、finally.
通过面向对象的方法进行异常处理. 在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。
try用来指定一块预防所有异常的程序. catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型. throw语句用来明确地抛出一个异常; finally为确保一段代码不管发生什么异常状况都要被执行;
try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常栈中,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的try语句或者最终将异常抛给JVM。
运行时异常与受检异常:
异常表示程序运行过程中可能出现的非正常状态. 运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。 受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。
Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。
常见的运行时异常:
- ArithmeticException(算术异常)
- ClassCastException (类转换异常)
- IllegalArgumentException (非法参数异常)
- IndexOutOfBoundsException (下标越界异常)
- NullPointerException (空指针异常)
- SecurityException (安全异常)
final,finally和finalize:
final之前有说过.修饰对象,方法和类时作用不同.finally用于try-catch结构后.finalize是Object类中定义的方法, 这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。
41.集合框架
List,Set,Map和Collection接口:
List和Set继承自Collection接口,Map不是.Map是键值对映射容器,与List和Set有明显的区别.
ArrayList,Vector和LinkedList的存储性能和特性:
ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢.
Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。
LinkedList使用双向链表实现存储.( 将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高)索引慢插入块.
由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装饰者模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。
Collection与Collections:
前者说过.是Set与List等容器的父接口.后者是一个工具类,提供了一系列的静态方法来辅助容器操作, 包括对容器的搜索、排序、线程安全化等(之前提到的synchronized方法).
TreeMap和TreeSet在排序时如何比较元素? Collections工具类中的sort()方法如何比较元素?
TreeSet要求存放的对象所属的类必须实现Comparable接口( 该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小).TreeMap也要求存放的键值对映射的键必须实现Comparable接口.
Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)
42.线程
Thread类的sleep()与对象的wait()区别:
sleep()方法是线程类的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复.
wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。
线程的sleep()方法和yield()方法区别:
- sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
- 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
- sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
- sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。
关于synchronized方法:
当一个线程进入一个对象的synchronized方法A之后,其它线程不能进入此对象的synchronized方法B.
非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池中等待对象的锁。
编写多线程程序有几种实现方式
J5以前两种:一种继承Thread类,一种实现Runnable接口. 都需要重写run()方法来定义线程的行为.推荐使用后者( 因为一个类只能继承自一个类,却可以实现多个接口)
J5以后第三种方式:实现Callable接口.
同步与异步:
同步是指一个任务未执行结束时,下一个任务不会执行.异步是指同一时间可以执行多个任务.
若系统中存在临界资源,这些资源必须进行同步操作.同步时有利于控制进程,但效率低下.异步效率高,但容易发生错误.
run()方法与start()方法
调用start()方法以启动一个线程,使线程所代表的虚拟处理机处于可运行状态,但不代表会立即运行.run()方法是线程启动后要进行回调callback的方法.
线程池:
在面向对象编程中,创建和销毁对象是很费时间的,因此要尽可能减少创建和销毁对象的次数, 这就是”池化资源”技术产生的原因.
线程池就是指事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。
线程的基本状态以及状态之间的关系:
5种基本状态:new,runnable,running,blocked,dead
线程对象创建后进入新建状态.
调用start()方法,进入就绪状态.万事俱备只欠cpu
cpu开始调度处于就绪状态的线程时,线程才开始运行(线程要进入运行状态,必须要处于就绪状态中)
处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。阻塞原因有几种:
- 等待阻塞 : 运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
- 同步阻塞 : 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
- 其他阻塞 : 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
线程执行完了或者因异常退出了run()方法,该线程生命周期就结束了.
synchronized和 java.util.concurrent.locks.Lock的异同:
Lock是J5后引入的新api,能完成synchronized所实现的所有功能. Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized会自动释放锁,而Lock一定要求手动释放
43.JavaI/O
I/O相关的知识点:
一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。
序列化:
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题.
要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的.
序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆.
Java中有几种类型的流:
字节流,字符流. 字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。
代码题: 写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
如何用Java代码列出一个目录下所有的文件?
用Java的套接字编程实现一个多线程的回显(echo)服务器
44.XML文档定义有几种形式,有何区别,解析XML文档的方式
XML文档定义分为DTD和Schema两种形式.
解析方式:
DOM( Document Object Model),SAX( Simple API for XML)和StAX( Streaming API for XML)
收获
问题
明天计划
评论