JAVA面试总结

JAVA面试总结

1、基本数据类型
在这里插入图片描述

2、length属性,length()方法和size()的方法的区别
1.length属性是针对Java中的数组来说的,要求数组的长度可以用其length属性;
2.length()方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法;
3.java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!
3、抽象类和接口的区别,接口与接口之间是用继承还是实现
含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象,,不能有抽象构造方法或抽象静 态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口 中的方法定义默认为 public abstract类型,接口中的成员变量类型默认为 public static final。Jdk1.8之后接口中可以有非抽象方法
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象 的普通方法。
4. 抽象类中的抽象方法的访问类型可以是 public,protected 和(默认类型,虽然 eclipse 下不报错,但应该也不行),但接口中的抽象方法只能是 public 类型的,并且默认即 为 public abstract 类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任 意,但接口中定义的变量只能是 public static final 类型,并且默认即为 public static final 类 型。

接口与接口之间是继承
4、方法重载(overloading)和方法重写(overriding)
方法重载(overloading)和方法重写(overriding)是java多态性的表现。
方法重写是父与子之间的多态表现,其中有相同的方法名称和参数,方法重载是一个类中的多态表现,方法名称相同,参数和类型都不同
5、String、stringbuffer、stringbuilder三者之间的区别
1、String是final修饰的,是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
2、StringBuffer、StringBuilder和String一样,也用来代表字符串,是可变类,任何对它所指代的字符串的改变都不会产生新的对象,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高
6、如何判断一个字符串是空值或者空字符串
StringUtils isBlank();
补充:
1.类型:
null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;
"“表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = “” ;
2、内存分配
String str = null ; 表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;
String str = “”; 表示声明一个字符串类型的引用,其值为”"空字符串,这个str引用指向的是空字符串的内存空间;
在java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap):

7、谈一下你对集合的理解
主要分成单列集合和双列集合:collection、map
在这里插入图片描述

常见问题:hashmap的底层和hashtable区别、如何使hashtable集合变成安全的
在这里插入图片描述

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。
在这里插入图片描述

