面向对象:

1.注重事情有哪些参与者,有哪些对象,每个对象需要做些什么,更易于复用和扩展

2.封装 不需要关心内部类是怎样实现的private 封装的思想(orm框架):,继承

子类共性的方法或者属性直接使用父类的 不需要自己定义,只需扩展自己个性化的,多态 继承 方法重写 父类引用指向子类的对象,但是无法调用子类的特有功能.

jdk jre jvm 区别

jdk java开发工具

jre java运行时环境 谁需要运行java环境 就使用

jvm 虚拟机

jdk包含jre jre包含jvm

==和equals比较

== 对比的是栈中的值,基本数据类型是变量值 引用类型是堆中内存对象的地址

equals: object默认采用的是==比较

equals 重写比较的是 两个字符串的内容

final作用

修饰类 类不可被继承

修饰方法 表示方法不可重写,不可覆盖,可以重载

修饰变量 表示变量一般被赋值就不可以更改它的值

修饰成员变量 可以在非静态初始化块,声明该变量或者构造器中执行初始化值

修饰的(static)类变量 只能在静态初始化块中指定初始化值,声明该变量或者构造器中指定初始化值

修饰局部变量 系统不会为局部变量进行初始化,使用之前一定要赋值

局部变量和匿名内部类 只能访问局部变量final修饰的原因 ?

内部类与外部类是处于同一个级别,内部类不会因为定义在方法就会随着方法的执行完毕而销毁.

将局部变量复制了一份作为内部类的成员变量

保证变量值一致性使用fianl,这也是一种妥协

try、catch。finally 的基础用法,在 return 前会先执行 finally 语句块,所以是先输出 finally 里的 ,再输出 return 的 。

String是fianl修饰的,不可变的,每次操作都会产生新的String对象,浪费资源

StringBuffer和StringBuilder都是在原对象上操作

StringBuffer是线程安全的, StringBuilder线程不安全

StringBuffer方法都是sychronized(锁)修饰的

性能: StringBuilder>StringBuffer>String

需要经常改变字符内容使用后面两个

优先使用StringBuilder,多线程使用共享变量时使用StringBuffer

重载与重写

重载 发生在同一个类,方法名必须相同,参数列表不同,方法返回值和访问修饰符可以不同

重写:发生父子类中 方法名参数列表必须相同,返回值小于等于父类,访问修饰符范围要大于等于父类,如果父类是praivate子类不能重写

接口与抽象类的区别

抽象类 对类的本质的抽象 是 is a的关系

接口是对行为的抽象 是 like a 的关系

hashCode(哈希马)与equals(安什么样的)

hashCode

equals: 对比两个对象什么时候是否相等,按什么规则去对比

hashCode:作用是获取哈希马,也称为散列码 实际返回一个int整数,这个哈希马的作用是确定该对象在哈西表中的位置 ,散列表存储的是键值对(key-value) 特点:能根据键快速检索出对应的值,提高了执行速度

hashset (集合不能放重复元素)会计算对象的hashCode值来判断对象加入的位置,看该位置是否有值

没有,放进去 有 如果hashCode不一样就不用重写equals方法比较是否是同一个,不是重新散列放它的位置

如果两个对象相等,则hashCode一定也是相同的

两个对象相等,对两个对象分别调用equals方法都返回true

两个对象有相同的hashCode值,他们也不一定相等

equals方法被覆盖过,hashCode方法也必须要覆盖

hashCode()的默认行为是对堆上的对象产生独特值,如果没有重写hashCode()

则该class的两个对象无论都不会相等(即使这两个对象指向相同的数据)

ArrayList和Llinkedlist

ArrayList:基于动态数组,连续内存存储,适合下标 扩容机制:因为数组长度

,超出长度需要新建数组,将老数组的数据拷贝到新数组,使用尾插法

并制定初始容量可以极大提升性能,甚至超过linkedList

Llinkedlist 基于链表,可以存储在分散内存中,适合做数据插入及删除操作,不适合查询,遍历linkedlist必须使用iterator遍历获取元素

HashMap和HashTable

HashMap key value 结构线程不安全 数组+链表 jdk8 数组长度超过64 链表转为红黑树 允许key和value为null ,hashTable不允许

HashTable 线程安全

hashmap:底层实现: 数组+链表实现

