博学谷精选面试题

多线程的实现方法有几种,分别是什么?有哪些优缺点?1继承thread类优点:代码简单缺点:该类无法集成别的类2实现runnable接口优点:继承其他类。 同一实现该接口的实例可以共享资源缺点:代码复杂3实现callable接口优点:可以获得异步任务的返回值4线程池方式优点:实现自动化装配,易于管理,循环利用资源说说hashcode(),equals()的区别?equal相等的两个对象他们的hashcode肯定相等,也就是用equal对比绝对可靠。hashcode相等的两个对象他们的
摘要由CSDN通过智能技术生成

多线程的实现方法有几种,分别是什么?有哪些优缺点?
1继承thread类
优点:代码简单
缺点:该类无法集成别的类
2实现runnable接口
优点:继承其他类。 同一实现该接口的实例可以共享资源
缺点:代码复杂
3实现callable接口
优点:可以获得异步任务的返回值
4线程池方式
优点:实现自动化装配,易于管理,循环利用资源

说说hashcode(),equals()的区别?
equal相等的两个对象他们的hashcode肯定相等,也就是用equal对比绝对可靠。
hashcode相等的两个对象他们的equal不一定相等,也就是hashcode不是绝对可靠的
对于需要大量并且快速对比的话如果都用equal去做显然效率太低,所以解决方法是,每当需要对比的时候,首先用hashcode去对比,如果hashcode不一样,则表示这两个对象肯定不相等,如果hashcode相同,此时再对比他们的equal也相同,此时再对比他们的equal,如果equal也相同,表示这两个对象真的相同了,这样能大大提高了效率也暴增了对比的正确性!

简单说说java中的异常处理机制的简单原理和应用。
所有异常的跟了你为java.lang.throwable.throwable派生了两个子类:error和exceptioin
error代表了JVM本身的错误,不能被程序员通过代码处理,比如内存溢出。
exception分为ioException和RuntimeException
Error和RumtimeException以及他们的子类。javac在编译时,不会提示和发现这样的异常,不会提示和发现这样的异常,不要求在程序处理这些异常称之为非检查异常,比如下标越界。编译器强制必须try.catch处理或者throws声明继续抛给上层调用方法处理的异常成为检查异常,比如使用jdbc连接数据的SQLException。try块中放可能发生异常的代码。每一个catch块用于捕获并处理一个特定的异常,或者异常类型的子类,顺序为从小到大。finally无论异常是否发生,异常是否匹配被处理,finally都会执行。

创建线程的几种方式?
通过继承thread类实现,多个线程之间无法共享该线程类的实例变量。
实现runnable接口,较继承thread类,避免继承的局限性,适合资源共享。
使用callable,方法中可以有返回值,并且抛出异常。
创建线程池实现,线程池提供了一个线程队列,队列中农保存所有等待状态的线程,避免创建与销毁额外开销,提高了响应速度。

遍历map的几种方法?
第一种,通过key取值。
第二种,通过迭代器取值
第三种,通过entryset
第四种,通过map的value方法

是否可以从一个static方法内部发出对非static方法的调用?
不可以。static方法是静态方法,属于类的方法。非static方法是属于对象的方法。因为非static方法是要与对象关联在一起的,必须在创建出一个对象后,才可以通过这个对象调用非static方法;而static方法可以直接通过类名来调用,不需要创建对象。也就是说,在一个static方法被调用时,还可能没有创建任何实例对象,此时如果从static内部发出对非static方法的调用,非static方法是无法关联到对象的。

类加载机制有了解吗?
类加载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。在JAVA中,类加载器把一个类装入JVM中,要经过以下几个步骤:
1装载:查找和导入class文件
2链接:把类的二进制数据合并到JRE中;校验:检查载入class文件数据的正确性;准备:给类的静态变量分配存储空间;解析:将符号引用转成直接引用
3初始化:对类的静态变量,静态代码块执行初始化操作
java程序可以动态扩展是由运行期动态加载和动态链接实现的;比如:如果编写一个使用接口的应用程序,可以等到运行时再指定其实际的多态,解析过程有时候还可以在初始化之后执行,比如:多态

