9/14湖南确信公司面试题

目录

1.HTTP协议中的4xx,5xx状态码分别表示什么,重定向的状态码?

2.什么是跨域?为什么浏览器会出现跨域问题?以及解决的办法。

3.Java引用传递和值传递?

4.static方法和default方法

5.单例模式的实现方案,及其优缺点

7.java中线程安全的集合容器

9.线程池ThreadPoolExecutor中corePoolSize、maximumPoolSize及workQueue容量的关系

10.spring bean生命周期中的@PostConstruct方法和构造函数的最大区别

1.HTTP协议中的4xx,5xx状态码分别表示什么,重定向的状态码?

1XX	100-101	信息提示
2XX	200-206	成功
3XX	300-305	重定向
4XX	400-415	客户端错误
5XX	500-505	服务器错误

200 OK 服务器成功处理了请求(这个是我们见到最多的)
301/302 Moved Permanently(重定向)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置
304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存
404 Not Found 未找到资源
501 Internal Server Error服务器遇到一个错误,使其无法对请求提供服务
2.什么是跨域?为什么浏览器会出现跨域问题?以及解决的办法。

浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域

指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。

方式一:使用ajax的jsonp

方式二:使用jQuery的jsonp插件
前端代码

方式三、CORS

CORS背后的思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。

IE中对CORS的实现是xdr

    var xdr = new XDomainRequest();
    xdr.onload = function(){
        console.log(xdr.responseText);
    }
    xdr.open('get', 'http://www.baidu.com');
    ......
    xdr.send(null);

原址:https://www.cnblogs.com/PheonixHkbxoic/p/5760838.html

3.Java引用传递和值传递?

值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数。
4.static方法和default方法

非default、static方法不能有实现,否则编译错误:Abstract methods do not specify a body

default、static方法必须有具体的实现,否则编译错误:This method requires a body instead of a semicolon

可以拥有多个default方法

可以拥有多个static方法

使用接口中类型时,仅仅需要实现抽象方法,default、static方法不需要强制自己新实现

1、default方法

default方法使用default关键字修饰,它是对象方法,需要使用对象来进行访问。需要实例化

default默认方法可以不强制重写,也不会影响到已有的实现类。

当一个实现类实现了多个接口,多个接口里都有相同的default默认方法时,实现类必须重写该默认方法,否则编译错误。
当一个实现类实现了一个接口,实现类没必要重写该默认方法,可以直接现有的接口中方法。

2、static方法

不需要实例化,直接使用,节省内存空间。
在Java中,如果父类中含有一个static静态方法,且在子类中也含有一个返回类型、方法名、参数列表均与之相同的静态方法,那么该子类实际上只是将父类中的该同名方法进行了隐藏,而非重写。换句话说,父类和子类中含有的其实是两个没有关系的方法,它们的行为也并不具有多态性。
5.单例模式的实现方案,及其优缺点

几种创建方式总结:

http://blog.csdn.net/worldchinalee/article/details/100972352

1、饿汉式:类初始化的时候,会立即加载该对象,线程天生安全,调用效率高。

2、懒汉式:类初始化时,不会初始化该对象,真正需要使用的时候才会去创建该对象,具备懒加载功能。

3、双重检测方式(因为JVM本身重排序的原因,可能会出现多次的初始化)

4、枚举单例:使用枚举实现单例模式,实现简单、调用效率高,枚举本身就是单例,由JVM从根本上提供保障,避免通过反射和反序列化的漏洞,缺点是没有延迟加载。

5、静态内部类方式:结合了懒汉式和饿汉式各自的优点,真正需要对象的时候才会加载,加载类是线程安全的。

单例模式: 确保一个类只有一个实例,并提供全局访问点。

在Java中实现单例模式需要私有的构造器,一个静态方法和一个静态变量。确定在性能和资源上 的限制,如何选择适当的方案来实现单例,以解决多线程的问题。如果使用多个类加载器,可能导致单例失效产生多个实例。

