垃圾回收算法
引用计数法,标记清除法,标记压缩清除法(Java中老年代采用),复制算法(Java中新生代采用),分代法(Java堆采用),分区算法。
重要的三句话:
垃圾回收器只知道释放那些经由new分配的内存。
1.对象可能不被垃圾回收;
2.垃圾回收并不等于”析构”;
3.垃圾回收只能与内存有关。
其他补充
栈:后进先出
队列:先进先出
前:中左右 中:左中右 后:左右中
创建执行线程的方式:
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
4.线程池
2/3的区别:想较于实现Runnable接口的方式,Callable带泛型,这个方法可以有返回值(返回值类型就是泛型指定的),并且可以抛出异常。
执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果,FutureTask是Future接口的实现类
类和对象:
类是对象具有共同特征和行为的对象的抽象
1、String和StringBuffer的区别?
简单地说,就是一个变量和常量的关系。StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。
StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。
StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
StringBuffer类中的方法要偏重于对字符串的变化例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。
2、HashMap和Hashtable的区别?
HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
补充:HashMap是线程不安全的,Hashtable是线程安全的;Hashtable效率低,因为——Hashtable和HashMap底层都是Hash表,Hashtable有锁,并且他的锁是锁整个表,(并行转换成了串行);当多个线程并发去访问这个Hashtable时,一次只有一个进入。当一个结束了才开启下一个。效率低。
①、HashMap允许键和值是null,而Hashtable不允许键或者值是null。
②、Hashtable是同步(synchronization)的,而HashMap不是(这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的;Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。)。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
③、另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
HashMap可以通过下面的语句进行同步:Map m = Collections.synchronizeMap(hashMap);
3、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
Java中交互方式分为同步和异步两种:
同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。
区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。
哪些情况建议使用同步交互呢?比如银行的转账系统,对数据库的保存操作等等,都会使用同步交互操作,其余情况都优先使用异步交互。
(如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。)
4、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?
接口可以继承接口。
抽象类可以实现(implements)接口。
抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
5、abstract class(抽象类)和interface(接口)有什么区别?详细
1.相同点
A. 两者都是抽象类,都不能实例化。
B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。
2. 不同点
A. interface需要实现,要用implements,而abstract class需要继承,要用extends。
B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。
C. interface强调特定功能的实现,而abstract class强调所属关系。
D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。
6、构造器Constructor是否可被override?
java 重写/覆盖(Override)与重载(Overload)
构造器不是方法,那么用来修饰方法特性的所有修饰符都不能用来修饰构造器(并不等于构造器不具备这些特性,虽然不能用static修饰构造器,但它却有静态特性)构造器只能用public private protected这三个权限修饰符,且不能有返回语句。
7、编程题: 写一个Singleton出来。
单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。
8、数组有没有length()这个方法? String有没有length()这个方法?
1、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。
2、是否可以继承String类?
String类是final类故不可以继承。
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
10、java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
throws是获取异常(用于在方法签名中声明抛出一个或多个异常类,throws关键字后可以紧跟一个或多个异常类。)
throw是抛出异常(用于手动地抛出异常对象。throw后面需要一个异常对象。)
try是将会发生异常的语句括起来,从而进行异常的处理,
catch是如果有异常就会执行他里面的语句,(catch块表示一个异常捕获块。当程序执行try块引发异常时,这个异常对象将会被后面相应的catch块捕获。)
而finally不论是否有异常都会进行执行的语句。
对于一个完整的异常处理流程而言,try块是必须的,try块后可以紧跟一个或多个catch块,最后还可以带一个finally块。
try块中可以抛出异常。
11、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
一、多线程实现方法有两种 :
①种是实现Runnable 接口 ②种是继承Thread类。
二、实现同步也有两种 :
①种是用同步方法,②种是用同步块。
同步方法就是在方法返回类型后面加上synchronized, 比如:
public void * synchronized add(){...}。
同步块就是直接写:synchronized (这里写需要同步的对象){...}
三、
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法, * 调用此方法要捕捉InterruptedException异常 * 。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程 ,而是由JVM确定唤醒哪个线程,而且不是按优先级 。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
12、构造一个链表类,用堆栈类实现
13、final,finally,finalize的差别
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
14、Java异常处理机制
在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。
15、给定一个序列,取出其中第二大的数,要求不对整个序列排序
16、字符串压缩