计算key的hash值,二次hash然后对数组长度,取模,对应数组下标,没有hash冲突(下标位置没有元素),则创建Node存入数据,产生冲突,进行equal比较,相同取代,不同,则判断链表高度插入链表,高度达到8,数组长度达到64则转变为红黑树,长度低于6则将红黑树转为链表

key为null,存在下标0的位置

再看一看

数组扩容与ArrayList相同,数组长度固定

ConcurrentHashMap原理

jdk7

如何实现一个IOC 容器

配置文件指定需要包扫描的路径

定义一些注解,分别访问控制层,业务层,数据持久层,依赖注入注解,获取配置文件注解

从配置文件获取需要扫描的路径,获取当前路径下的文件信息及文件夹信息

将当前路径下所有以.class结尾的文件添加到一个set集合中进行存储

遍历这个set集合,获取在类上有指定注解的类,并将其交给IOC容器管理,定义一个map用来存储这些对象

遍历这个IOC容器,获取到每一个类的实列,判断里面是有依赖其他类的实列,然后进行递归注入.

什么是字节码? 采用字节码好处是什么?

字节码:编译程序只需面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转化为特定系统的机器码执行,在java中,这种虚拟机理解的代码叫做字节码,扩展名为.class的文件,它不面向任何待定处理,只面向虚拟机

好处:java语言通过字节码的方式提高运行效率,可以在多种不同的计算机运行

跨域问题.

java中的异常体系

Error是程序无法处理的错误,一旦出现这个错误,则程序被迫停止

Expection不会导致程序停止 RunTimeExecption 发生在程序运行过程中,运行时异常,会导致当前线程执行失败 checkedExpection 检查编译异常

线程生命周期,线程有几种状态

线程五中状态:

创建 :新建一个线程

就绪 :线程对象创建后,其他线程调用了该对象的start方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权

运行: 就绪状态的线程获取了CPU,执行程序代码.

阻塞 是线程因为某种原因放弃CPU使用权,暂时停止运行.直到线程进入就绪状态,才有机会转到运行状态

死亡 线程运行完毕,或因异常退出run方法,该线程结束生命周期.

阻塞分为三种

等待阻塞: 运行的线程执行wait(Object类的)方法,该线程会释放占用的所有资源,jvm会把该线程放入等待池中.不能自动唤醒,需要其他线程调用notify才能被唤醒

同步阻塞:运行的线程在获取对象的同步锁,若该同步被别的线程占用,则jvm会把该线程放入锁池中.

其他阻塞 :运行程序执行sleep或join方法,或者发出了I/O请求,jvm会把该线程置位阻塞状态.sleep是thread类的方法

sleep() wait() join() yield()的区别

锁池:所有需要竞争同步锁的线程都会放在锁池中,如果当前对象的锁已经被其中一个线程得到,则其他线程需要在这个锁池等待,当前面的线程释放同步后,锁池中的线程去竞争同步锁,当某个线程得到后会进入就绪列进行等待cpu资源分配

等待池:

调用wait()方法,线程会进入等待池中,只有调用了notifyAll(),或notifyAll()后等待池的线程才会开始去竞争锁.

sleep是Thread类的静态本地方法,wait则是Object类的本地方法.

sleep方法不会释放lock除非调用interrupt方法,超时,但是wait会释放,而且会加入到等待队列中.

sleep一般用于当前线程的休眠,或者轮循暂停操作,wait则多用于多线程之间的通信.

sleep不需要同步器,不要被唤醒(休眠之后推出阻塞),wait需要依赖synchronize关键字,wait没有指定时间,需要被唤醒.

sleep会让出CPU执行时间,wait不一定,wait后还有机会重新竞争到锁继续执行的

yield()执行后线程直接进入就绪状态,马上释放了CPU的执行权,依然保留了CPU的执行资格,所以有可能CPU下次进行线程调度还会让这个线程获取到执行权继续执行.

线程执行 sleep() 方法后进入超时等待(TIMED_WAITING)状态,而执行 yield() 方法后进入就绪(READY)状态。

sleep() 方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程运行的机会;yield() 方法只会给相同优先级或更高优先级的线程以运行的机会。

join()执行后进入阻塞状态.

springMVC工作的流程

用户发送请求之前端控制器DispatcherServlet

DispatcherServlet收到请求调用HandlerMapping处理器映射器(多个映射器遍历).