hashtable与hashmap有什么不同?
相同点:都是存储键值对的散列表,而且都是采用拉链法实现的。
存储的思想都是:通过table数据村粗,数组的每一个元素都是一个entry;而一个entry就是一个单项列表,entry链表中的每一个节点就保存了键值对数据
不同点:1继承和实现方式不同 2线程安全不同 3对null值的处理不同 4支持的遍历种类不同 5通过iterator迭代器遍历时,遍历的顺序不同 6容量的初始值和增加方式都不一样 7天假key-value时的hash算法不同

单例模式中懒汉模式与恶汉模式的区别?
恶汉模式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变。
懒汉模式如果在创建实例对象是不加上synchronized则会导致对对象的访问不是线程安全的。
从实现方式来讲他们最大的区别就是懒汉模式是延时加载,是在需要的时候才创建对象,而饿汉模式在虚拟机启动的时候就会创建。

string s=new string(“xyz”);创建了几个stringObject?是否可以继承string类?
分为两个情况:
1如果string常量池中,已经创建了xyz,则不会继续创建,此时只创建了一个对象new string(“xyz”)
2如果string常量池中,没有创建过xyz,则会创建两个对象,一个对象的值是xyz,另一个对象是new string(“xyz”)
string类不能被继承,因为它是被final修饰的。

string s=“hello”;s=s+“world”;这两行代码执行后,原始的string对象中的内容到底变了没有?
因为string被设计为不可变类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个string对象,内容是hello,然后我们对s进行+操作,那么s所指向的那个对象是否发生了变化呢?答案是没有,这是,s不再指向原来那个对象了,而是指向另一个string对象,内容为helloworld,原来的那个对象还存在于内存中,只是s这个引用变量不再指向它了。

sleep和wait的区别
对于sleep方法,我们首先要知道该方法是属于thread类中的,而wait方法,则是属于objcet类中的。sleep方法导致了程序暂停执行指定的时间,让出cpu给其他线程。但是他的监控状态依然保持着,当指定的时间到了就会自动回复运行状态。在调用sleep方法过程中,线程不会释放对象锁。而当调用wait方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

动态代理的两种方式以及区别
基于接口的动态代理
要求:被代理类最少实现一个接口
提供者:JDK
涉及类:proxy
创建代理对象的方法:newProxyInstance
方法中的参数:classLoader:类加载器。负责加载代理对象的字节码。和被代理对象使用相同的类加载器。固定写法。class[]:字节码数据。负责让生成的代理对象具有和被代理对象相同的方法。些什么要看被代理对象是一个接口还是一个实现类。如果是一个接口:new class[]{接口};如果是一个实现类:xxx.getclass().getInterfaces()。固定写法。invocatioinHandler:一个接口,需要我们提供该接口的实现。作用是用于对方法的增强。增强的代码,谁用谁写。写的是一个接口的实现类。写的是一个接口的实现类。通常是一个匿名内部类,但是不绝对
基于子类的动态代理
要求:需要导入cglib坐标。被代理类不能是final类
提供者:cglib
创建代理对象的方法:create
方法中的参数:class:字节码对象。用于加载代理对象字节码的。写的是被代理对象的字节码。固定写法。callback:如何代理。提供增强代码的。它是一个接口,需要自己写实现。该接口没有方法,需要用它的子接口MethodInterceptor

说说你比较熟悉的设计模式和应用场景
单例模式:保证一个类只有一个实例,并提供一个全局访问点,比如一些配置文件或者管理类可以设计为单例,我们常用的线程池也是单例的。
模板方法:在定义好的算法骨架下,允许子类为一个或者多个步骤提供实现,一次性实现算法的不变部分,将可变部分留给子类实现,当子类实现代码逻辑雷同时,可以使用此设计模式
工厂模式:创建对象需要大量的重复代码是,通过子类实现方法类创建对象。如spring中通过工厂模式将创建对象的任务交给容器管理
建造者模式:将复杂对象的构建和表示分离,适用于流程固定,但是顺序不一定固定的场景。如需要给一个对象对此给不同的属性赋值,可以使用链式调用传参,最后生成对象。
JAVAEE应用中,Spring用于创建IOC容器的监听器就是基于观察者模式的。
spring中获取FileSystemResource\ClassPathResource等功能雷同的类时使用模板方法。
单例模式:包括懒汉模式与饿汉模式以及不同的变种,工厂类设计模式一般也设计为单例。项目中的一些配置,或者引入外部的sdk需要创建管理类,或者封装自己的框架式,需要用到单例

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值