为了账号安全,请及时绑定邮箱和手机立即绑定

java面试笔记(更新中... ...)

标签:
Java

1、基本数据类型有哪些?

    基本数据类型包括byte、int、char、long、float、double、boolean和short。
    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类。

2、get和post的区别

    get是从服务器上获取数据,post是向服务器传递数据;

    get传送的数据量小,不能大于2KB,post传送的数据量较大;

    get安全性低,传递的参数都显示在地址栏,post高,但是执行效率上get好一些;

    在进行文件上传的时候,只能使用post而不能使用get

3、string stringbuffer stringbuilder 区别及选用

    String字符串常量,Stringbuffer与Stringbuilder是字符串变量

    String长度不可变,Stringbuffer与Stringbuilder长度可变。因为String类中使用final关键字字符数组保存字符串,private final char value[],所以String不可变

    String使用字符串拼接的时候是两个不同的空间,Stringbuffer与Stringbuilder则是直接在字符串后面追加,所以大数据量上不用string

    StringBuffer线程安全,StringBuilder线程不安全,是因为StringBuffer对方法加了同步锁

    执行效率上StringBuilder>StringBuffer>String

    总结:对于操作少量的数据用String,大量的数据,单线程用StringBuiler,多线程用StringBuffer

4、HashMap与Hashtable区别

    HashMap非线程安全,HashTable线程安全,因为HashTable内部的方法都经过synchronized修饰

    HashMap允许null的键/值,HashTable不允许

    HashMap性能优于Hashtable

    初始容量Hashtable默认11,每次扩充,容量变为原来的2n+1。HashMap默认16,每次扩充,容量变为原来的2倍

底层数据结构不同,jdk1.8之后,当链表长度大于阈值(默认为8)时,将链表转换为红黑树,来减少搜索时间,Hashtable没有这样的机制,Hashtable基本被淘汰了,少用。

5、Spring MVC和Spring boot有啥区别

    1、springMVC是Spring的一个模式,是一个Web框架,提供了一个轻度耦合的方式来开发Web应用;

    2、SpringBoot是习惯优于配置,降低了项目搭建的难度(约定大于配置,可以简化spring的配置流程);

    3、springMVC需要适用到TomCat服务器,而springboot内置服务器容器,通过@SpringBootApplication中注解类中main函数启动即可;

6、session和cookie的区别

https://img1.sycdn.imooc.com/5ebb69e80001336509840683.jpg

区别:

    1、cookie数据存放在客户端,session数据放在服务器上。

 2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

 3、session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑性能应当使用cookie。

 4、不同浏览器对cookie的数据大小限制不同,个数限制也不相同。

 5、可以考虑将登陆信息等重要信息存放为session,不重要的信息可以放在cookie中。

联系:

    1、都是用来记录用户的信息,以便让服务器分辨不同的用户。
 2、可以搭配使用,但都有自己的使用局限,要考虑到安全和性能的问题。

7、JDK、JRE、JVM的联系与区别

https://img2.sycdn.imooc.com/5ebb6a3d00013c6910090758.jpg

三者联系:

    JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。JVM+Lib=JRE。总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。

三者区别:

    1.JDK和JRE区别:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。

    2.JRE和JVM区别:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。

8、&和&&区别

  1. &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

  2. &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长

    3.&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

9、ArrayList和Vector的区别?

  1. ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍

  2. Vector提供indexOf(obj, start)接口,ArrayList没有

  3. Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销

10、List 、Map 、Set的区别?

    set--其中的值不允许重复,无序的数据结构  

    list--其中的值允许重复,因为其为有序的数据结构  

    map--成对的数据结构,健值必须具有唯一性(键不能同,否则值替换)

11、ArrayList,Vector, LinkedList的存储性能和特性?

    ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦

    LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始

    ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢.

    Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.

    LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快.

12、char类型的变量能不能存储一个中文?为什么?

    char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节

13、在HashMap中是如何比较“key”的值的

    在HashMap比较两个key值时,首先使用equals进行比较两个key的值,如果不同则认为是两个不同的key;如果相同,再比较两个key的hashcode,如果不同,则认为是两个不同的key;如果相同则认为是两个相同的key,此时的value2会覆盖value1的值

14、如果main方法被声明为private会怎样?

    main()是程序的主入口,也是程序必须运行的通道,所以声明private会报错

    main方法只能是公共的 因为他是程序运行第一步进来就要找的 如果他私有化 程序就不要运行了 直接挂  私有的只适用于变量或者不是主方法的方法