处理器映射器找到具体的处理器(可以根据xml配置,注解进行查找)生成处理器及处理器拦截器(如果有则生成)一并返回DispatcherServlet.

DispatcherServlet调用HandlerAdapter处理器适配器(controller,也叫后端控制器,还有Servlet(普通处理器),注解(处理器)使用反射获取方法,参数)

controller执行完成后返回ModelAndView.

HandlerAdapter将controller执行结果ModelAndView返回DispatcherServlet.8)DispatcherSerlet将ModelAndView传给ViewReslover视图解析器.

ViewReslover解析返回具体View.

DispatcherServlet根据View进行视图渲染(即将模型数据填充至视图中).

DispacherServlet响应用户.

springBean的生命周期

解析类得到BeanDefinition

如果有多个构造方法,则要推断构造方法

确定好构造方法,进行实列化得到一个对象

对象中的加了@Autowired注解的属性进行属性填充

回调Aware方法

调用BeanPostProcessor的初始化前的方法

调用初始化方法

进行Aop

如果当前创建bean是单列的则会把bean放入单列池

使用bean

Spring容器关闭时调用DisposableBean中destory()方法

spring支持的bean的作用域

singletion: 默认,每个容器中只有一个bean的实列

单列的模式由BeanFactory自身来维护,该对象的生命

周期是与IOC容器一致的(每次注入都会被创建)

prototype: 为每一个bean提供实列,在每次注入都会创建一个新的对象

request : bean被定义为在每个HTTP请求中创建一个单列对象,也就是说在单个请求都会复用这一个单列对象

session: request范围类似,确保没个session中只有一个实列

websocket: bean被定义为在websocket的生命周期中服用一个单列对象

application: bean被定义在ServletContext的生命周期中复用一个单列对象.

什么是MVCC

多版本并发控制:读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁就不冲突了,不同的事务

session会看到自己特定的版本数据,版本链

MVCC只在已提交和可重复度两个隔离级别下工作,其他两个隔离级别(未提交读,串行化)与MVCC不兼容.因为读未提交总是读取最新的数据行.,而不是符合当前事务版本的数据行,

而Serlalizable(串行化)则会对所有读取的行都加锁.

已提交读和可重复读的区别: 在于他们生成的ReadView的策略不同.

开始事务时创建readview , readview维护当前的活动的事务id,

排序生成一个数组,访问数据,获取数据中的事务id(获取的是事务id最大的记录),对比readview:

如果在readview的左边(比readview都小),可以访问(在左边意味着该事务已经提交)

如果在readview的右边(比readview都大) 或者就在readview中,不可以访问,获取roll_pointer,取上一版本重新对比(在右边意味着,该事务在readview生成之后出现,在readview中意味着该事务还未提交)

已提交读隔离级别下的事务在每次查询的开始都会生成一个独立的Readview,可重复读隔离级别则在第一次读的时候生成一个Readview,之后的读都复用之前的Readview

这就是Mysql的Mvcc通过版本链,实现多版本,可并发读写,写.

通过Readview生成策略的不同实现不同的隔离级别.

Aop理解

将程序的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,

然后注入到对象(具体业务逻辑)中去.AOP可以对某个对象或某些对象的功能进行增强,比如对象中的方法进行增强,可以执行某个方法之前额外的做一些事情,在某个方法执行之后额为的做些事情.

IOC的理解

容器概念:实际上是一个map(key,value),里面存的是各种对象(在

xml里配置的bean节点,@repository,@service,@controller,@component)

在项目启动的时候会读取配置文件里面的bean节点,

根据全限定类名使用反射创建对象放到map里,扫描到

打上上述注解的类还是通过反射创建对象放到map里

控制反转:通过IOC容器主动创建对象,类似于粘合剂

依赖注入:获得依赖的过程被反转后,获得依赖对象的过程有自身管理变为了有IOC容器主动注入.

依赖注入是实现IOC的方法,就是由IOC容器在运行期间,动态将某种依赖关系注入到对象之中.

springBoot有哪些特点

独立运行:

Spring Boot 而且内嵌了各种servlet容器,Tomcat,Jetty等,现在不在需要打成war包部署到容器中,SpringBoot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内.

简化配置:

spring-boot-starter-web启动器自动依赖其他组件,减少了 maven的配置.

