Java初级面试题
Posted 蜡笔小心_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java初级面试题相关的知识,希望对你有一定的参考价值。
Java面向对象有哪些特征
继承、封装、多态三大特征相互相乘
封装:封装内部的一些实现机制,就跟方法封装一些实现的机制一样
继承:就是从已有的类派生出新的类,新的类继承已有类的行为和属性,并扩展新的能力。
多态:多态有多种形式,封装和继承最终归于多态。多态指的是类与类的关系,多态必要的三要素,继承、重写,父类引用指向子类对象。
为什么这些面向特征能帮助我们写很好的代码:
封装:封装好的东西可以重复利用,增加了代码的复用性
继承:也是增加代码的复用性
多态:增加了代码的可移植性,健壮性、灵活性,实现可以随便
ArrayList和LinkedList有什么区别
相同点:
首先ArrayList和LinkedList都实现了list接口
不同点:
ArrayList是基于索引数据接口,它的底层是数组。
LinkedList:是以元素列表的形式存储他的数据。
linkedlist比ArrayList更占空间,因为linkedlist一个字节存储两个引用,一个指向前一个元素,一个指向下一个元素。
查询速度方面ArrayList要大于linkedlist,因为ArrayList是基于索引数据结构,使用索引在数组里面搜索和查询数据是很快的。但是删除数据开销比较大,因为需要重写排列数组中所有的数据。还就是ArrayList是有序的。
在插入和删除方面linkedlist要大于ArrayList,
JDK1.8新特性
支持函数式编程,而且还拥有新的日期API,Stream API等操作
Lambda表达式,允许把函数作为一个方法的参数,表达式可以使代码看起来更加简洁紧凑、简洁可观,阅读性跟好。
1、Lambda表达式的重要特征:
- 可选类型声明:不需要声明参数类型,编译器可以用于识别参数值((x1,x2))
- 可选的参数圆括号:一个参数无需定义圆括号,单多个参数需要定义圆括号
- 可选的大括号:如果函数主体包含了一个语句,就不需要使用大括号
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回一个数值
2、添加默认方法
- java8添加了默认的方法,简单说,就是接口默认可以有实现方法,而且不需要实现类去实现方法,只需要在方法前面增加一个default关键字即默认方法
- 之前有了解为什么要有这个特性? 当我们需要修改接口的时候,需要修改全部实现该接口的类,对于已经发布的版本,是没办法在给接口添加新方法,不能影响已有的实现,如果引进默认方法,就可以解决接口修改与现有实现不兼容的问题。
3、Stream基础操作
Stream是Java8 AIP添加了一个新的抽象称为流,可以以一种声明的方法处理数据
使用方法就是集合.Stream方法.forEach方法进行遍历,或者是点Map方法。
4、Java时间API
Java8在java.time包下提供了很多新的API,比较重要的两个是local(本地)-简化了日期时间的处理,没有时区的问题,Zoned(时区)-通过指定时区处理日期时间
java中==equals有哪些区别
==:有分为基本数据类型和引用数据类型,如果是基本数据类型就是比较他们的数值是否相等,如果是引用类型就比较地址是否相等。
equals():是一个方法,用来比较两个对象内容是否相等
6、Java中异常处理机制
try、catch、finally:捕获异常
throw:抛出异常
throws:声明异常
7、重载和重写的区别
重载:实在一个类里面的,一个方法可以有多个实现,参数和返回值不同即可
重写:是子类父类中,子类重写父类的方法。
重写和重载方法名必须相同
String、StringBuffer、StringBuilder区别以及使用场景
都可以存储和操作字符串
String:声明的变量是引用类型,每次改变量值都会新建一个String对象,所以频繁更改变量的时候,避免使用String。
StringBuffer/Stringbuilder:都是可以直接修改,而不会在新建一个对象。变量值是进行追加,然后StringBuffer是jdk0版本的,Stringbuilder是jdk5版本时候的,stringbuilder效率要比stringbuffer效率高,因为stringbuffer方法有加上安全锁,线程安全了,对应的效率就低了
怎样声明一个类不会被继承,什么场景下会用
被fianl修饰
当前类不在被继承,不需要重写。
Spring的核心
Spring是一个开源框架,为了简化企业开发而诞
生的,我们现在用到的springboot、springcloud都是基于spring基础之上研发的。我现在做的MES系统不是原生的springcloud,是通过springboot集成的。
开发中用到服务端采用三层架构,每一层都提供了技术支持:
表示层(web):提供了springmvc等框架的整合
业务层(service):管理事务、记录日志等
持久层(dao):提供了与mybatis、hibernate等框架整合
spring的核心是ioc控制反转、aop面向切面。
ioc控制反转:
1、控制什么:控制对象的创建和销毁、就是对接的声明周期
2、反转什么:之前创建一个对象都是new,现在有了IOC,就可以把对象控制权交给了IOC容器。
这样说可能有点模糊:
举列有一个用户,有一辆车,每天就是干两件事,上学、回家。
阶段一(用户自己创建一辆车完成功能)
创建
一个汽车类
一个用户类
当用户需要用到车,就new一个汽车类,调用方法,实现我们要去的地方
(问题:如果每次用车时,就要new一个汽车类,非常麻烦)
阶段二(用户自己传递奔驰车完成功能)
用户类添加构造方法汽车类作为参数,用户需要用车,只需要传递一辆车就可以实现。
(问题:现在汽车类是一辆具体的(宝马),那换一辆车开,就需要修改汽车里面的方法,就比较麻烦)
阶段三 (用传递车完成功能(不是具体的车)
这里可以定义车的接口
- 宝马车类
- 奔驰车类
- 奥迪车类
实现车(car类)接口
用户类构造方法参数是car接口,没有具体的实现方法,所以现在可以用到容器进行管理,当我们需要用到车,直接到容器里面拿。这里也是一个控制反转的思想,我们把车创建销毁交给容器,而且控制权也交给容器,我们只是使用功能。
项目中有SpringUtils的工具类,方便我们在开发中获取bean。
这里面大概就是我理解ioc的控制反转和注入。
案例代码地址:https://baijiahao.baidu.com/s?id=1654948911688026610&wfr=spider&for=pc
aop:是面向切面编程,简单的说在程序运行时候,动态的将代码切入到类的指定方法,指定位置上的编程思想就是面向切面编程。也可也说动态代理。
列举:做了一个sn调拨功能:
解决:
这里直接引用spring事务@Transactional(rollbackFor=Exception.class)和动态代理JDK代理实现。
只需要在Service业务上面加上注解,这样就保证了事务的原子性,也解决了代码的臃肿冗余性。
这里大概就是我对aop面向切面的大概理解。
java常用设计模式
为什么使用设计模式:首先设计模式是可以被我们反复使用、优化经验设计的一个总结,使我们的代码更容易被人理解、代码重用性,代码的可靠性、程序的重用性
单列模式、工厂模式、代理模式
单列模式特点:
- 单列模式只有一个类
- 单列对象必须由单列类自行创建
- 单列类对外提供一个访问单列的全局访问点
(注:私有静态变量、构造方法,公有的静态访问方法) - 懒汉模式和饿汉模式
懒汉模式特点:类加载时没有生成单列,当我们调用getinstance方法时才会创建这个单列
饿汉模式特点:类加载的时候就创建一个静态对象出来,以后不再改变,线程相对来说就是安全的。 - 应用场景:频繁创建和销毁对象,频繁访问数据库或文件对象。就可以使用单列模式。单列模式只允许创建一个对象,因此比较节省内存。速度快。
工厂模式:
- 简单工厂模式:
- 工厂方法:
- 抽象工厂模式:
属于创建型模式,它提供了一种创建对象最佳方式,为什么了,在工厂模式中,我们创建对象时不会暴露客户端创建逻辑,通过共同的接口指向新创建的对象。
举列:当我们需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆车是怎么做出来的,以及这辆车是怎么实现的。
如:创建一个车的接口,创建一个宝马奔驰类实现车的接口,在创建一个工厂,用户调用的时候(只需要告诉工厂是需要宝马还是奔驰就行了)。
优点:扩展性高、如果想增加一个产品只需要在扩展一个工厂类,我们只需要关心产品接口就可以。
缺点:每次增加一个产品,就要对应增加实现类和工厂,在我们开发中,类的个数就会成倍增加,也增加了类之间的依赖。
应用场景:我们计划是不同的条件创建不同的实列,解决了我们接口选择的问题。
代码案例:https://www.runoob.com/design-pattern/factory-pattern.html
代理模式
什么是代理模式:
- 通过代理控制对象的访问,可以在对象调用方法之前,调用方法之后去处理新的功能。
- 代理在原有的代码乃至业务流程都不修改的情况下,直接在业务流程中切入新代码,增加新功能,和spring aop面向切面编程很相似。
代理模式运行的场景:
- spring aop、日志打印、异常处理、事务控制、权限控制等
代理分类:
- 静态代理(静态定义代理类),也是动态代理的理论基础
- 动态代理(动态生产代理类,也称为JDK自带动态代理),使用反射完成代理,需要有顶层接口才能使用,常见是mybatis的mapper文件是代理
举列:
静态代理
案例:https://blog.csdn.net/weixin_43122090/article/details/105462226
servlet声明周期
加载并实列化,初始化,服务,销毁
程序启动的时候,就会进行加载实列化,初始化,然后当用户进行操作的时候,就会进入控制层,服务层,由方法调用doget或dopost方法来响应用户,然后当容器资源紧张,或者长时间没有接受到请求就会销毁。
多线程
三种创建方式
继承Thread类
实现Runnable接口
实现Callable接口
JVM、JRE、JDK的关系
JDK是java中开发的工具包,开发中API的一些包都是来自于JDK中
JER是java中的一个运行环境
JVN是java中的虚拟机,是java实现跨平台最重要的部分,可以运行java编写的软件程序。
以上是关于Java初级面试题的主要内容,如果未能解决你的问题,请参考以下文章
分享 2021 年最新阿里 java 面试题:java 初级 + 中级 + 高级面试题(附答案),让你的面试之路畅通无阻!