15、char类型的变量能不能存储一个中文?为什么

    答案是可以的,但是两个中文不行。因为char占两个字节,一个中文也占两个字节,所以是可以存储的。

16、九大内置对象是哪些?

    request:用户端请求,此请求会包含来自GET/POST请求的参数(表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie,header, 和session数据的有用的方法。)

    response:网页传回用户端的回应(表示HttpServletResponse对象,并提供了几个用于设置送回

浏览器的响应的方法(如cookies,头信息等))

    page:JSP网页本身(表示从该页面产生的一个servlet实例)

    pageContext:网页的属性是在这里管理(表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。)

    session:与请求有关的会话期(表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息)

    application:servlet正在执行的内容(表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息)

    out:用来传送回应的输出(是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。)

    config:servlet的构架部件(表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。)

    exception:针对错误网页,未捕捉的例外

17、Servlet生命周期和执行流程?

    Servlet的生命周期可以分为四个阶段:装载类及创建实例阶段,初始化阶段,服务阶段,实例销毁阶段

    1、初始化阶段调用init()方法。

    2、响应客户请求阶段。调用service()方法,由service()方法根据提交的方式选择执行doGet()或者doPost()方法。

    3、终止阶段调用destroy()方法。

执行流程:浏览器向服务器请求时,服务器不会直接执行我们的类,而是到web.xml里寻找路径名

    第一步,浏览器输入访问路径后,携带了请求行,头,体

    第二步,根据访问路径找到已注册的servlet名称,既图中的demo

    第三步,根据映射找到对应的servlet名

    第四步,根据根据servlet名找到我们全限定类名,既我们自己写的类

18、JVM简述java垃圾回收机制?

    在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

19、JVM简述java类加载机制?
    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。

20、java中wait和sleep有什么区别?多线程条件下如何保证数据安全?

    最大区别是等待时wait会释放锁,而sleep会一直持有锁,wait通常用于线程时交互,sleep通常被用于暂停执行

21、 有了解java的原子类?实现原理是什么?

    采用硬件提供原子操作指令实现的,即CAS。每次调用都会先判断预期的值是否符合,才进行写操作,保证数据安全

22、mybatis有了解吗?它与hibernate有什么区别?项目中,你会选哪个?

    两者都是轻量级ORM框架,hibernate实现功能比较多,通过HQL操作数据库,比较简单方便,但hibernate自动生成的sql相长,不利测试和查找原因。复杂sql时,编写比较困难,同时性能也会降低。mybatis是半自动化,手动编写SQL语句,同时提供丰富的参数判断功能。sql语句较清晰,可以直接进行测试,性能也较好,操作起来非常简单。同时hibernate容易产生n+1问题。hibernate学习成本较mybatis高。国内一些大公司基本上使用mybatis

23、数据库优化

1、在表中建立索引,优先考虑where、group by使用到的字段。

2、尽量避免使用select *,返回无用的字段会降低查询效率。如下:

 SELECT * FROM t

    优化方式:使用具体的字段代替*,只返回使用到的字段。

3、尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE id IN (2,3)
SELECT * FROM t1 WHERE username IN (SELECT username FROM t2)

    优化方式:如果是连续数值,可以用between代替。如下:

SELECT * FROM t WHERE id BETWEEN 2 AND 3

    如果是子查询,可以用exists代替。如下:

SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.username = t2.username)

4、尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE id = 1 OR id = 3

    优化方式:可以用union代替or。如下:

SELECT * FROM t WHERE id = 1
UNION
SELECT * FROM t WHERE id = 3

    (PS:如果or两边的字段是同一个,如例子中这样。貌似两种方式效率差不多,即使union扫描的是索引,or扫描的是全表)

5、尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE username LIKE '%li%'

    优化方式:尽量在字段后面使用模糊查询。如下:

SELECT * FROM t WHERE username LIKE 'li%'

6、尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE score IS NULL

    优化方式:可以给字段添加默认值0,对0值进行判断。如下:

SELECT * FROM t WHERE score = 0

7、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t2 WHERE score/10 = 9
SELECT * FROM t2 WHERE SUBSTR(username,1,2) = 'li'

    优化方式:可以将表达式、函数操作移动到等号右侧。如下:

SELECT * FROM t2 WHERE score = 10*9
SELECT * FROM t2 WHERE username LIKE 'li%'

8、当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE 1=1

    优化方式:用代码拼装sql时进行判断,没where加where,有where加and。

