Keep面经汇总

一、Java

线程如何终止

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
  2. 使用stop方法强行终止线程。
  3. 使用interrupt方法中断线程。

如何用一个cancel方法停止两个线程

泛型原理、使用场景、优缺点

原理:泛型的实现是靠类型擦除技术,类型擦除是在编译期完成的,在编译期,编译器会将泛型的类型参数都擦除成它的限定类型,如果没有则擦除为object类型之后在获取的时候再强制类型转换为对应的类型。

使用场景:参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。

优点:

  1. 类型安全
  2. 消除强制类型转换
  3. 潜在的性能收益

缺点:在性能上不如数组快。

手写代码,设计parseInt

    public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }
    public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * 将整数字符串s转换成10进制的整数
         * radix用来指明s是几进制
         */
        //处理字符串s为空的情况
        if (s == null) {
            throw new NumberFormatException("null");
        }
        //Character.MIN_RADIX为2,就是进制数radix小于2进制的话也是无效的
        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }
        //Character.MAX_RADIX为36,就是进制数radix大于36进制的话也是无效的
        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0;
        //判断正负号的标记,初始化为正
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            //取出第一个字符判断时候包含正负号
            char firstChar = s.charAt(0);
            if (firstChar < '0') {
                if (firstChar == '-') {
                    negative = true;
                    //若是字符串的符号是﹣,因为下面每次的result是相减的形式,所以这里是﹢的
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1)
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // 返回使用指定radix进制的字符 s.charAt(i++) 的数值
                digit = Character.digit(s.charAt(i++),radix);
                // s.charAt(i++)的值是一个使用指定radix进制的无效数字,则返回 -1,异常
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                //上一次的结果乘以radix进制
                result *= radix;
                //处理溢出情况
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {//长度小于0的话,异常
            throw NumberFormatException.forInputString(s);
        }
        //negative是true的话,此整数是负的,输出result
        //negative是false的话,此整数是正的,输出-result
        return negative ? result : -result;
    }

hashmap是怎么实现的,是线程安全的吗

知道hashmap的扩容机制么

arrylist实现原理

怎么实现线程安全

互斥同步:推荐使用 synchronized 关键字进行同步, 在 concurrent包中有ReentrantLock类, 实现效果差不多. 还是推荐原生态的synchronized.

非阻塞同步:需要硬件指令完成.常用的指令有:

Test-and-Set

Fetch-and-Increment

Swap

Compare-and-Swap (CAS)

Load-Linked/Store-Conditional (LL/SC)

典型的应用在 AtomicInteger 中

无同步方案:将变量保存在本地线程中,就不会出现多个线程并发的错误了。

java中主要使用的就是ThreadLocal这个类。

二、算法

从矩阵左上角到右下角的走法有多少种

一个长字符串,一个短字符串,短字符串中的字符间顺序我们可以任意改变,实现在长串中找到短串的代码

Top k问题

求不相邻的最大子数组

排序算法有哪些?

介绍一下快排?

    private static void quickSort(int[] array, int _left, int _right) {
        int left = _left;//
        int right = _right;
        int pivot;//基准线
        if (left < right) {
            pivot = array[left];
            while (left != right) {
                //从右往左找到比基准线小的数
                while (left < right && pivot <= array[right]) {
                    right--;
                }
                //将右边比基准线小的数换到左边
                array[left] = array[right];
                //从左往右找到比基准线大的数
                while (left < right && pivot >= array[left]) {
                    left++;
                }
                //将左边比基准线大的数换到右边
                array[right] = array[left];
            }
            //此时left和right指向同一位置
            array[left] = pivot;
            quickSort(array, _left, left - 1);
            quickSort(array, left + 1, _right);
        }
    }

两个字符串找最长公共子串

n个数中找到长度为m的和值最大的子串

归并思想

三、JVM

强软弱引用以及使用场景

对象的生命周期

如何判断对象能否回收

对象循环引用了怎么办

什么情况下会触发gc

内存泄漏有哪些场景、如何检测、如何避免

