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表达式的重要特征:
  1. 可选类型声明:不需要声明参数类型,编译器可以用于识别参数值((x1,x2))
  2. 可选的参数圆括号:一个参数无需定义圆括号,单多个参数需要定义圆括号
  3. 可选的大括号:如果函数主体包含了一个语句,就不需要使用大括号
  4. 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回一个数值
2、添加默认方法
  1. java8添加了默认的方法,简单说,就是接口默认可以有实现方法,而且不需要实现类去实现方法,只需要在方法前面增加一个default关键字即默认方法
  2. 之前有了解为什么要有这个特性? 当我们需要修改接口的时候,需要修改全部实现该接口的类,对于已经发布的版本,是没办法在给接口添加新方法,不能影响已有的实现,如果引进默认方法,就可以解决接口修改与现有实现不兼容的问题。
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一个汽车类,非常麻烦)

阶段二(用户自己传递奔驰车完成功能)

用户类添加构造方法汽车类作为参数,用户需要用车,只需要传递一辆车就可以实现。
(问题:现在汽车类是一辆具体的(宝马),那换一辆车开,就需要修改汽车里面的方法,就比较麻烦)

阶段三 (用传递车完成功能(不是具体的车)

这里可以定义车的接口

  1. 宝马车类
  2. 奔驰车类
  3. 奥迪车类
    实现车(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常用设计模式
为什么使用设计模式:首先设计模式是可以被我们反复使用、优化经验设计的一个总结,使我们的代码更容易被人理解、代码重用性,代码的可靠性、程序的重用性

单列模式、工厂模式、代理模式
单列模式特点:
  1. 单列模式只有一个类
  2. 单列对象必须由单列类自行创建
  3. 单列类对外提供一个访问单列的全局访问点
    (注:私有静态变量、构造方法,公有的静态访问方法)
  4. 懒汉模式和饿汉模式
    懒汉模式特点:类加载时没有生成单列,当我们调用getinstance方法时才会创建这个单列
    饿汉模式特点:类加载的时候就创建一个静态对象出来,以后不再改变,线程相对来说就是安全的。
  5. 应用场景:频繁创建和销毁对象,频繁访问数据库或文件对象。就可以使用单列模式。单列模式只允许创建一个对象,因此比较节省内存。速度快。
工厂模式:
  1. 简单工厂模式:
  2. 工厂方法:
  3. 抽象工厂模式:
    属于创建型模式,它提供了一种创建对象最佳方式,为什么了,在工厂模式中,我们创建对象时不会暴露客户端创建逻辑,通过共同的接口指向新创建的对象。

举列:当我们需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆车是怎么做出来的,以及这辆车是怎么实现的。
如:创建一个车的接口,创建一个宝马奔驰类实现车的接口,在创建一个工厂,用户调用的时候(只需要告诉工厂是需要宝马还是奔驰就行了)。
优点:扩展性高、如果想增加一个产品只需要在扩展一个工厂类,我们只需要关心产品接口就可以。
缺点:每次增加一个产品,就要对应增加实现类和工厂,在我们开发中,类的个数就会成倍增加,也增加了类之间的依赖。
应用场景:我们计划是不同的条件创建不同的实列,解决了我们接口选择的问题。
代码案例:https://www.runoob.com/design-pattern/factory-pattern.html

代理模式

什么是代理模式:

  1. 通过代理控制对象的访问,可以在对象调用方法之前,调用方法之后去处理新的功能。
  2. 代理在原有的代码乃至业务流程都不修改的情况下,直接在业务流程中切入新代码,增加新功能,和spring aop面向切面编程很相似。

代理模式运行的场景:

  1. spring aop、日志打印、异常处理、事务控制、权限控制等

代理分类:

  1. 静态代理(静态定义代理类),也是动态代理的理论基础
  2. 动态代理(动态生产代理类,也称为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编写的软件程序。

mybatis

mybatis是一个持久层框架,是实现了一个使用JPA对数据库进行增删改查的一个开源框架,他对jdbc数据库的过程进行了封装,是开发者更专注与SQL的本身,不用去关注实现的过程,他是一个半自动华的orm的组件。Hibernate是一个完完全全的orm的组件

bean的声明周期

1、 实例化(Instantiation)

2、 属性设置(populate)

3、 初始化(Initialization)

4、 销毁(Destruction)

数据库事务:

原子性:事务都是一个整体的,不可分离的,要么全部成功,要么全部失败
一致性:数据库执行前后,数据要和真实状态保持一致。这种一致性,在我们开发定义,自己给定的规格
列如:a仓库:5000 b仓库:5000 他们互转的数量不能大于5000,数量不能是负数
隔离性:多个用户并发操作数据库的时候,一个用户操作事务不能被其他用户事务干扰,也就是多个事务操作的隔离
持久性:一个事务提交成功了,那么他对数据库的数据操作就是永久性的,就算数据库出现故障,数据也是永久保存下来的。

java集合

List、Set、Map

List:有序、可以重复、可以为空,使用add方法存储数据。取出数据使用get方法。用到什么场景了,
LinkedList和Arraylist都实现了list接口
ArrayList:实现了list接口,基于索引的接口,底层是数组,查询快。所有查询量大的时候会使用list作为集合来查。

LinkedList:以链表的形式进行存储数据,一个指向前一个,一个指向下一个,一般对顺序要求较高的增删操作频繁的场景,因为linkedlist有指定的方法,可以快速进行操作。

Set:元素是无序的,并且元素不可以重复,允许一个空元素。可以高效添加删除、用于判断,可以过于重复元素

Map:
HashMap:以键值对的方法存储(key,value),并且键不可以重复,允许一个键为空。
用于我们需要指定key取出或者存储的时候

多线程

并行、并发、串行的区别
串行:串行在时间上不可能发生重叠,前一个没有执行完,下一个不能执行,只能等待,前一个执行完,下一个才能执行。
并行:并行在时间上是重叠的,两个任务同时执行,互不干扰。
并发:并发是允许两个任务相互干扰,同一时间,只有一个任务执行,交替执行。

什么是线程安全

当多个线程访问一个对象的时候,如果没有进行额为的同步或其他协调操作的时候,调用这个对象的访问结果都是正确的,那么可以说这个对象线程就是安全的。

Thread和Runnable

1、首先Thread和Runnable是一个继承关系,无论是使用Thread或者Runnable,都会new Thread,在执行一个run方法,如果是比较复杂的任务,那就可以用继承 thread,如果只是简单的执行一些方法,那就可以实现Runnable

线程的生命周期和状态

新建:新创建一个线程
就绪:线程创建后,其它线程调用该对象的start方法,该状态的线程位于可运行的线程池中,变的可运行,等待获取CPU的使用权限。
运行:就绪状态线程获取CPU权限,执行程序代码。
阻塞:阻塞状态是因为线程某种原因放弃了CUP的使用权,暂时停止运行,直到进入线程就绪状态,才有机会进入运行状态,
列如sleep方法让线程进入休眠状态,resume(v曾)方法可以让线程立即运行
死亡:死亡状态就是说该线程执行完了或者遇到了异常退出了run方法,该线程生命周期结束

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜡笔小心_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值