方式1:
    package singleton;
    /**
     * 同步getInstance()方法:
     * 有点:保证线程安全。
     * 缺点:性能大大下降
     * @author Arvon
     *
     */
    public class Singleton1 {
    	private static Singleton1 instance;
    	private Singleton1(){}
    	public static synchronized Singleton1 getInstance(){
    		if(instance==null)
    				instance = new Singleton1();
    		return instance;
    	}
    }
 
方式2:
    package singleton;
    /**
     * “急切”创建实例
     * 优点:线程安全
     * 缺点: 增加程序创建和运行时的负担
     * @author Arvon
     *
     */
    public class Singleton2 {
    	private static Singleton2 instance = new Singleton2();
    	private Singleton2(){}
    	public static  Singleton2 getInstance(){
    		return instance;
    	}
    }
 
方式3:
    package singleton;
    /**
     * 双重检查加锁
    *双重检查加锁不适用于1.4及更早版本的java
     * @author Administrator
     *
     */
    public class Singleton3 {
    	private volatile static Singleton3 instance;
    	private Singleton3(){}
    	public static  Singleton3 getInstance(){
    		if(instance==null)
    			synchronized (Singleton3.class) {  //只第一次进入同步块
    				if(instance==null)instance = new Singleton3();
    			}
    		return instance;
    	}
    }

7.java中线程安全的集合容器

vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
statck:堆栈类,先进后出。
hashtable:就比hashmap多了个线程安全。
enumeration:枚举,相当于迭代器。
本文链接:http://blog.csdn.net/ThinkWon/article/details/104588551

9.线程池ThreadPoolExecutor中corePoolSize、maximumPoolSize及workQueue容量的关系

当前线程数优先与corePoolSize 比较,大于corePoolSize ,则与workQueue/queueCapacity容量比较;
如果当前线程数大于workQueue容量,则与maximumPoolSize比较;
如果当前线程数大于maximumPoolSize,则执行饱和策略;
最后,根据饱和策略做出相应的处理。

那么poolSize、corePoolSize、maximumPoolSize三者的关系是如何的呢?

当新提交一个任务时:

(1)如果poolSize/workQueue/queueCapacity<corePoolSize,新增加一个线程处理新的任务。

(2)如果poolSize/workQueue/queueCapacity=corePoolSize,新任务会被放入阻塞队列等待。

(3)如果阻塞队列的容量达到上限,且这时poolSize/workQueue/queueCapacity<maximumPoolSize,新增线程来处理任务。

(4)如果阻塞队列满了,且poolSize/workQueue/queueCapacity=maximumPoolSize,那么线程池已经达到极限,会根据饱和策略RejectedExecutionHandler拒绝新的任务。

所以通过上面的描述可知corePoolSize<=maximumPoolSize,poolSize<=maximumPoolSize;而poolSize和corePoolSize无法比较,poolSize是有可能比corePoolSize大的。

3.饱和策略如下:
Abort策略:默认策略,新任务提交时直接抛出未检查的异常RejectedExecutionException,该异常可由调用者捕获。
CallerRuns策略:为调节机制,既不抛弃任务也不抛出异常,而是将某些任务回退到调用者。不会在线程池的线程中执行新的任务,而是在调用exector的线程中运行新的任务。
Discard策略:新提交的任务被抛弃。
10.spring bean生命周期中的@PostConstruct方法和构造函数的最大区别

spring的IOC功能需要是利用反射原理,反射获取类的无参构造方法创建对象,如果一个类没有无参的构造方法spring是不会创建对象的。

在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用;
12.mybatis的mapper接口方法可重载么

每个方法都有唯一的命名时,在xml中进行映射后,就可以执行,不会出现异常。

所以mybatis中mapper.xml是不会准确映射到Java中的重载方法的。最好不要在mapper接口中使用方法重载。

Mybatis使用package+Mapper+method全限名作为key,去xml内寻找唯一sql来执行的。类似:key=x.y.UserMapper.getUserById,那么,重载方法时将导致矛盾。对于Mapper接口,Mybatis禁止方法重载(overLoad)。
转载自Vaeling0818

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值