自动配置:

springBoot 能根据当前类路径下的类,jar包来自动配置bean

boot-starter-web 启动器就能有web的功能,无需其他配置.

什么是Spring Boot Starter

启动器是一套方便的依赖描述机制,SpringBoot有多个启动器,主要用来整合第三方框架,这些启动器官网已经定义排除了版本冲突等问题,用户使用时只需少量的配置,真正做到了开箱即用.

常见的跨域方式

JSONP方式 但是JSONP只可以发送get请求,无法发送其他类型请求

RestFul 风格 利用/user/xx实现数据传递

CORS (Cross-origin resource sharing)跨资源共享 来解决跨域问题

mvvm框架是什么?

MVVM是Model-View-ViewModel的简写.MVVM就是将其中的view的状态和行为抽象化.

v-if 和 v-show 的区别

v-if在编译过程中会被转化成三元表达式,条件不满足不渲染此节点.

v-show 会被编译成指令, 条件不满时控制样式将此节点隐藏

使用场景

v-if适用于在运行时很少改变条件, 不需要频繁切换条件的场景

v-show 适用于需要非常频繁切换条件的场景

Vue中对数组操作的方法有哪些,并说明其作用

push 在结尾新增一个元素

shift 删除第一个元素

pop 删除最后一个元素

unshift 在第一位新增元素

sort 排序元素

reverse 反转元素

请简述什么是NGINX

NGINX是一个轻量级的web服务器和反向代理服务器,用于 HTTP,HTTPS,SMTP

,POP3和IMAP协议.

目前使用最多的web服务器或者代理服务器, 例如 淘宝 网易 新浪

NGINX的主要工能如下:

反向代理服务器

实现负载均衡

虚拟主机

Nginx常见命令

启动: starter nginx

重启: service nginx reload

停止 NGINX -s stop

查看版本 nginx -v

检查配置文件是否正确 nginx -t

简述什么是正向代理/反向代理

反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,及用户直接访问反向代理服务器就可以做到获取目标服务器的资源,同时,用户不需要知道目标服务器的地址,反向代理服务器可用来作为web加速,即使使用反向代理作为web服务器的前置机来降低网路和服务器的负载,提高访问效率.

总结

反向代理服务器位于 用户和服务器之间

用户以为代理服务器就是目标服务器

用户无需了解真实服务器的地址

反向代理服务器保护了服务器端的信息(服务器端代理)

正向代理

正向代理 一个位于客户端和原始服务端之间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器

转交请求并将获取的内容返回客户端.客户端才能使用正向代理

特点

代理服务器位于用户与服务之间

用户了解访问的服务器到底是谁

只有用户可以使用正向代理(客户端代理)

正向代理保护了用户的信息

索引的基本原理:

索引用来快速查找那些具有特定值的记录,就是把无序的数据变成有序的查询

对排序结果生成倒排表

MySQL主从同步原理

MySQL主从复制主要有三个线程 master一条线程,salve中的两条线程

过程:

主节点 binlog(日志) 主从复制的基础是主库记录数据库的所有变更记录到binlog

主节点 log dump.当binlog有变动时,log dump 线程读取器内容发送给从节点.

从节点 I/O线程接收binlog内容,并将其写入到relay log文件中

从节点的SQL线程读取relay log 文件内容对数据进行重放,最终保证主从数据库的一致性.

全同步复制

半同步复制

简述MySQL中索引类型对数据库的性能影响

普通索引: 允许被索引的数据列包含重复的值

唯一索引: 可以保证数据记录的唯一性

主键: 是一种特殊的索引,在一张表中只能定义一个主键索引,主键用于表示唯一记录,使用关键字PRIMARY KEY来创建.

联合索引: 索引可以覆盖多个数据列.如像index(columnA,columnB)索引.

全文索引: 通过建立倒排索引,可以极大地提升检索效率,解决判断字段是否包含的问题.是目前搜索引擎使用的一种关键技术.可以通过ALTER table_name ADD

FULLTEXT(column);创建全文索引.

索引可极大的提高数据的查询速度.

通过使用索引,可以在查询过程中,使用优化隐藏器,提高系统的性能.

但是会降低插入,删除,更新表的速度,因为在执行这些写操作时,还要操作索引文件.

