java面试

1、spring核心思想分三大类:控制反转(IOC),依赖注入(DI)和面向切面(AOP)

控制反转:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。也就是说,正常我们都是新建对象,才可以调用对象。现在不需要了,交给容器来管理,我们只需要通过一些配置来完成把实体类交给容器这么个过程。这样可以减少代码量,简化开发的复杂度和耦合度。控制反转的主要形式有两种:依赖查找依赖注入

依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)。

面向切面:是一个概念,通常用来为许多其他的类提供相同的服务,而且是固定的服务,是独立的。提升了代码的复用性,减少了代码的耦合度,减轻程序员的工作负担,把程序的重心放在了核心的逻辑上。

它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面

它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
应用场景有日志记录,性能统计,安全控制,事务处理,异常处理等。

2、序列化和反序列化

Java序列化:把Java对象转换为字节序列的过程。优点:将对象转为字节流存储到硬盘上、方便网络传输、可以在进程间传递对象,java.io.ObjectOutputStream:对象输出流,   该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。

Java反序列化:把字节序列恢复为Java对象的过程。java.io.ObjectInputStream:对象输入流,该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。

3、抽象类和接口的区别

抽象类:使用abstract修饰,不能实例化不能用new,可以有抽象方法也可以没有,如果子类包含父类的所有方法那这个子类可以不是抽象类否则就必须是抽象类,抽象类中只有方法体没有实例

接口:使用interface修饰,不能实例化,一个类只能继承一个接口但可以实现多个接口,接口中的方法都是抽象方法

区别:

抽象类要被子类继承,接口要被类实现;

抽象类中可以作方法声明,也可以做方法实现。接口只能做方法声明。

抽象类中的变量是普通变量,接口里定义的变量只能是公共的静态的常量。

抽象类是重构的结果,接口是设计的结果。

抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。

抽象类主要用来抽象类别,接口主要用来抽象功能。

4、进程和线程:

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间

进程间通信方式:(1)管道(Pipe),(2)命名管道(named pipe),(3)信号(Signal),(4)消息(Message)队列,(5)共享内存,(6)内存映射(mapped memory),(7)信号量(semaphore),(8)套接口(Socket)

java实现线程:(1)继承Thread类,重写run方法(2)实现Runnable接口,重写run方法(3)实现Callable接口,重写call方法(4)使用线程池(有返回值)

volatile 变量是什么?可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。

线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。Vector 是用同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。

线程池:创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。

 在什么情况下使用线程池?
    1.单个任务处理的时间比较短
    2.将需处理的任务的数量大

线程池的好处?减少在创建和销毁线程上所花的时间以及系统资源的开销;如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。

死锁:死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。解决:互斥条件、循环等待条件、不剥夺条件、请求与保持条件

wait()和sleep():wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁。

守护进程:守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。在 Java 中垃圾回收线程就是特殊的守护线程。

notify()和 notifyAll():notifyAll()会唤醒所有的线程,notify()之后唤醒一个线程

start()和run():start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。run() 可以重复调用,而 start() 只能调用一次。

5、java结合

包括:List,Map,Set , List有序可重复,Set是无序不可重复,Map是key-value结构

List, Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
Set下有HashSet,LinkedHashSet,TreeSet
List下有ArrayList,Vector,LinkedList
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
Collection接口下还有个Queue接口,有PriorityQueue类

另外:Java 容器分为 Collection 和 Map 两大类

6、设计模式

7、StringBuffer和StringBuilder 

它们都是可变的字符串。

区别:StringBuffer 是线程安全的,它的所有公开方法都是同步(synchronized 修饰)的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer。、

8、从浏览器输入地址到相应的过程

①输入URL:www.google.com;

②DNS域名解析:域名与IP映射(发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址);

③建立TCP连接: 客户端浏览器与WEB服务器建立TCP(传输控制协议)连接,三次握手;

④发送Http Request:请求信息(客户端浏览器向对应IP地址的WEB服务器发送相应的HTTP或HTTPS请求);

⑤WEB服务器:Nginx反向代理(客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器);

⑥应用服务器:Server处理请求(数据库等交互.....);

⑦用户浏览器:渲染响应页面(客户端浏览器下载数据,解析HTML源文件,解析的过程中实现对页面的排版,解析完成后,在浏览器中显示基础的页面);

⑧关闭TCP连接:响应完成(非持久连接);

9、spring bean

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。而bean的定义以及bean相互间的依赖关系将通过配置元数据来描述。

10、堆和栈

JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

区别:

  • 功能方面:堆是用来存放对象的,栈是用来执行程序的。
  • 共享性:堆是线程共享的,栈是线程私有的。
  • 空间大小:堆大小远远大于栈。

11、GC

GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。

12、反射

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

13、动态代理

JDK 原生动态代理和 cglib 动态代理。JDK 原生动态代理是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。

14、如何实现跨域?

实现跨域有以下几种方案:

  • 服务器端运行跨域 设置 CORS 等于 *;
  • 在单个接口使用注解 @CrossOrigin 运行跨域;
  • 使用 jsonp 跨域;

15、常用设计模式

  • 单例模式:保证被创建一次,节省系统开销。
  • 工厂模式(简单工厂、抽象工厂):解耦代码。
  • 观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
  • 外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。
  • 模版方法模式:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。
  • 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

16、spring有哪些模块

  • spring core:框架的最基础部分,提供 ioc 和依赖注入特性。
  • spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。
  • spring dao:Data Access Object 提供了JDBC的抽象层。
  • spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
  • spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。
  • spring Web mvc:spring 中的 mvc 封装包提供了 Web 应用的 Model-View-Controller(MVC)的实现。

17、为什么要用 spring boot

  • 配置简单
  • 独立运行
  • 自动装配
  • 无代码生成和 xml 配置
  • 提供应用监控
  • 易上手
  • 提升开发效率

spring boot 核心的两个配置文件:

  • bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,且 boostrap 里面的属性不能被覆盖;
  • application (. yml 或者 . properties):用于 spring boot 项目的自动化配置。

18、zookeeper

zookeeper 是什么?

zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 google chubby 的开源实现,是 hadoop 和 hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

zookeeper 都有哪些功能?

  • 集群管理:监控节点存活状态、运行请求等。
  • 主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用 zookeeper 可以协助完成这个过程。
  • 分布式锁:zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用。zookeeper可以对分布式锁进行控制。
  • 命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。

19、==和equals

(1)java中equals和==的区别 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,copy而其本身则存储在堆中。
(2)==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
(3)equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
(4)==比较的是2个对象的地址,而equals比较的是2个对象的内容,显然,当equals为true时,==不一定为true。

 

 

、更多参见https://www.cnblogs.com/bailing80/p/11443409.html

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值