简述: Java校招面试无非就是看基础,还有你的发散思维,以及项目经历,这里面最重要的是基础,大概占到面试重要性的70%
一、线程和进程的区别 1、进程是操作系统分配资源的最小单元 2、线程是操作系统调度的最小单元 3、一个程序至少有一个进程,一个进程至少有一个线程 4、每个进程对应JVM里的实例,多个线程共享JVM的堆 5、线程不能看做独立的应用,进程可以 6、进程有独立的执行空间,而线程只是进程不同的执行路径 7、进程的切换比线程的开销大
容易忽视的方法 thread.Join 把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
二、JVM 数据模型 方法区(线程共享):常量、静态变量、JIT(即时编译器) 编译后的代码也都在方法区; 堆内存(线程共享):垃圾回收的主要场所,对象,数组; 程序计数器: 当前线程执行的字节码的位置指示器; 虚拟机栈(栈内存):保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量; 本地方法栈 :为 JVM 提供使用 native 方法的服务。
堆内存分配: JVM 初始分配的内存由-Xms 指定,默认是物理内存的 1/64; JVM 最大分配的内存由-Xmx 指定,默认是物理内存的 1/4; 默认空余堆内存小于 40% 时,JVM 就会增大堆直到-Xmx 的最大限制;空余堆内存大于 70% 时,JVM 会减少堆直到 -Xms 的最小限制; 因此服务器一般设置-Xms、-Xmx 相等以避免在每次 GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。
三、垃圾回收 引用计数 : 原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为 0 的对象。 此算法最致命的是无法处理循环引用的问题;
标记-清除 : 此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除; 此算法需要暂停整个应用,同时,会产生内存碎片;
复制算法 : 此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中; 此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现 “碎片” 问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间;
标记-整理 : 此算法结合了 “标记-清除” 和 “复制” 两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象 “压缩” 到堆的其中一块,按顺序排放。 此算法避免了 “标记-清除” 的碎片问题,同时也避免了 “复制” 算法的空间问题。
四、String s=new String(“xyz”);创建了几个String Object? 答:创建了两个String对象,一个保存的引用地址,一个保存实际的值。
五、ArrayList和LinkedList的区别 ArrayList 内部借助于数组实现元素的存储。 ArrayList 是线程不安全的,相对于线程安全的Vector来说可能效率较高。 ArrayList 内部基于数组实现数据存储,因此随机访问效率较高。 ArrayList 内部基于数组实现数据存储,因此增删元素速度较慢。
LinkedList 内部基于链表实现元素的存储。 LinkedList是线程不安全的。 LinkedList内部基于链表实现数据存储,因此随机访问效率较低。 LinkedList内部基于链表实现数据存储,因此增删元素速度较快。
六、==和equles的区别 ==:用于判断两个变量的值是否相等,或者两个变量的引用地址是否相等 equals:用于判断变量的引用地址 指向的存储内容是否相等
七、List,Set,Map的用法和区别? list,set都继承于Collection接口,map不是。
list(列表):元素以线性方式存储,可以存放重复元素。 list主要实现类: ArrayList():长度可以改变的数组,插入和删除元素效率较慢。检索效率快。 LinkedList():链表数据结构存储,插入和删除元素效率快,检索访问效率慢。
set(集合):元素没有特定的排列顺序,存放的是对象引用,没有重复元素。 set主要实现类: HashSet:按照哈希算法来存取集合中的对象,存取速度较快。 TreeSet:实现了SortedSet接口,能够对集合中的对象进行排序。
map(映射):键对象和值对象映射的集合,每一个元素都有对应的键(key)和值(value)对象,从map中检索元素时候,只需要给出键对象就能返回对应的值对象。 一个map中不能包含相同的key,每个key只能映射一个value
八、类加载机制 1、加载 在加载阶段,虚拟机主要完成三件事: 1.通过一个类的全限定名来获取定义此类的二进制字节流。 2.将这个字节流所代表的静态存储结构转化为方法区域的运行时数据结构。 3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区域数据的访问入口 2、验证 验证阶段作用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM造成危害。如果验证失败,就会抛出一个java.lang.VerifyError异常或其子类异常。验证过程分为 3、准备 准备阶段为变量分配内存并设置类变量的初始化。在这个阶段分配的仅为类的变量(static修饰的变量),而不包括类的实例变量。对已非final的变量,JVM会将其设置成“零值”,而不是其赋值语句的值: pirvate static int size = 12; 那么在这个阶段,size的值为0,而不是12。 final修饰的类变量将会赋值成真实的值。 4、解析 解析过程是将常量池内的符号引用替换成直接引用。主要包括四种类型引用的解析。类或接口的解析、字段解析、方法解析、接口方法解析。 5、初始化 在准备阶段,类变量已经经过一次初始化了,在这个阶段,则是根据程序员通过程序制定的计划去初始化类的变量和其他资源。这些资源有static{}块,构造函数,父类的初始化等。
九、内存泄露,内存溢出 内存溢出指的是内存不够用了; 内存泄漏是指对象可达,但是没用了。即本该被 GC 回收的对象并没有被回收;
内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出。 内存泄漏的原因分析: 长生命周期的对象引用短生命周期的对象; 没有将无用对象置为 null。
十、缓存穿透,缓存雪崩,缓存击穿 缓存穿透是指查询一个一定不存在的数据,由于缓存没有命中,这时候我们会数据库查询。出于容错考虑,当我们从数据库查询不到数据的时候,则不会写入缓存,这个可能导致每次请求都去数据库查询,失去了缓存的意义。在流量大的时候DB可能就会挂掉,如果有人利用这个不存在key频繁操作攻击我们的应用,这就是漏洞。 以查询用户信息为例,id=-1的用户是肯定不存在的,但是现在有10000个请求,其中9000个都是请求id=-1的这个用户,我们的数据库很容易的就被打死。 缓存雪崩 数据未加载到缓存;缓存同一时刻大面积失效或者宕机,从而导致所有请求都去查询数据库,造成数据库CPU负载夜里过高,甚至宕机;都会造成缓存雪崩。 简单来说的话,就是因为缓存未命中或者缓存系统的宕机,从而引起数据库宕机成为缓存雪崩 缓存击穿 针对某一个key,我们设置了过期时间的key而失效,或者还未加载,如果某一时间被超高频率的访问,也有可能会造成数据库挂掉。与缓存雪崩相比,雪崩针对的是以系列key,而击穿是针对一个key。 比如10点的时候要去抢购一个手机,10点这一刻有N多请求访问服务器,并且这时候我们的数据还没有加入到缓存中,导致所有请求都去数据库查询,这样数据库就很容易挂掉。
十一、为什么要用spring? 1、主要将各个框架有效的联系起来,缩短实际编程时间。 2、可以将各个框架进行有效的管理和控制,让数据传输安全。
十二、spring的IOC和DI? 控制反转和依赖注入是spring的两大基础作用。主要是将所有组件在spring提供的外部容器中加载。提高安全性,减低耦合性,使各个框架或者类之间的依赖性降低。
十三、索引优缺点? 索引可以提高对数据库中数据的检索,缺点是减慢了数据录入速度,同时也增加了数据库的尺寸大小。
十四、什么是事务?什么是事务锁? 事务就是被绑定在一起,作为一个逻辑单元执行的SQL语句。如果任何一个操作失败,那么整个就失败。共同失败或共同成功。锁可以保证事务的完整性和并发性。
十五、select执行顺序? from where group by having select order by
十六、Collection和Collections的区别? Collection是集合类的父类,继承它的主要由set和list Collections是针对集合类的帮助类,它提供了一系列针对集合的搜索,排序,线程安全化等操作。
十七、final、finally、finalize的区别? final用于声明属性方法和类,分别表示:属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句的一部分,表示总是执行。 finalize是Object的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。
十八、汉诺塔问题 汉诺塔的递归实现
public void hanoi(int n, char A, char B, char C) { if (n == 1) { System.out.println("move:" + A + "--->" + C); } else { hanoi(n - 1, A, C, B);//步骤1 按ACB数序执行N-1的汉诺塔移动 System.out.println("move:" + A + "--->" + C);//步骤2 执行最大盘子移动 hanoi(n - 1, B, A, C);//步骤3 按BAC数序执行N-1的汉诺塔移动 } }十九、常用排序算法 冒泡排序:
public static void sort(int array[]){ for (int i=array.length-1;i>0;i--){ for (int j=0;j<i;j++){ if (array[j]>array[j+1]){ int temp = array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } }选择排序:
public static void sort(int array[]) { for (int i = 0; i < array.length; i++) { int min = i; for (int j = i + 1; j < array.length; j++) { if (array[j] < array[min]) min = j; } if (min != i) { int temp = array[min]; array[min] = array[i]; array[i] = temp; } } }快速排序:
public static void sort(int array[],int low ,int high){ if (low>=high) return; int x = low; int y = high; int temp = array[x]; while (x<y){ while (x<y&&array[y]>=temp){ y--; } array[x]=array[y]; while (x<y&&array[x]<=temp){ x++; } array[y] =array[x]; } array[x] = temp; sort(array,low,x-1); sort(array,x+1,high); }直接插入排序:
public static void sort(int array[]){ for (int i=0;i<array.length;i++){ for (int j=i+1;j<array.length;j++){ if (array[j]<array[i]){ int temp = array[j]; array[j]=array[i]; array[i]=temp; } } } }二十、面向对象的正方形继承长方形问题
public class Rectangle { private double width; private double height; public Rectangle(double width,double height){ this.width=width;this.height=height; } public double getHeight() { return height; } public double getWidth() { return width; } public Rectangle changeHeight(double height) { return new Rectangle(this.width,height); } public Rectangle changeWidth(double width) { return new Rectangle(width,this.height); } } public class Square extends Rectangle { public Square(double dege) { super(dege, dege); } public Square changeEdge(double edge){ return new Square(edge); } }Http 和 Https 的区别 1、https协议需要到CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(原来网易官网是http,而网易邮箱是https。) 2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。 3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 4、http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)