java堆中存放的是什么,栈中存放什么。

类加载的过程

类加载的过程主要分为三个部分:

  • 加载:指的是把class字节码文件从各个来源通过类加载器装载入内存中。
  • 链接
  • 初始化:对类变量初始化,是执行类构造器的过程。

链接又可以细分为

  • 验证:为了保证加载进来的字节流符合虚拟机规范,不会造成安全错误。
  • 准备:为类变量(注意,不是实例变量)分配内存,并且赋予初值。
  • 解析:将常量池内的符号引用替换为直接引用的过程。

jvm分区

程序计数器:记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)。

Java虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。

本地方法栈:与 Java 虚拟机栈类似,它们之间的区别只不过是本地方法栈为本地方法服务。

Java堆:几乎所有对象实例都在这里分配内存。是垃圾收集的主要区域("GC 堆"),虚拟机把 Java 堆分成以下三块:

  • 新生代
  • 老年代
  • 永久代

新生代又可细分为Eden空间、From Survivor空间、To Survivor空间,默认比例为8:1:1。

方法区:方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。Object Class Data(类定义数据)是存储在方法区的,此外,常量、静态变量、JIT编译后的代码也存储在方法区。

运行时常量池:运行时常量池是方法区的一部分。Class 文件中的常量池(编译器生成的各种字面量和符号引用)会在类加载后被放入这个区域。除了在编译期生成的常量,还允许动态生成,例如 String 类的 intern()。这部分常量也会被放入运行时常量池。

直接内存:直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError 异常出现。避免在Java堆和Native堆中来回复制数据。

四、网络和数据库

Mysql索引选择

Mysql索引实现

https原理

HTTPS(Secure Hypertext Transfer Protocol) 安全超文本传输协议是一个安全的通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。HTTPS使用安全套接字层(SSL)进行信息交换,简单来说HTTPS是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。

https通信过程

  • 客户端发送请求到服务器端
  • 服务器端返回证书和公开密钥,公开密钥作为证书的一部分而存在
  • 客户端验证证书和公开密钥的有效性,如果有效,则生成共享密钥并使用公开密钥加密发送到服务器端
  • 服务器端使用私有密钥解密数据,并使用收到的共享密钥加密数据,发送到客户端
  • 客户端使用共享密钥解密数据
  • SSL加密建立

五、操作系统

进程间通信有哪些方式

  • 消息传递

    • 管道
    • 消息队列
    • 套接字
  • 共享内存

六、设计模式

用过哪些设计模式

写线程安全的单例模式,为什么用volatile和synchronized,底层是怎么实现的,volatile是可重排序的吗

public class Singleton {
    private volatile static Singleton instance = null;

    private Singleton() {

    }