8、多线程的实现方式,在项目中如何使用多线程的,线程安全问题
实现方式:1、继承Thread类创建线程;
2、实现Runnable接口创建线程;
3、实现Callable接口通过FutureTask包装器来创建Thread线程;
4、使用ExecutorService、Callable、Future实现有返回结果的线程
重点记住第一点和第二点
线程的状态: 线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。
死锁产生的原因(可以举例课上讲解的A、B线程获取对方锁):
死锁:
指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再 向前推进。
产生死锁的原因:
(1)竞争系统资源 (2)进程的推进顺序不当
产生死锁的必要条件:
互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。
JAVAWEB开发中,直接使用多线程的并不多,因为servlet等技术已经实现了,我们只是直接用,并不用实现多线程
如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的。
死锁和脏数据就是典型的线程安全问题。
解决线程安全通常做法:访问状态变量时使用同步。 synchronized和Lock都可以实现同步。简单点说,就是在你修改或访问可变状态时加锁,独占对象,让其他线程进不来。达到线程隔离,保证线程安全
9、wait和sleep的区别
Sleep、wait区别:
1,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
10、请说明ThreadLocal的用法和适用场景
ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。
1。每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。
2。将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。
11、什么是反射以及反射的几种方式,反射和泛型在项目中有没有使用过
反射就是在程序运行过程中,通过.class文件动态的获取类的信息(属性,构造,方法),并调用
Class.forName(“类全名”);
对象名.getClass();
类名.class
12、jQuery的几种选择器
1.基本选择器(#id,.class.element,*)
2.层级选择器(parent > child,prev + next)
3.基本筛选器(:first:not(selector),:even,:odd,:eq(index),:gt(index))
4.混淆选择器($.escapeSelector(selector))
5.表单(:input,:text,:password,:radio,:checkbox,:submit)
13、Ajax可以发送同步请求吗
在这里插入图片描述

14、谈一谈同步和异步的区别
在这里插入图片描述

15、Mysql有哪些索引
在这里插入图片描述
在这里插入图片描述

16、数据库的优化
关于索引的解释网上很多,可以查看我发给你们的数据库优化
Sql语句优化:(网上有很多)

  1. 对操作符的优化尽量不采用不利用索引的操作符
    如:in ,not in , is nul, is not null,<>等
  2. 对条件字段的一些优化
    采用函数处理的字段不能利用索引,
    进行了显式或隐式的运算的字段不能进行索引
    条件内包括了多个本表的字段运算时不能进行索引
  3. 在业务密集的SQL当中WHERE后面的条件顺序影响
  4. 查询表顺序的影响
    批量插入: http://blog.csdn.net/frinder/article/details/38830723

17、#{}和${}的区别

1.#{}能够很大程度上防止sql注入;
2. 方 式 无 法 防 止 s q l 注 入 ; 3. {}方式无法防止sql注入; 3. sql;3.一般用入传入数据库对象,比如数据库表名;

18、事务的特性
原子性:强调事务的不可分割.
一致性:强调的是事务的执行的前后,数据的完整性要保持一致.
隔离性:一个事务的执行不应该受到其他事务的干扰.
持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库.

19、事务的隔离级别
read uncommitted :未提交读.脏读,不可重复读,虚读都可能发生.
read committed :已提交读.避免脏读.但是不可重复读和虚读有可能发生.
repeatable read :可重复读.避免脏读,不可重复读.但是虚读有可能发生.
serializable :串行化的.避免脏读,不可重复读,虚读的发生.

20、事务一定要加在业务层吗
事务最好还是配置在业务层,只有配置在业务层,才会出异常时,自动回滚
在这里插入图片描述

21、Servlet的生命周期
在这里插入图片描述

22、Servlet和jsp的区别
在这里插入图片描述

23、Jsp的四大域和九大内置对象
在这里插入图片描述

24、==和equals的区别
在这里插入图片描述
在这里插入图片描述

25、equals和 hashcode的区别
在这里插入图片描述

equals相等的两个值,hashcode值一定相等,equals不同的值hashcode有可能相等
26、Int和Integer的区别
在这里插入图片描述

27、cookie和session的区别,关闭浏览器,cookie销毁,session是否也会销毁
在这里插入图片描述

28、cookie的大小,一个站点可以存储多少个cookie
在这里插入图片描述

29、get和post的区别
在这里插入图片描述

30、转发和重定向的区别
一句话,转发是服务器行为,重定向是客户端行为。
1.重定向访问服务器两次,转发只访问服务器一次。
2.重定向可以看见目标页面的URL,转发只能看见第一次访问的页面URL,以后的工作都是有服务器来做的。
3.重定向跳转后必须加上return,要不然页面虽然跳转了,但是还会执行跳转后面的语句,转发是执行了跳转页面,下面的代码就不会在执行了。
4.在request级别使用信息共享,使用重定向必然出错
5.还有一个大的区别就是,重定向可以访问自己web应用以外的资源
31、异常的父类,如何捕获异常,finally和return哪个先执行
在这里插入图片描述

将可能引发异常的代码段放在 Try 块中,而将处理异常的代码放在 Catch 块中。Catch 语句的顺序很重要。发生异常时,异常沿堆栈向上传递,每个 Catch 块都有机会处理它。通过将异常类型与 Catch 块中指定的异常名称相匹配,可确定处理异常的 Catch 块
在这里插入图片描述

32、final, finally, finalize 的区别
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成 final 类型,例如,一段代码…… finally 是异常处理语句结构的一部分,表示总是执行。 finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可 以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被 调用
33、什么是mvc模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

34、maven热部署;常用命令;maven项目打包如何好的解决循环依赖;Maven打包,如何分别生成开发,生产,测试各环境的包
我们现在用的maven插件就可以实现,最后一天课程有说热部署
循环依赖:
1.可以使用build-helper-maven-plugin插件
2.想办法去除循环依赖的现象,将循环依赖的代码转移到第三个工程中,让两个工程去依赖他
Maven打包,如何分别生成开发,生产,测试各环境的包
通过maven的profiles配置可以实现

35、Spring的两个核心IOC和aop
在这里插入图片描述

36、IOC和di的区别
依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。
依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:
应用程序依赖容器创建并注入它所需要的外部资源;
而控制反转是从容器的角度在描述,描述完整点:
容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源
37、Spring中实现依赖注入的方式
在这里插入图片描述

38、Spring的 bean有哪几种作用域
在这里插入图片描述
默认单例
39、Spring中如何配置事务
在这里插入图片描述

40、Spring是用注解开发的还是配置文件开发的
注解和配置文件都结合使用的
41、Spring的常用注解
在这里插入图片描述
在这里插入图片描述

42、@autowired和@resource注解的区别
在这里插入图片描述

43、spring的7种事务传播行为类型
在这里插入图片描述

44、springmvc的执行流程、常用注解、和Struts2的区别,怎样设置post请求方式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

45、mybatis的流程
在这里插入图片描述

46、mybatis的常用标签

http://blog.csdn.net/u012470138/article/details/53171476

47、mybatis和hibernate的区别
在这里插入图片描述

48、Tomcat的启动容量和初始值
tomcat默认初始的内存值xms是128m。 需要调整的话就改变JAVA_OPTS 增加参数:JAVA_OPTS=’-Xms256m -Xmx512m’

https://zhidao.baidu.com/question/1883389060893564788.html

49、Js跨域怎么解决,jsonp的原理,jsonp的请求方式可以是post吗
js不可以跨域请求数据,但是可以跨域加载js文件;script标签src属性中的链接可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

只能是get
50、nginx负载均衡有哪几种方式
轮询、权重等 http://blog.csdn.net/qq_28602957/article/details/61615876
51、为什么要使用solr,数据量有多少,如何使用solr的
这个问题可以从项目上来进行描述,主要就是讲解一下我们的搜索系统;
52、solr如何实现搜索、solr基于什么
solr 基于Lucene
solr使用反向索引实现搜索
53、多张表的数据导入solr(解决id冲突)
solr 多表导入,防止id覆盖, 可以在schema.xml中添加uuid。 然后solrconfig那边修改update的部分,改为使用uuid生成
54、solr如何分词、新增词和禁用词如何解决
在这里插入图片描述

55、solr多条件组合查询
在这里插入图片描述

56、solr搜索结果的权重怎么解决
在这里插入图片描述

http://blog.csdn.net/sqh201030412/article/details/51164144

57、solr和es的区别

在这里插入图片描述

58、为什么要使用redis
主要讲解项目中怎样使用redis的,内容分类管理系统、单点登录、购物车
59、Java如何操作redis,redis是单例的还是多例的,jedis是单例的还是多例的
使用jedis来操作的,redis是单例的,jedis是多例的
60、Redis的存储结构、有几种数据类型
Redis 是一个高性能的key-value数据库而且redis是单线程的读取速度每秒是11万次写入速度是没每秒8万次。
redis提供五种数据类型:string,hash,list,set及zset(sorted set)。
61、Redis的持久化,是否搭建集群,集群怎么连接的
在这里插入图片描述

Redis默认使用的是RDB,当两个同时开启的时候使用aof

http://blog.csdn.net/u012129558/article/details/51507588

62、Redis的缓存击穿、穿透、雪崩
缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
解决方案
有一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存雪崩
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
解决方案
简单方案就是将缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
缓存击穿
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
1.使用互斥锁(mutex key)
使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
SETNX,是「SET if Not exists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。
在这里插入图片描述

  1. “永远不过期”:
    这里的“永远不过期”包含两层意思:
    (1) 从redis上看,确实没有设置过期时间,这就保证了,不会出现热点key过期问题,也就是“物理”不过期。
    (2) 从功能上看,如果不过期,那不就成静态的了吗?所以我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期
    从实战看,这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。

63、Dubbo的原理
架构图:
在这里插入图片描述

作用:
解决分布式部署、 soa ,服务治理的问题。 他是rpc服务治理框架,高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者

64、Dubbo系统间交互是不是序列化了,dubbo的通讯协议是什么
都进行序列化了,rpc协议
在这里插入图片描述

Dubbo中使用高效的Java序列化(Kryo和FST)
http://blog.csdn.net/moonpure/article/details/53175519

65、Dubbo的心跳机制
dubbo心跳机制,注册中心心跳检测服务提供者,生成最新的服务提供者列表。
心跳的解释:心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。
dubbo的通信过程:http://blog.csdn.net/u012325403/article/details/56667185

66、你们项目使用dubbo来调用服务,如何dubbo调用的服务突然不工作了,你会怎么处理?
因为有zookeeper的存在,如果dubbo闪断的话,会自动重连三次。
如果zookeeper断开造成的,系统内还会有缓存,可以支撑一段时间
如果dubbo服务真的挂了。通过日志分析原因,解决。
另外服务集群部署的话,某一台挂了也不影响
67、为什么要使用ActiveMQ,使用的是哪种模式;订阅模式的持久化;瓶颈值;如何保证客户端一定获取消息操作成功
主要从项目上讲解:数据同步

根据网上一般评测文档上来看,每秒的消息吞吐在2000以上, 后续引出的可能是消息吞吐量优化的问题 http://www.iteye.com/problems/75769
acticemq也可以集群化部署, 也是使用zookeeper来搭建
Topic持久化: http://blog.csdn.net/qh_java/article/details/62043886
保证获取消息操作成功:
第一步。配置RedeliveryPolicy,即消息重发机制,如果发送失败,需要这个来确保可以成功发送消息。在activemq的xml配置即可

http://blog.csdn.net/dly1580854879/article/details/68489798

第二步。ACK 确认机制,消费者接收消息后需要发送确认字符来确保成功接收
http://blog.csdn.net/dly1580854879/article/details/68490197

http://blog.csdn.net/coderepository/article/details/7023304

68、是否使用过maven,maven热部署;常用命令;maven项目打包如何好的解决循环依赖;Maven打包,如何分别生成开发,生产,测试各环境的包
在这里插入图片描述

69、服务器宕机怎么办
可以说我们用的是aliyun服务器,如果服务器异常宕机阿里云监控平台会通知我们。
如果是某一个服务的话,可以说服务器上有运行服务检测工具或者脚本,自动检测,有异常就会报告,具体怎么做的可以说有运维做

70、做过秒杀吗,怎么实现的
比如秒杀可抢中的人10人, 在redis中设计一个队列,存放100个最先点击购买按钮的用户,然后随机的pop出记录作为中奖的用户即可
71、他人恶意频繁点击购物数量对数据库造成压力怎么解决
点击数量的时候,我们可以从前端进行控制,可以控制某个时间段内点击次数超过控制规定的值,就进行弹框进行友好提示
72、你接触过几种设计模式
只要说自己知道就行:
在这里插入图片描述
在这里插入图片描述

https://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

73、内容分类管理,有几层,有多层吗
每个分类的地方有几层是不固定的,是有多层的,比如内容分类表:加个父类的id
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值