24、request和response区别

    一、作用不同

        1、request的转发zhidao:作用是与客户端交互,收集客户端的Form、Cookies、超链接,或者收集服务器端的环境变量。

        2、response的重定向:用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应。

    二、原理不同

        1、request的转发:客户端可通过HTML表单或在网页地址后面提供参数的方法提交数回据,然后服务器通过request对象的相关方法来获取这些数据。

        2、response的重定向:只提供了一个数据集合cookie,用于在客户端写入cookie值。若指定的cookie不存在,则创建它。若存在,则将自动进行更新。

    三、特点不同

        1、request的转发:主要用来处理客户端浏览器提交的请求中的各项参数和选项。

        2、response的重定向:可以直接发送信息给浏览器,重定向浏览器到另一个URL或设置cookie的值等

25、什么是spring cloud

    spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。

26、spring cloud五大核心组件

    Eureka:服务注册于发现。

    Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。

    Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。

    Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。

    Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。

27、spring cloud断路器的作用

    当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应 当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)
    断路器有完全打开状态:一段时间内达到一定的次数无法调用并且多次监测没有恢复的迹象断路器完全打开那么下次请求就不会请求到该服务
    半开:短时间内有恢复迹象断路器会将部分请求发给该服务,正常调用时断路器关闭
    关闭:当服务一直处于正常状态能正常调用

28、SpringBoot和SpringCloud

    SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案,旨在快速搭建单个微服务
    而SpringCloud专注于解决各个微服务之间的协调与配置,服务之间的通信,熔断,负载均衡等
技术维度并相同,并且SpringCloud是依赖于SpringBoot的,而SpringBoot并不是依赖与SpringCloud,甚至还可以和Dubbo进行优秀的整合开发

    总结:

  • SpringBoot专注于快速方便的开发单个个体的微服务

  • SpringCloud是关注全局的微服务协调整理治理框架,整合并管理各个微服务,为各个微服务之间提供,配置管理,服务发现,断路器,路由,事件总线等集成服务

  • SpringBoot不依赖于SpringCloud,SpringCloud依赖于SpringBoot,属于依赖关系

  • SpringBoot专注于快速,方便的开发单个的微服务个体,SpringCloud关注全局的服务治理框架

29、负载均衡的意义?

       在计算中,负载均衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载均衡旨在优化资源使用,最大吞吐量,最小响应时间并避免任何单一资源的过载。使用多个组件进行负载均衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务进程。

30、springcloud如何实现服务的注册?

    1.服务发布时,指定对应的服务名,将服务注册到 注册中心(eureka zookeeper)
    2.注册中心加@EnableEurekaServer,服务用@EnableDiscoveryClient,然后用ribbon或feign进行服务直接的调用发现。

31、什么是服务熔断?什么是服务降级?

    在复杂的分布式系统中,微服务之间的相互调用,有可能出现各种各样的原因导致服务的阻塞,在高并发场景下,服务的阻塞意味着线程的阻塞,导致当前线程不可用,服务器的线程全部阻塞,导致服务器崩溃,由于服务之间的调用关系是同步的,会对整个微服务系统造成服务雪崩

    为了解决某个微服务的调用响应时间过长或者不可用进而占用越来越多的系统资源引起雪崩效应就需要进行服务熔断和服务降级处理。

    所谓的服务熔断指的是某个服务故障或异常一起类似显示世界中的“保险丝"当某个异常条件被触发就直接熔断整个服务,而不是一直等到此服务超时。

    服务熔断就是相当于我们电闸的保险丝,一旦发生服务雪崩的,就会熔断整个服务,通过维护一个自己的线程池,当线程达到阈值的时候就启动服务降级,如果其他请求继续访问就直接返回fallback的默认值

32、你所知道的微服务技术栈?

  • 维度(springcloud)

  • 服务开发:springboot spring springmvc

  • 服务配置与管理:Netfix公司的Archaiusm ,阿里的Diamond

  • 服务注册与发现:Eureka,Zookeeper

  • 服务调用:Rest RPC gRpc

  • 服务熔断器:Hystrix

  • 服务负载均衡:Ribbon Nginx

  • 服务接口调用:Fegin

  • 消息队列:Kafka Rabbitmq activemq

  • 服务配置中心管理:SpringCloudConfig

  • 服务路由(API网关)Zuul

  • 事件消息总线:SpringCloud Bus

33、jdk1.8新特性

    1、Lambda表达式

    2、函数式接口

    3、*方法引用和构造器调用

    4、Stream API

    5、接口中的默认方法和静态方法

    6、新时间日期API





点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消