java 同步块 抛出异常_java问题合集(一)

垃圾回收算法

引用计数法,标记清除法,标记压缩清除法(Java中老年代采用),复制算法(Java中新生代采用),分代法(Java堆采用),分区算法。

重要的三句话:

垃圾回收器只知道释放那些经由new分配的内存。

1.对象可能不被垃圾回收;

2.垃圾回收并不等于”析构”;

3.垃圾回收只能与内存有关。其他补充

栈:后进先出

队列:先进先出

前:中左右        中:左中右      后:左右中

创建执行线程的方式:

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口

4.线程池

2/3的区别:想较于实现Runnable接口的方式,Callable带泛型,这个方法可以有返回值(返回值类型就是泛型指定的),并且可以抛出异常。

执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果,FutureTask是Future接口的实现类

c4ad32ce2f32

类和对象:

类是对象具有共同特征和行为的对象的抽象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):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

c4ad32ce2f32

c4ad32ce2f32

饿汉式/懒汉式

c4ad32ce2f32

上面第二种写法存在的线程安全问题的解决方法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、构造一个链表类,用堆栈类实现

c4ad32ce2f32

c4ad32ce2f32

c4ad32ce2f32

c4ad32ce2f32

c4ad32ce2f3213、final,finally,finalize的差别

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。14、Java异常处理机制

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。15、给定一个序列,取出其中第二大的数,要求不对整个序列排序

c4ad32ce2f3216、字符串压缩

c4ad32ce2f32

c4ad32ce2f32

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值