JAVA初级工程师面试36问(三)

第十三问: 描述一下JVM加载class文件的原理机制?

 

   JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件.

 

第十四问: 谈谈你对抽象类和接口的异同点?

 

      1.抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。

       2.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。

       3.接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。

       4.抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

 

第十五问: try{}catch{}finally{}在try里面假如存在return语句,那finally{}里的代码会不会被执行.如何执行?

 

       会执行,但是是在方法返回调用者前执行。不过实际中 在finally中改变返回值的做法是很少你的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值.

 

第十六问: 谈谈sleep()方法wait()方法,它们有什么区别?

 

       1.sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复。

        2.wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。(记住这个主要考察sleep 不会放弃锁,  wait是放弃锁)

 

第十七问: 事务的ACID是指什么?


1.原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
2.一致性(Consistent):事务结束后系统状态是一致的;
3.隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
4. 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。

 

第十八问: 请简单说明下转发(forward)和重定向(redirect)的区别? 

 

       主要记住(forward地址栏不会发生变化,是服务器自己内部调用资源给你,  redirect地址栏会发生变化,是客户端请求了两次服务器,这个一般答出来就ok 了   其它的就是自己添加描述语言了 )


     1.forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

      2. redirect是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源,但是可以从一个网站redirect到其他网站。

forward更加高效,所以在满足需要时尽量使用forward(通过调用RequestDispatcher对象的forward()方法,该对象可以通过ServletRequest对象的getRequestDispatcher()方法获得),并且这样也有助于隐藏实际的链接;在有些情况下,比如需要访问一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect()方法实现)。

 

 (温馨提示:很多问题问的只要回答出最核心问题就行,面试官一般会从你回答的众多内容中去获取他要知道的 其它的描述性语言就是自己组装了,要了就是显得更实际,不那么官方,不要,当然也没有关系,不过尽量在回答问题时候不要太官方,不然显得跟个背答案一样.)

   

未完待续.....

 

以下是一些Java初级工程师面试题的例子: 1. 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法? 在Java中,线程的启动是通过调用start()方法来实现的。start()方法会启动一个新的线程,并在新线程中执行run()方法。如果直接调用run()方法,那么run()方法将在当前线程中执行,而不会创建新的线程。这样做的目的是为了实现多线程并发执行,提高程序的效率。 2. JDK自带的个类加载器是什么?它们的作用是什么? JDK自带的个类加载器分别是BootstrapClassLoader、ExtClassLoader和AppClassLoader。 - BootstrapClassLoader是ExtClassLoader的父类加载器,默认负责加载%JAVA_HOME%lib下的jar包和class文件。 - ExtClassLoader是AppClassLoader的父类加载器,负责加载%JAVA_HOME%/lib/ext文件夹下的jar包和class类。 - AppClassLoader是自定义加载器的父类,负责加载classpath下的文件,系统类加载器,线程上下文加载器。 3. Java中的异常体系有哪些? Java中的异常体系分为两种类型:可检查异常(Checked Exception)和不可检查异常(Unchecked Exception)。 - 可检查异常是指在编译时必须进行处理的异常,例如IOException、SQLException等。处理方式可以是捕获异常并进行处理,或者在方法签名中声明抛出异常。 - 不可检查异常是指在编译时不需要进行处理的异常,例如NullPointerException、ArrayIndexOutOfBoundsException等。这些异常通常是由程序错误引起的,处理方式是通过编写健壮的代码来避免这些异常的发生。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值