Java面试题

哈希表底层采用何种方式计算哈希值? 还有哪些算法可以计算哈希值?

底层采用key的hashCode方法的值和数组长度进行 [无符号右移]、[按位异或]、[按位与]进行计算出索引;还可以采用 [平方取中法]、[取余法]、[伪随机数法]

注意: 如果节点长度即链表的长度大于阈值8且数组长度大于64则会转变成红黑树。

简述Redis持久化机制

就是把内存中的数据同步到磁盘中保证数据的持久化,当Redis重启后,就把磁盘中的数据加载到内存中,就能达到恢复的目的,Redis有RDB和AOF两种持久化方式。

RDB:Redis默认的持久化方式,按照一定的周期策略把内存中的数据以快照的形式保存到磁盘的二进制文件中,产生的文件名:dump.rdb。

AOF: Redis会将每一个收到的命令以writer函数追加到文件末尾,Redis重启将会重新执行文件中的保存命令来回复整个数据库内容。

注意:当两种持久化方式都开启的时候,会优先加载AOF的方式

浅谈restful api设计规范

它是一种api接口规范,web服务的一种架构风格。[get]、[post]、[put]、[delete],使URL具有很强的可读性和可描述性。

HTTP状态码

  • 301:永久性重定向
  • 302:临时性重定向
  • 303:表示资源存在另一个URL
  • 304:表示允许服务  器允许访问资源,但因发生请求未满足条件的情况。
  • 400:请求报文存在语法错误
  • 401:表示发生的请求需要HTTP认证信息
  • 403:表示对请求资源的访问被服务器拒绝
  • 404:在服务器没有找到请求的资源

高并发的处理

  1. 应用和静态资源分离,将静态资源(图片、视频、js、css和一些资源文件)和系统应用进行分离,放到响应服务器就可以了,这样可以减少服务器的压力。
  2. 页面缓存,就是将页面缓存起来,这样不需要每次都生成页面了,从而可以节省大量的CPU资源,页面缓存主要使用是在数据很少发生变化的页面,还有就是html的静态化,也可以减少服务器的压力。
  1. 集群和分布式,集群就是每台服务器都具有相同的功能,调用那台服务器都可以,起到一个分流的作用。分布式就是将不同的业务放到不同的服务器中,处理一个请求可能要用到多台服务器,这样就可以提高一个请求的处理速度。

Cookie和Session的区别

  1. cookie的数据存放在用户的浏览器(客户端)上,session存放在服务器上面的,但是服务端的session的实现对客户端的cookie有依赖关系的。
  2. cookie不是很安全,别人可以分析存放在本地的cookie进行cookie欺骗,考虑到安全应该用session。
  1. session会在一定时间内保存在服务器上,当访问增多时,会比较占用服务器性能,考虑到服务器性能方面,应当使用cookie。
  2. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的cookie不能超过3K。

Java线程池的7个重要参数

ThreadPoolExecutor的构造方法:

参数说明:

corePoolSize(核心线程数):线程中活跃的线程数,allowCoreThreadTimeOut的值是控制核心线程数是否在没有任务时是否停止活跃的线程,当它的值为true时,在线程池没有任务时,所有的工作的线程都会停止。

maximumPoolSize(最大线程数):线程数允许存在的最大线程数。

keepAliveTime(多余线程存活的时间):多余线程数 = 最大线程数 - 核心线程数,线程池中除了核心线程之外的线程的最大存活时间,如果在这个时间范围类,多余的线程没有任务执行,则多余的线程会停止。

unit(时间单位):多余线程存活时间的单位,可以是分钟,秒,毫秒。

workQueue(任务队列)线程池的任务队列,当线程池无空闲的线程来处理新提交的任务,任务会存在这个队列里面,当这个队列满了,线程池就会执行拒绝策略。

threadFactory(线程工厂):创建线程池的工厂,线程池使用这个工厂来创建线程,自定义线程工厂需要实现ThreadFactory这个接口。

handler(拒绝策略):当线程池没有空余的线程,且任务队列已满,此时,线程池将使用这个处理器来处理新提交的任务。

强引用、软引用、弱引用、虚引用的区别

从JDK1.2开始,把对象的应用分为4种级别,从而使程序能更加的灵活控制对象的声明周期,这四种级别由高到低分别是:强引用、软引用、弱引用、虚引用。

  • 强引用:这是使用最普遍的引用,如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足的时候,Java虚拟机宁愿抛出OutOfMemoryError的错误,使程序终止,也不会随意回收具有强引用对象来解决内存不足的问题。
 String str = "abc";
 List<String> list = new Arraylist<String>();
 list.add(str);
//在list集合里的数据不会释放,即使内存不足也不会
  • 软引用:如果一个对象具有软引用,那就类型与可有可无的生活物品,如果内存足够,垃圾回收器就不会回收它,如果内存不足,就会回收这些对象,软引用可以用来实现内存敏感的高速缓存。

注:软引用在实际中有重要的引用,例如浏览器的后退按钮。

public class Test {  

    public static void main(String[] args){  
        System.out.println("开始");            
        A a = new A();            
        SoftReference<A> sr = new SoftReference<A>(a);  
        a = null;  
        if(sr!=null){  
            a = sr.get();  
        }  
        else{  
            a = new A();  
            sr = new SoftReference<A>(a);  
        }            
        System.out.println("结束");     
    }       

}  

class A{  
    int[] a ;  
    public A(){  
        a = new int[100000000];  
    }  
}  

  • 弱引用:如果一个对象只具有弱引用,那就类似于可有可无的生活用品,弱引用和软引用的区别在于,弱引用具有更短的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现具有弱引用的对象,不管当前内存是否足够,都会对它进行回收。由于垃圾回收器是一个优先级很低的线程,因此不一定很快发现那些具有弱引用的对象。

  • 虚引用:虚引用,顾名思义,就是形同虚设,和其他几种引用都不同,虚引用不会觉得对象的生命周期。如果一个对象仅持有虚引用,那它就和没有任何引用一样,随时都有可能被回收,虚引用主要用来跟踪对象被垃圾回收的活动。虚引用必须和引用队列联合使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值