    /**
     * 当第一次调用getInstance()方法时,instance为空,同步操作,保证多线程实例唯一
     * 当第一次后调用getInstance()方法时,instance不为空,不进入同步代码块,减少了不必要的同步
     */
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

七、框架

介绍一下aop

AOP是对OOP的补充和完善。AOP利用的是代理,分为CGLIB动态代理和JDK动态代理。OOP引入封装、继承和多态性等概念来建立一种对象层次结构。OOP编程中,会有大量的重复代码。而AOP则是将这些与业务无关的重复代码抽取出来,然后再嵌入到业务代码当中。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码,属于静态代理。

八、其他

设计一个微博 大v可能有几百万粉丝 大v发的微博关注他的用户会有实时通知 用户那里可以查看关注的所有人的微博

短域名和长域名。怎么根据短域名映射到对应的长域名,怎么存储,用什么数据结构。长域名怎么转化得到短域名的字符串?

统计一个网址访问次数前10多的ip地址。怎么保证实时性。

原文地址:https://www.cnblogs.com/wupeixuan/p/9726941.html

时间: 2025-01-13 09:04:40

Keep面经汇总的相关文章

部署OpenStack问题汇总(四)--openstack中nova-compute状态status显示为&#39;XXX&#39;的问题

第一次部署openstack的时候就遇见了这个问题,当时的版本是havana, 现在部署essex的时候又遇到了这个问题,经过一番折腾,解决了这个问题,记录下来,以免以后忘记. =========================================================== 1.查看/var/log/nova/nova-compute.log文件其中出现了这样的情况: Domain not found: no domain with matching name 'insta

Nginx&Apache&PHP参数汇总

1.Nginx vim /etc/nginx/conf.d/www.cmdschool.org.conf   client_max_body_size 30m; //上传文件大小改30M   upstream www.cmdschool.org {     server 10.168.82.25:87;     ip_hash;   }   server {     listen 80;     server_name www.cmdschool.org;     location / {   

跟我学SpringMVC目录汇总贴、PDF下载、源码下载

跟我学SpringMVC目录汇总贴.PDF下载.源码下载 http://jinnianshilongnian.iteye.com/blog/1752171 跟开涛学SpringMVC 在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 第三章 DispatcherServlet详解 第四章 Controller接口控制器详解(1) 第四章 Controller接口控制器详解(2) 第四章 Controller接口控制器详解(3) 第四章 Controller接口控制器详解(

EIGRP汇总后生成的Null0接口和路由黑洞详解

提到Null0接口,就顺便提一下路由黑洞.所谓黑洞路由,顾名思义他就是将所有无关路由吸入其中,使它们有来无回的路由 - 相当于洪水来临时,在洪水途经的路上附近挖一个不见底的巨大深坑,然后将洪水引入其中. 黑洞路由实际是一种特殊的静态路由,就是目的地址为该网段的数据报文到达设备之后,报文将被丢弃.路由黑洞最大的好处是充分利用了路由器的3层数据包转发能力,对系统负载影响非常小,将报文丢弃的操作不需要CPU进行什么专门的处理,所以处理大量的报文也不会消耗设备的CPU资源! 例如,admin建立一个路由

WebGL 支持检测与已支持浏览器版本汇总

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 是否我的浏览器支持 WebGL http://caniuse.com 在页面搜索 webgl,找到  WebGL - 3D Canvas grap

TCP 协议难点汇总

本文不会完整的介绍TCP,只有在涉及到的时候随便提一下.不适合对TCP整个流程和框架没有了解过的人阅读. 1  TCP 四次挥手中的TIME_WAIT状态的意义何在. 下图四次挥手的一个大体的流程 我们发现在A发送完一个最后一个ACK后,B一收到这个ACK就证明关闭请求已经被确认了,所以可以直接关闭.但是这时候A怎么知道这个ACK是否已经到达了对端呢?这个时候为了保证双方能够正常关闭,就引入了一个MSL时间,MSL定义 "一个电磁波信号在地球最大的存活时间 " . 所以该ACK存活一个

Unity Pitfall 汇总

[Unity Pitfall 汇总] 1. 当脚本被绑定到一个对象时,一个类对象即会被创建,此意味着此类构造函数会被调用.需使用UNITY_EDITOR宏来避免在编辑器中调用构造函数. to be continue Unity Pitfall 汇总,布布扣,bubuko.com

c语言全局变量和局部变量问题汇总

1.局部变量是否能和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,须要使用"::" 局部变量能够与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量.对于有些编译器而言,在同一个函数内能够定义多个同名的局部变量,比方在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内. 2.怎样引用一个已经定义过的全局变量? 答:extern 能够用引用头文件的方式,也能够用externkeyword,假设用引用头文件方式来引用某个在头文件

Vue常用经典开源项目汇总参考-海量

Vue常用经典开源项目汇总参考-海量 Vue是什么? Vue.js(读音 /vju/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.另一方面,Vue 完全有能力驱动采用单文件组件和 Vue 生态系统支持的库开发的复杂单页应用. Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 易用(已经会了HTML,CSS,J

spring-websocket框架搭建遇到的问题解决方案汇总

问题1 org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server 严重: Servlet.service() for servlet [SpringMVC] in context with path [/ZHDM] threw exception [Request processing failed; nested exception is org.springfra