JAVA初中级⾯试题总纲(含答案)
(标⿊粗体为重点)
<和post的请求⽅式的区别?
NO.1、url可见性:
get,参数url可见;
post,url参数不可见
NO.2、数据传输上:
get,通过拼接url进⾏传递参数;
post,通过body体传输参数
NO.3、缓存性:
get请求是可以缓存的
字符串常量几个字节post请求不可以缓存
NO.4、后退页⾯的反应:
get请求页⾯后退时,不产⽣影响
post请求页⾯后退时,会重新提交请求
NO.5、传输数据的⼤⼩:
get⼀般传输数据⼤⼩不超过2k-4k(根据浏览器不同,限制不⼀样,但相差不⼤)
⽽post请求传输数据的⼤⼩根据php.ini 配置⽂件设定,也可以⽆限⼤。
NO.6、安全性:
这个也是最不好分析的,原则上post肯定要⽐get安全,毕竟传输参数时url不可见,但也挡不住部分⼈闲的没事在那抓包玩。安全性个⼈觉得是没多⼤区别的,防君⼦不防⼩⼈就是这个道理。对传递的参数进⾏加密,其实都⼀样。
2.多线程:
NO.1 创建线程有⼏种⽅式?(重点)
1. 继承Thread类,可以直接调⽤Thread类的⽅法,使⽤⽅便,但是不能再继承别的类,可扩展性较差。
2. 实现Runable接⼝,不能直接调⽤Thread类的⽅法,但是还可以继承其他类,可扩展性较强;⽽且Runable接⼝是多线程的最⾼⽗类接⼝,主要是⽤来封装任务的,Thread类也是通过实现Runable接⼝来实现的。
3. 实现Callable接⼝,同上。
4. 还可以通过线程池创建。
NO.2 继承Thread类和实现Runable接⼝⽅式区别?(常问)
1、java是单继承,继承Thread后不能继承别的类,有局限性,但是java可以多实现,通过实现Runabel接⼝后还可以实现别的接⼝,可以**间接实现多继承
2.Runable接⼝是多线程中的上帝,主要就是⽤来封装任务,Thread类也是通过实现它⽽来;
3、使⽤Runable接⼝可以很⽅便对共享资源进⾏传⼊;
NO.3 线程状态有⼏种?(常问,⼀般答出⼏种状态即可)
1.新建(new):新建了⼀个线程,但是还没有调⽤开启线程的start()⽅法;
2.可运⾏(runable):调⽤了开启线程的start()⽅法,但是还没有获得到CPU的执⾏权,处于等待获取执⾏权状态;
菜鸟教程 mysql3. 运⾏(running):已经获得到了CPU执⾏权,并处于正常执⾏状态;
4.死亡(dead):线程run()、main() ⽅法执⾏结束,或者因异常退出了run()⽅法,则该线程结束⽣命周期。死亡的线程不可再次复⽣。
5.阻塞(blocked):这种状态是指处于运⾏状态时因为某种原因放弃了使⽤CPU执⾏权,暂时停⽌了运⾏,需要后续某些操作后⽅可再次进⼊可运⾏状态,进⽽才有机会再次转到运⾏状态,⼀般阻塞情况分三种(了解即可):
(⼀).等待阻塞 :运⾏(running)的线程执⾏o.wait()⽅法,JVM会把该线程放⼊等待队列(waitting queue)中,当别的线程执⾏了notify或者n otifyAll后可对其进⾏唤醒进⼊锁池,让该线程处于抢锁状态,进⽽有机会重新转⼊可运⾏(runnable)状态。
(⼆). 同步阻塞:运⾏(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占⽤,则JVM会把该线程放⼊锁池(lock pool)中。
(三). 其他阻塞:运⾏(running)的线程执⾏Thread.sleep(long ms)或t.join()⽅法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。
当sleep()状态超时、join()等待线程终⽌或者超时、或者I/O处理完毕时,线程重新转⼊可运⾏(runnable)状态。
NO.4 多线程中的 run()和 start()区别 ?
run()⽅法它其实只是⼀个封装任务的普通⽅法,调⽤run()并不会开启线程,start()⽅法会开启线程,底层会调⽤run()⽅法。
NO.5 wait()与 sleep()的区别?(了解)
1、调⽤对象不同:wait()、notify()、notifyAll()等都是 Object 上的⽅法,任何对象都可以作为锁对象进⾏调⽤;s leep()、join()、yield()、interrupted()等都是属于Thread类的静态⽅法;
2、是否释放锁:sleep()⽅法不会释放锁,只让出了CPU执⾏权,但是wait()会释放锁,⽽且会加⼊到等待队列中。
3、使⽤位置:sleep()⽅法可以在任何地⽅使⽤;wait()⽅法则只能在synchronized同步⽅法或同步块中使⽤;
4、重运⾏机制:sleep()过了指定睡眠时间从阻塞状态⾃动回到可运⾏状态,wait()⽅法需要⼿动调⽤notify()或者notifyAll()⽅法⼿动进⾏唤醒,然后进⼊锁池等待。
NO.6 什么情况下需要进⾏线程同步?
多个线程操作共享资源,会造成共享资源安全问题场景下。
3、多线程锁相关:(常问)
NO.1 Sychronized是公平锁还是⾮公平锁?(常问)
⾮公平!
NO.2 Synchronized 1.6之后做了哪些优化?
⾃适应的CAS⾃旋、锁消除、锁粗化、偏向锁、轻量级锁
NO.3 锁有哪些⽤法?锁对象分别是什么?(常问)
1、同步代码块:锁对象为括号中的对象
2、同步⽅法:锁对象为当前对象 this
3、静态同步⽅法:锁对象为class字节码⽂件对象
NO.4 什么是AQS? 什么是CAS?
AQS:
urrent.locks.AbstractQueuedSynchronizer 抽象类,简称 AQS ,是⼀个⽤于构建锁和同步容器的队列同步器,它是整个JUC 包下Lock体系的核⼼,如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore都是基于它来实现的,它 解决了在实现同步容器时设计的⼤量细节问题,它的核⼼构成部分为:使⽤⼀个 先进先出的FIFO 的队列存储排队等待锁的线程,使⽤⼀个⽤volatile修饰的int类型的state同步状态来记录当前是否有线程持有锁**,0表⽰没有线程获得锁,1表⽰有,上锁state就加1,释放锁就对应减1,有重⼊锁现象,这个值就⼤于1,然后需要逐级去释放。
CAS:(常问)
CAS其实就是乐观锁的⼀种实现⽅式,⽽悲观锁⽐较典型的就是Java中的synchronized。
CAS全称compare and swap—就是 "⽐较并替换",保证对数据更改的原⼦性,它是并发条件下修改数据的⼀种机制,然后它还有三个操作数:
> 需要修改的数据的内存地址(V);
> 对这个数据的旧预期值(A);
> 需要将它修改为的值(B);
CAS的操作步骤如下:
1、修改前记录数据的内存地址V;
2、读取数据的当前的值,记录为A;
3、需要修改值时查看地址V下的值是否仍然为A,若为A,则⽤B替换它;若地址V下的值不为A,表⽰在⾃⼰修改的过程中,其他的线程对数据进⾏了修改,则不更新变量的值,⽽是重新从步骤2开始执⾏,这被称为⾃旋;
总结:CAS 就是贯穿于整个AQS体系,是AQS实现的基础。
4. 框架系列:
<Springboot>
N0.1 springboot提供了哪些核⼼功能?
1. 独⽴运⾏ Spring 项⽬Spring Boot 可以以 jar 包形式独⽴运⾏,运⾏⼀个 Spring Boot 项⽬只需要通过 java -jar xx.jar 来运⾏。
2. 内嵌 Servlet 容器
Spring Boot 可以选择内嵌 Tomcat、Jetty 或者 Undertow,这样我们⽆须以 war 包形式部署项⽬。
第 2 点是对第 1 点的补充,因为在 Spring Boot 未出来的时候,⼤多数 Web 项⽬,是打包成 war 包,部署到 Tomcat、Jetty 等容器。
3. 提供 Starter 简化 Maven 配置Spring 提供了⼀系列的 starter pom 来简化 Maven 的依赖加载。
4. ⾃动配置 Spring Bean:Spring Boot 检测到特定类的存在,就会针对这个应⽤做⼀定的配置,进⾏⾃动配置 Bean ,这样会极⼤地减少我们要使⽤的配置。
5. ⽆代码⽣成和 XML 配置**:Spring Boot 没有引⼊任何形式的代码⽣成,它是使⽤的 Spring 4.0 的条件 @Condition 注解以实现根据条件进⾏配置。
NO.2 Spring Boot 和 Spring MVC 和 Spring 有什么区别?
S pring 的完整名字,是 Spring Framework 。它提供了多个模块,Spring IoC、Spring AOP、Spring MVC 等等。所以,Spring MVC 是 Spring Framework
众多模块中的⼀个。⽽ Spring Boot 是构造在 Spring Framework(Spring) 之上的 Boot 启动器,旨在更容易的配置⼀个 Spring 项⽬。
<SpringCloud>
NO.3 什么是SpringCloud?
⾸先SpringCloud是⼀款微服务框架 可以说是⽬前微服务架构的最好的选择,涵盖了基本我们需要的所有组件,所以也被称为全家桶,Spring Cloud 是构建在 Spring Boot 基础之上,⽤于快速构建分布式系统的通⽤模式的⼯具集。或者说,换成⼤家更为熟知的,⽤于构建微服务的技术栈。
NO.4 Spring Cloud 主要提供了哪些功能?(如果英⽂太长,记住中⽂名字即可)
Distributed/versioned configuration 分布式/版本化的配置管理
Service registration and discovery 服务注册与服务发现
Routing 路由
Service-to-service calls 端到端的调⽤
Load balancing 负载均衡
mysql面试题基础知识Circuit Breakers 断路器
Global locks 全局锁
Leadership election and cluster state 选举与集状态管理
Distributed messaging 分布式消息
NO.5 Spring Cloud 有哪些组件?
Spring Cloud的 组件相当繁杂,拥有诸多⼦项⽬。如下脑图所⽰:
我们最为熟知的,就是 ,它是 Netflix 公司基于它们⾃⼰的 Eureka、Hystrix、Zuul、Ribbon 等组件,构建的⼀个 Spring Cloud 实现技术栈。
虽然Spring Cloud的组件很多,但是开发中常⽤的五⼤组件还是要记住:
SpringCloud常⽤的五⼤组件(重点):
组
件
组件名作⽤
注
册
Nacos 作⽤:实现服务治理(服务注册与发现)
简介:Spring Cloud Eureka是Spring Cloud Netflix项⽬下的服务治理模块。
由两个组件组成:Eureka服务端和Eureka客户端。Eureka服务端⽤作服务注册中⼼。⽀持集部署。
中⼼Eureka客户端是⼀个java客户端,⽤来处理服务注册与发现。
在应⽤启动时,Eureka客户端向服务端注册⾃⼰的服务信息,同时将服务端的服务信息缓存到本地。客户端会和服务端周期性的进⾏⼼跳交互,以更新服务租约和服务信息。
熔
断器Hystrix
作⽤:断路器,保护系统,控制故障范围。
简介:为了保证其⾼可⽤,单个服务通常会集部
署。由于⽹络原因或者⾃⾝的原因,服务并不能保
证100%可⽤,如果单个服务出现问题,调⽤这个服
务就会出现线程阻塞,此时若有⼤量的请求涌
⼊,Servlet容器的线程资源会被消耗完毕,导致服
务瘫痪。服务与服务之间的依赖性,故障会传播,
会对整个微服务系统造成灾难性的严重后果,这就
是服务故障的“雪崩”效应。
⽹关Zuul
作⽤:api⽹关,路由,负载均衡等多种作⽤
类似nginx,反向代理的功能,不过netflix⾃⼰增加
了⼀些配合其他组件的特性。
在微服务架构中,后端服务往往不直接开放给调⽤gets函数格式
端,⽽是通过⼀个API⽹关根据请求的url,路由到
相应的服务。当添加API⽹关后,在第三⽅调⽤端和
服务提供⽅之间就创建了⼀⾯墙,这⾯墙直接与调
⽤⽅通信进⾏权限控制,后将请求均衡分发给后台
服务端。
负
载均衡Ribbon
Spring Cloud Ribbon是⼀个基于HTTP和TCP的
客户端负载均衡⼯具,它基于Netflix Ribbon实
现。通过Spring Cloud的封装,可以让我们轻松地
将⾯向服务的REST模版请求⾃动转换成客户端负载
均衡的服务调⽤。
服
务调⽤Feign
c语言数据结构菜鸟教程作⽤:服务调⽤
简介:Feign是⼀个声明式WebService客户端。使⽤
Feign能让编写Web Service客户端更加简单,它的
使⽤⽅法就是定义⼀个接⼝,然后在上⾯添加注数据结构教程第5版李春葆上机实验题答案
解,同时也⽀持JAX-RS标准的注解。Feign也⽀持
可插拔式的编码器和解码器。SpringCloud对Feign
进⾏了封装,使其⽀持了Spring MVC标准注解和
HttpMessageConverters。Feign可以与Eureka
和Ribbon组合使⽤以⽀持负载均衡。
NO.6 Spring Cloud 和 Spring Boot 的区别和关系?(以下三点:)
1. Spring Boot 专注于快速⽅便的开发单个个体微服务。
2. Spring Cloud 是关注全局的微服务协调整理治理框架以及⼀整套的落地解决⽅案,它将 Spring Boot 开发的⼀个个单体微服务整合
并管理起来,为各个微服务之间提供:配置管理,服务发现,断路器,路由,微代理,事件总线等的集成服务。
3. Spring Boot 可以离开 Spring Cloud 独⽴使⽤,但是 Spring Cloud 离不开 Spring Boot ,属于依赖的关系。
总结:
Spring Boot 专注于快速,⽅便的开发单个微服务个体。
Spring Cloud 关注全局的服务治理框架。
5.数据库(MySQL) :
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论