索引需要占物理空间,除了数据表占数据库空间之外,每一个索引还要占一定的物理空间.如果要建立聚簇索引,那么需要的空间就会更大,如果非索引很多,一旦聚集索引改变,那么所有非聚集索引都会跟着改变.

Java基础面试题一相关推荐

  1. 100道Java基础面试题收集整理(附答案)

    不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...

  2. 判断一个java对象中的属性是否都未赋值_100道Java基础面试题(一)

    100道Java基础面试题(一)未来大家将步入职场,面试的时候面试官还会问大家一些Java相关的问题.小编整理出100道非常实用的面试题目,可以帮助双体的小伙伴应对面试,我们一起来看看都有哪些吧! 1 ...

  3. Java继承_30道最常问的Java基础面试题

    30道最常问的Java基础面试题 1. 面向对象和面向过程的区别面向过程优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采 ...

  4. Java 基础面试题,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  5. Java进阶篇(六)——Swing程序设计(上),java面试题,java基础笔试题,BAT

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. Sw ...

  6. Java基础知识面试题(2021最新版)

    转载自:https://thinkwon.blog.csdn.net/article/details/104390612 文章目录 Java概述 何为编程 什么是Java jdk1.5之后的三大版本 ...

  7. Java基础-面试题精华(2021最新)

    Java基础-面试题精华 提示:本人已经成功帮助20多位面试者斩获BAT大厂offer,现在把自己的笔记分享出来,提炼出高频java面试题目,都是干货,觉得有用的话,记得点赞收藏哦,后期会上sprin ...

  8. 人类高质量Java基础面试题大全,又是一篇三万字的总结!

    点击主页访问更多精彩文章:https://blog.csdn.net/weixin_45692705?spm=1001.2101.3001.5343 Java基础面试题目录 共勉 ! Java概述 1 ...

  9. java基础面试题(九)

    java基础面试题(九) SpringBoot/SpringCloud 什么是SpringBoot? 在Spring框架这个大家族中,产生了很多衍生框架,比如Spring.Springmvc框架等,S ...

  10. 2022 最新 Java 基础 面试题(一)

    2022 最新 Java 基础 面试题(一) 1.面向对象的特征有哪些方面? 3.String 是最基本的数据类型吗? 4.float f=3.4;是否正确? 5.short s1 = 1; s1 = ...

最新文章

  1. 计算机一级b类试题及答案,计算机一级b类试题及答案
  2. MySQL开发 日志文件必备的知识点
  3. BigInteger类实例的构造过程——JDK源码解析
  4. C++的常量、指针、引用
  5. [mmu/cache]-cache在linux和optee中的应用-InProgress
  6. IDEA2020版本如何导入jar包
  7. C#GridViewExport帮助类,美化导出
  8. python中if语句最多支持的分支是_Python多分支if语句的使用
  9. 水晶报表中对某一栏位值进行处理_从主流报表工具的报价看报表行业的报价水深-----常用报表工具对比---主流报表价格对比...
  10. Html中锚点的使用【转】
  11. 超星尔雅python_超星尔雅Python金融数据分析答案公众号
  12. 手持式频谱分析仪推荐哪一款?
  13. 初中计算机授课教案模板,初中语文的教案模板(精选5篇)
  14. bios显示计算机故障,笔记本电脑BIOS出现故障怎么办 三种常见BIOS故障解决方案...
  15. 牛客 小米校招 计算题 单调栈 接雨水
  16. 【案例23】NCC2005 was集群报非法登录的解决方案
  17. autojs微博_autojs使用intent打开新浪微博的用户任务中心scheme的详细过程
  18. springboot学习(五)自动配置原理及@Conditional派生注解
  19. js 实现多物体动画效果
  20. 威纶通设置记录历史事件例程

热门文章

  1. 一个智能的 Web 界面测试系统
  2. 为了偷懒,我开始用Python编写Android应用程序
  3. 广州水质检测实验室装修要求
  4. 关于等价无穷小在加减运算中的应用
  5. python调整图表的宽度_Matplotlib表格格式列宽
  6. 记录安装使用联邦机器学习FATE框架
  7. NPU架构分析与应用
  8. java+springboot企业仓库进销存管理系统的设计与实现
  9. c/c++实现电话通讯录管理
  10. 树莓派天气预报基于Python(相关支持 : 和风天气 备注 : 初级应用)