logo资料库

互联网大厂Java面试专题汇总.pdf

第1页 / 共103页
第2页 / 共103页
第3页 / 共103页
第4页 / 共103页
第5页 / 共103页
第6页 / 共103页
第7页 / 共103页
第8页 / 共103页
资料共103页,剩余部分请下载后查看
基础篇
1、 Java语言有哪些特点
2、面向对象和面向过程的区别
3 、八种基本数据类型的大小,以及他们的封装类
4、标识符的命名规则。
5、instanceof 关键字的作用
6、Java自动装箱与拆箱
7、 重载和重写的区别
8、 equals与==的区别
9、 Hashcode的作用
10、String、String StringBuffer 和 StringBuilder 的区别是什么?
11、ArrayList和linkedList的区别
12、 HashMap和HashTable的区别
13、 Collection包结构,与Collections的区别
14、 Java的四种引用,强弱软虚
15、 泛型常用特点
16、Java创建对象有几种方式?
17、有没有可能两个不相等的对象有相同的hashcode
18、深拷贝和浅拷贝的区别是什么?
19、final有哪些用法?
20、static都有哪些用法?
21、3*0.1==0.3返回值是什么
22、a=a+b与a+=b有什么区别吗?
23、try catch finally,try里有return,finally还执行么?
24、 Excption与Error包结构
25、OOM你遇到过哪些情况,SOF你遇到过哪些情况
26、 简述线程、程序、进程的基本概念。以及他们之间关系是什么?
27、线程有哪些基本状态?
28、Java 序列化中如果有些字段不想进行序列化,怎么办?
29、Java 中 IO 流
30、 Java IO与 NIO的区别
31、java反射的作用于原理
32、说说List,Set,Map三者的区别?
JVM篇
1、知识点汇总
2、知识点详解:
3、类加载与卸载
4、简述一下JVM的内存模型
线程私有区
线程共享区
5、堆和栈的区别
6、 什么时候会触发FullGC
7、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
8、Java内存结构
9、对象分配规则
10、描述一下JVM加载class文件的原理机制?
11、Java对象创建过程
12、类的生命周期
13、简述Java的对象结构
14、如何判断对象可以被回收?
15、JVM的永久代中会发生垃圾回收么?
16、垃圾收集算法
17、调优命令有哪些?
18、调优工具
19、Minor GC与Full GC分别在什么时候发生?
20、你知道哪些JVM性能调优
多线程&并发篇
1、Java中实现多线程有几种方法
2、如何停止一个正在运行的线程
3、notify()和notifyAll()有什么区别?
4、sleep()和wait() 有什么区别?
5、volatile 是什么?可以保证有序性吗?
6、Thread 类中的start() 和 run() 方法有什么区别?
7、为什么wait, notify 和 notifyAll这些方法不在thread类里面?
8、为什么wait和notify方法要在同步块中调用?
9、Java中interrupted 和 isInterruptedd方法的区别?
10、Java中synchronized 和 ReentrantLock 有什么不同?
11、有三个线程T1,T2,T3,如何保证顺序执行?
12、SynchronizedMap和ConcurrentHashMap有什么区别?
13、什么是线程安全
14、Thread类中的yield方法有什么作用?
15、Java线程池中submit() 和 execute()方法有什么区别?
16、说一说自己对于 synchronized 关键字的了解
17、说说自己是怎么使用 synchronized 关键字,在项目中用到了吗synchronized关键字最主要的三种使用方式:
18、什么是线程安全?Vector是一个线程安全类吗?
19、 volatile关键字的作用?
20、常用的线程池有哪些?
21、简述一下你对线程池的理解
22、Java程序是如何执行的
Spring篇
1、 Spring的IOC和AOP机制?
2、 Spring中Autowired和Resource关键字的区别?
3、依赖注入的方式有几种,各是什么?
4、讲一下什么是Spring
5、Spring MVC流程
6、SpringMVC怎么样设定重定向和转发的?
7、 SpringMVC常用的注解有哪些?
8、 Spring的AOP理解:
9、Spring的IOC理解
10、解释一下spring bean的生命周期
11、 解释Spring支持的几种bean的作用域。
12、 Spring基于xml注入bean的几种方式:
13、Spring框架中都用到了哪些设计模式?
MyBatis篇
1、什么是MyBatis
2、MyBatis的优点和缺点
3、#{}和${}的区别是什么?
4、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
5、Mybatis是如何进行分页的?分页插件的原理是什么?
6、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
7、 如何执行批量插入?
8、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
9、MyBatis实现一对一有几种方式?具体怎么操作的?
10、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
11、Mybatis的一级、二级缓存:
SpringBoot篇
1、什么是SpringBoot?为什么要用SpringBoot
2、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
3、运行Spring Boot有哪几种方式?
4、如何理解 Spring Boot 中的 Starters?
5、 如何在Spring Boot启动的时候运行一些特定的代码?
6、 Spring Boot 需要独立的容器运行吗?
7、 Spring Boot中的监视器是什么?
8、 如何使用Spring Boot实现异常处理?
9、 你如何理解 Spring Boot 中的 Starters?
10、 springboot常用的starter有哪些
11、 SpringBoot 实现热部署有哪几种方式?
12、 如何理解 Spring Boot 配置加载顺序?
13、 Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
14、如何集成 Spring Boot 和 ActiveMQ?
15、如何重新加载Spring Boot上的更改,而无需重新启动服务器?
16、 Spring Boot、Spring MVC 和 Spring 有什么区别?
17、 能否举一个例子来解释更多 Staters 的内容?
18、 Spring Boot 还提供了其它的哪些 Starter Project Options?
MySQL篇
1、数据库的三范式是什么
2、数据库引擎有哪些
3、InnoDB与MyISAM的区别
4、数据库的事务
5、索引问题
6、SQL优化
7、简单说一说drop、delete与truncate的区别
8、什么是视图
9、 什么是内联接、左外联接、右外联接?
10、并发事务带来哪些问题?
11、事务隔离级别有哪些?MySQL的默认隔离级别是?
12、大表如何优化?
1. 限定数据的范围
2. 读/写分离
3. 垂直分区
4. 水平分区
13、分库分表之后,id 主键如何处理?
14、mysql有关权限的表都有哪几个
15、mysql有哪些数据类型
16、创建索引的三种方式,删除索引
Redis篇
1、Redis持久化机制
2、缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
3、热点数据和冷数据是什么
4、Memcache与Redis的区别都有哪些?
5、单线程的redis为什么这么快
6、redis的数据类型,以及每种数据类型的使用场景
7、redis的过期策略以及内存淘汰机制
8、Redis 为什么是单线程的
9、Redis 常见性能问题和解决方案?
10、为什么Redis的操作是原子性的,怎么保证原子性的?
11、Redis事务
SpringCloud篇
1、什么是SpringCloud
2、什么是微服务
3、SpringCloud有什么优势
4、 什么是服务熔断?什么是服务降级?
5、 Eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别?
6、SpringBoot和SpringCloud的区别?
7、负载平衡的意义什么?
8、什么是Hystrix?它如何实现容错?
9、什么是Hystrix断路器?我们需要它吗?
10、说说 RPC 的实现原理
Nginx篇
1、简述一下什么是Nginx,它有什么优势和功能?
2、Nginx是如何处理一个HTTP请求的呢?
3、列举一些Nginx的特性
4、请列举Nginx和Apache 之间的不同点
5、在Nginx中,如何使用未定义的服务器名称来阻止处理请求?
6、请解释Nginx服务器上的Master和Worker进程分别是什么?
7、请解释代理中的正向代理和反向代理
8、解释Nginx用途
MQ篇
1、为什么使用MQ
2、MQ优缺点
3、Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别?
4、如何保证高可用的?
5、如何保证消息的可靠传输?如果消息丢了怎么办
6、如何保证消息的顺序性
7、 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
8、设计MQ的思路
数据结构与算法篇
1、常用的数据结构
1. 数组
2. 栈
3. 队列
4. 链表
5. 图
6. 树
7. 前缀树
8. 哈希表
2、 数据里有{1,2,3,4,5,6,7,8,9},请随机打乱顺序,生成一个新的数组(请以代码实现)
3、 写出代码判断一个整数是不是2的阶次方(请代码实现,谢绝调用API方法)
4、 假设今日是2015年3月1日,星期日,请算出13个月零6天后是星期几,距离现在多少天(请用代码实现,谢绝调用API方法)
5、 有两个篮子,分别为A 和 B,篮子A里装有鸡蛋,篮子B里装有苹果,请用面向对象的思想实现两个篮子里的物品交换(请用代码实现)
6、更多算法练习
Linux篇
1、 绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
2、 怎么查看当前进程?怎么执行退出?怎么查看当前路径?
3、查看文件有哪些命令
4、列举几个常用的Linux命令
5、你平时是怎么查看日志的?
简历篇
为什么说简历很重要?
先从面试来说
再从面试说起
必知必会的几点
必须了解的两大法则
项目经历怎么写
专业技能怎么写
排版注意事项
其他一些小tips
基础篇   1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) 3、与平台无关性(JVM是Java跨平台使用的根本) 4、可靠安全 5、支持多线程   2、面向对象和面向过程的区别 面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调 用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程开发 面向对象:是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是 为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性,所以 易维护、易复用、易扩展。可以设计出低耦合的系统。 但是性能上来说,比面向过程要低。   3 、八种基本数据类型的大小,以及他们的封装类 基本类型 大小(字节) 1 2 4 8 4 8 - 2 byte short int long float double boolean char   注: 默认值 (byte)0 (short)0 0 0L 0.0f 0.0d false \u0000(null) 封装类 Byte Short Integer Long Float Double Boolean Character 1.int是基本数据类型,Integer是int的封装类,是引用类型。int默认值是0,而Integer默认值是 null,所以Integer能区分出0和null的情况。一旦java看到null,就知道这个引用还没有指向某个对象, 再任何引用使用前,必须为其指定一个对象,否则会报错。
2.基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间,必须 通过实例化开辟数据空间之后才可以赋值。数组对象也是一个引用对象,将一个数组赋值给另一个数组 时只是复制了一个引用,所以通过某一个数组所做的修改在另一个数组中也看的见。 虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何 供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机 中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素 占8位。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。使用int的原 因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而 是指CPU硬件层面),具有高效存取的特点。   4、标识符的命名规则。 标识符的含义: 是指在程序中,我们自己定义的内容,譬如,类的名字,方法名称以及变量名称等等,都是标识符。 命名规则:(硬性要求) 标识符可以包含英文字母,0-9的数字,$以及_ 标识符不能以数字开头 标识符不是关键字 命名规范:(非硬性要求) 类名规范:首字符大写,后面每个单词首字母大写(大驼峰式)。 变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。 方法名规范:同变量名。   5、instanceof 关键字的作用   instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为: boolean result = obj instanceof Class 其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或 间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。 注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定 类型,则通过编译,具体看运行时定。 int i = 0; System.out.println(i instanceof Integer);//编译不通过 i必须是引用类型,不能是基本类型 System.out.println(i instanceof Object);//编译不通过 Integer integer = new Integer(1); System.out.println(integer instanceof  Integer);//true //false ,在 JavaSE规范 中对 instanceof 运算符的规定就是:如果 obj 为 null,那么将返回 false。 System.out.println(null instanceof Object);
  6、Java自动装箱与拆箱 装箱就是自动将基本数据类型转换为包装器类型(int-->Integer);调用方法:Integer的 valueOf(int) 方法 拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int)。调用方法:Integer的intValue方 法 在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new Integer(10); 而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这 样就可以了: Integer i = 10;   1 public class Main {    public static void main(String[] args) {                Integer i1 = 100;        Integer i2 = 100;        Integer i3 = 200;        Integer i4 = 200;                System.out.println(i1==i2);        System.out.println(i3==i4);   } } 运行结果: true false   为什么会出现这样的结果?输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对象。此 时只需一看源码便知究竟,下面这段代码是Integer的valueOf方法的具体实现: public static Integer valueOf(int i) {        if(i >= -128 && i <= IntegerCache.high)            return IntegerCache.cache[i + 128];        else            return new Integer(i);   } 面 试 题 : 以 下 代 码 会 输 出 什 么 ?
  其中IntegerCache类的实现为: private static class IntegerCache {        static final int high;        static final Integer cache[];        static {            final int low = -128;            // high value may be configured by property            int h = 127;            if (integerCacheHighPropValue != null) {                // Use Long.decode here to avoid invoking methods that                // require Integer's autoboxing cache to be initialized                int i = Long.decode(integerCacheHighPropValue).intValue();                i = Math.max(i, 127);                // Maximum array size is Integer.MAX_VALUE                h = Math.min(i, Integer.MAX_VALUE - -low);           }            high = h;            cache = new Integer[(high - low) + 1];            int j = low;            for(int k = 0; k < cache.length; k++)                cache[k] = new Integer(j++);       }        private IntegerCache() {}   }   从这2段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返 回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。 上面的代码中i1和i2的数值为100,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是同一 个对象,而i3和i4则是分别指向不同的对象。   2 public class Main {    public static void main(String[] args) {                Double i1 = 100.0;        Double i2 = 100.0;        Double i3 = 200.0;        Double i4 = 200.0;                System.out.println(i1==i2);        System.out.println(i3==i4);   } } 运行结果: 面 试 题 : 以 下 代 码 输 出 什 么 ?
false false 原因: 在某个范围内的整型数值的个数是有限的,而浮点数却不是。   7、 重载和重写的区别 重写(Override) 从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继 承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列 表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行 修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。 public class Father {    public static void main(String[] args) {        // TODO Auto-generated method stub        Son s = new Son();        s.sayHello();   }    public void sayHello() {        System.out.println("Hello");   } } class Son extends Father{    @Override    public void sayHello() {        // TODO Auto-generated method stub        System.out.println("hello by ");   } } 重写 总结: 1.发生在父类与子类之间 2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同 3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private) 4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常   重载(Overload) 在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同) 则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来 判断重载。 public class Father {
   public static void main(String[] args) {        // TODO Auto-generated method stub        Father s = new Father();        s.sayHello();        s.sayHello("wintershii");   }    public void sayHello() {        System.out.println("Hello");   }    public void sayHello(String name) {        System.out.println("Hello" + " " + name);   } } 重载 总结: 1.重载Overload是一个类中多态性的一种表现 2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序) 3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准   8、 equals与==的区别 == : == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是 指相同一个对象。比较的是真正意义上的指针操作。 1、比较的是操作符两端的操作数是否是同一个对象。 2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。 3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如: int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。   equals: equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以 适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的 equals方法返回的却是==的判断。   总结: 所有比较是否相等时,都是用equals 并且在对常量相比较时,把常量写在前面,因为使用object的 equals object可能为null 则空指针 在阿里的代码规范中只使用equals ,阿里插件默认会识别,并可以快速修改,推荐安装阿里插件来排 查老代码使用“==”,替换成equals   9、 Hashcode的作用
java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set中 插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样的方法 就会比较满。 于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每个对 象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就 可以确定该对象应该存储的那个区域。 hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合 要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上 已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地 址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。   10、String、String StringBuffer 和 StringBuilder 的区别是什 么? String是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个final类型的字符 数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生成新的 String对象。 private final char value[]; 每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接 +后面的字符。   StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,从AbstractStringBuilder 抽象类中我们可以看到 /**     * The value is used for character storage.     */    char[] value; 他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer和 StringBuilder来进行操作。 另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是 线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。   11、ArrayList和linkedList的区别 Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。 Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据, (因为删除数据以后, 需要把后面所有的数据前移) 缺点: 数组初始化必须指定初始化的长度, 否则报错 例如:
int[] a = new int[4];//推介使用int[] 这种方式初始化 int c[] = {23,43,56,78};//长度:4,索引范围:[0,3]   List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。 List有两个重要的实现类:ArrayList和LinkedList ArrayList: 可以看作是能够自动增长容量的数组 ArrayList的toArray方法返回一个数组 ArrayList的asList方法返回一个列表 ArrayList底层的实现是Array, 数组扩容实现   LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于 ArrayList.当然,这些对比都是指数据量很大或者操作很频繁。   12、 HashMap和HashTable的区别 1、两者父类不同 HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类。不过它们都实现了同时实现 了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。 2、对外提供的接口不同 Hashtable比HashMap多提供了elments() 和contains() 两个方法。 elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的 value的枚举。 contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上, contansValue() 就只是调用了一下contains() 方法。 3、对null的支持不同 Hashtable:key和value都不能为null。 HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性;可以有多个key 值对应的value为null。 4、安全性不同 HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自己 处理多线程的安全问题。 Hashtable是线程安全的,它的每个方法上都有synchronized 关键字,因此可直接用于多线程中。 虽然HashMap是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部分的 使用场景都是单线程。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。 ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为 ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。 5、初始容量大小和每次扩充容量大小不同
分享到:
收藏