java面试题
一,重载和重写的区别?
重写:子类继承父类的方法,并对父类的方法进行重写;方法名,返回值,参数列表必须相同;
重载:方法名相同,参数列表不同
二.this和super的区别?
this:调用本类方法;
super:调用父类的方法
三,break,return,continue的区别?
break:终止当前循环
return:结束整个方法
continue:终止本次循环,等待下次循环
四,“==”和equals的区别?
1,==为赋值运算符;
equals为Object中的方法。
2,==在基础数据类型中比较内容,在引用数据类型中比较内存地址;
equals在Object中用于比较内存地址,但是在String类和Data类中重写了 equals(),String类中使其用来比较内容是否相同,Data类中用来比较毫秒数是否相同。
为何不建议使用eques()?
一,值是null的情况 
注意:如果a 和 b 其中一个是null, 另一个不是null, 则返回false。注意:不会抛出空指针异常。
二,值是空字符串的情况
说明:
首先,进行了对象地址的判断,如果是真,则不再继续判断。
如果不相等,后面的表达式的意思是,先判断a不为空,然后根据上面的知识点,就不会再出现空指针。
所以,如果都是null,在第一个判断上就为true了。如果不为空,地址不同,就重要的是判断a.equals(b)。
四、“a==b”和”a.equals(b)”有什么区别?
如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true。
而 a.equals(b) 是进行逻辑比较,当内容相同时,返回true,所以通常需要重写该方法来提供逻辑一致性的比较。
五,“||”与“&&”的区别:
(短路版)
&&:与
||:或
六,进程和线程的区别?
进程:软件在电脑上运行时的过程
线程:java应用程序执行的路径
多线程:应用程序在执行过程中存在多种路径
七,全局变量和局部变量的区别?
1,生命周期不同
全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
2,作用域不同:
全局变量的作用域为整个程序,而局部变量的作用域为当前方法或者语句块等;
3, 储存方式不同:
全局变量存储在全局数据区中,局部变量存储在栈区
4, 使用方式不同:
全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量
6,默认值不同:
全局变量有,局部变量没有默认值,所以必须提前初始化
7,局部变量和全局变量同名的话,局部变量屏蔽全局变量,访问的则是局部变量,若要访问同名全局变量,则需通过“this.变量名”;
8,修饰符不同:局部变量不能使用修饰符
七.1,抽象类和接口的区别
抽象类与接口在语法上的区别
1.抽象类里可以有构造方法,而接口内不能有构造方法。
2.抽象类中可以有普通成员变量,而接口中不能有普通成员变量。
3.抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法。
4.抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5.抽象类中可以包含静态方法,接口内不能包含静态方法。
6.抽象类和接口中都可以包含静态成员,抽象类中的静态成员变量的访问类
型可以任意,但接口中定义的变量只能是public static final类型,并且默认为
public static final类型。
7.一个类可以实现多个接口,但只能继承一个抽象类。
8.抽象类和接口所反映出的设计理念不同。其实abstract class表示的是“is-a”
继承关系,interface表示的是“like-a”关系。
七.1,两者在应用上的区别
接口更多的是在系统框架设计方法发挥作用,主要定义模块或者系统之间的通信;而抽象类主要在代码实现方面发挥作用,可以实现代码的重用(例:list集合实现类API相同,底层源码不同)。
八,线程生命周期
九,打印“*”倒三角
// 行数
for (int i = 1; i <= 5; i++) {
// 一行内需要内部遍历的数据
for (int j = 1; j <=i; j++) {
System.out.print(" ");
}
// 等差数列
for (int j = 9; j >=2*i+1 ; j--){
System.out.print("*");
}
System.out.println();
}
**总结:**使用三个for循化,两层循环;
/*11. 打印 n 行星号组成的等腰三角形。*/
public static void test11(int number1) {
for (int i = 1; i <= number1; i++) {
for (int k = number1 ; k >=i; k--) {
System.out.print(" ");
}
for (int k = 0; k < 2*i-1; k++) {
System.out.print("*");
}
System.out.println();
}
}
十,反射的优缺点
优点: 1,增加代码灵活性,运行过程中可动态修改和操作类;
2,提高代码复用性;
3,运行时,轻易获取一个类的属性,方法。并且进行动态调用;
缺点:1,反射会涉及到动态类型解析,因此JVM无法对其进行优化,
所以其性能要比非反射低;
2,使用反射之后,代码可读性下降;
3,反射可以绕过一些限制访问类的属性和方法,可能会破坏代码本身的抽象性;
十一,为什么重写 equals() 就一定要重写 hashCode() 方法
在Set集合中,为了保证数据元素的唯一性,所以重写了hashCode() 和equals()。
十二,为什么ConcurrentHashMap中key不允许为null
以为map集合是以(key,value)键值对形式存储值。而ConcurrentHashMap亦是如此;
CincurrentHashMap通过观察其添加数据API的底层源码得知,当key或者value为null时,
就会触发空指针异常。
当你通过key获取value时,当返回结果为null,不能确定其value为null还是key为null
十三,什么是面向对象
将一个封装的标准JavaBean的类对象通过多态和继承满足用户的需求;
十四,java的比较接口有哪些?
自然排序:Comparable接口 重写compareTo()
定制排序:Comparator接口 重写compare()
十五,线程池种类
固定数量线程池,缓存线程池,单例线程池,延时线程池,并行线程池,定时线程池
十六,HashMap底层 原理
相比 jdk1.7 的 HashMap 而言,jdk1.8最重要的就是引入了红黑树的设计,红黑树除了插入操作慢其他操作都比链表快,当hash表的单一链表长度超过 8 个的时候,数组长度大于64,链表结构就会转为红黑树结构。当红黑树上的节点数量小于6个,会重新把红黑树变成单向链表数据结构。
十九,ThreadLocal 是什么?它的实现原理是什么?
ThreadLocal是一种线程隔离机制,保证了多线程情况下访问共享变量的安全性。
实现原理:以**“空间”换取“时间”**,多个线程访问同一个变量时,线程自身创建一个变量副本进行访问,在不修改原共享变量的情况下对自身线程副本变量进行修改。
sql面试题
一,SQL三大范式:
1,列属性不可分割;
2,一行SQL数据必须依赖主属性;
3,每个属性必须完全依赖主属性;
二,多表联查:
1,内连接:inner join链接有两个相同属性名的表格
2,外链接:full join
左连接:right join
右连接:left join
三,order-by和group-by区别
1,order-by:
通过ASC(顺序)desc(逆序)显示表格数据
2, group-by:(分表查询):
与having和配合使用,根据不同要求显示不同表数据
四,数据库事务
隔离级别:读已提交,读未提交,可重复度,串行(为最高级别);
**作用:**阻止对sql数据的脏读,幻读,不可重复读,丢失修改等一系列由***事务并发***产生的问题和后果;
事务特性:一致性,原子性,隔离性,持久性;
常用API:
启动事务:start transcation;
设置自动提交事务:set autocommit =(0:手动;1:自动)
回滚事务:rollblack;
设置回滚点:savepoint (name)
回滚保存点:rollblack to (name);
提交事务:commit;
五,不可重复读和幻读的区别
不可重复读重点是多次读取一条记录,发现数据有所变动,重点是**修改**;
幻读是多次读取一条记录发现数据有新增或者减少,重点是**新增或者删除**;
六,数据库索引
索引在物理意义上分为:聚簇索引和非聚簇索引;
在应用上分为:普通索引,唯一索引,主键索引,外键索引,联合索引
七,数据库drop,trunchar,delete
数据库存储过程
一组预编译好的sql语句集合,理解为批处理语句
好处
- 提高代码的重用性
- 简化操作
- 减少编译次数并且减少和数据库服务器连接的次数,提高效率
js
一,var let const的区别
var:
MyBatis框架
一,myBatis运行流程
特点:
1、基于SQL语法,半自动化的ORM实现,小巧灵活、简单易学。
2、专注于DAO层操作,能够了解底层封装过程。
3、动态SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度。
4、方便程序代码测试
Spring框架
优点:
1、方便解耦,简单开发(高内聚低耦合)
Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理,Spring工厂是用于生成bean
2、AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
3、声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
4、方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序
5、方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis等)的直接支持。
6、降低JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
一,IOC和DI注入关系
IOC:控制反转(不是技术,而是一种思想)
传统JavaSe程序设计,我们直接通过new进行创建对象,而IOC有一个专门的容器来创建这些对象,即由IOC容器来创建这些对象。由IOC容器控制对象,主要是控制了外部资源获取。有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转,而反转则是由容器来帮忙创建即注入依赖对象。对象只是被动的接受依赖对象,所以是反转。
*** 总结:***借助于“第三方”实现具有依赖关系的对象之间的解耦
DI:依赖注入(具体的实现)
形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁谁先。
IOC控制反转: 说的是创建对象实例的控制权从代码控制转移到IOC容器控制,侧重于原理
IOC和DI的关系
依赖注入不能独立存在,需要在IOC容器基础之上才能完成操作。所有依赖注入和控制反转是从不同角度描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
AOP:
作用:事务处理(动态:jdk 和cglib),测试
概念:它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即切面。所谓“切面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
二、Spring的常用注解
1、给容器中注入组件
(1)包扫描+组件标注注解
@Component:泛指各种组件
@Controller、@Service、@Repository都可以称为@Component。
@Controller:控制层
@Service:业务层
@Repository:数据访问层
2,bean的作用域
都是通过bean标签中的scope属性来进行定义:
1、singleton(常用):默认值,单例的,每次调用getBean方法创建的是同一个对象。
2、prototype(常用):多例的,多次调用getBean方法创建的是不同的对象,会创建新的对象。
3、request:web项目中,Spring创建一个Bean的对象,将对象存入request作用域中。
4、session:web项目中,Spring创建一个Bean的对象,将对象存入session作用域中。
SpringMVC框架
面试题(真)一
1,谈谈你理解的面向对象;
2,面向对象的多态是如何体现的;
3,for in,for-of,foreach区别;
4,一个百万数据量的数据表,如何优化其SQL语句和性能;
一、msysql 慢SQL 参数配置
long_query_time:5S ,执行时间超过5秒 就记录慢SQL 日志。
熟悉MySQL 执行计划参数说明。
二、业务代码中常见慢SQL类型及应对方案
2.1 嵌套查询,多层嵌套中产生的临时表无法走索引优化SQL 效率低
方案:消除嵌套
2.2 多表联合查询,当联合查询中主表数据量达千万级时,联表消耗大。
方案:单表查询,内存中联合;先过滤再联合
2.3 百万以上大数量 COUNT 和 SUM 函数耗时随数据量线性增长。
方案:按常用统计维度进行数据预汇总,全量数据使用汇总表,增量数据实时计算。
2.4、Where 子查询条件 过多,每个子条件 都带 IF 判断语句,查询条件排列组合,不可能全都命中索引。
方案:从客户端限制查询条件的必要性 和 顺序性,按mysql 索引左匹配原则,设置必传过滤条件;SQL 语句的 Where 条件匹配联合索引。
2.5 Insert 和 Update语句 不走索引,导致锁定区间(lock range),而不是锁定指定记录,导致事务串行等待。
方案:Update 按主键、唯一索引、索引更新。
三、通过优化数据库及表结构提升SQL执行性能
3.1 索引特性:提升寻址效率、占用存储空间、唯一索引对Insert 和Update 多一次重复判断。
3.2 分区特性:按分区规则 物理层独立文件存储数据,分区内查询数据量小效率高,跨分区执行效率低。分区对查询友好,对变更不友好,频繁变更会涉及数据物理地址迁移,易造成磁盘碎片。推荐已时间做分区字段,历史分区数据不变更。
3.3 分表特性:单表数据量小,适合客户数据分布均匀的系统。不能解决有超级大客户存在的数据倾斜问题。
3.4 分库特性:单机 变 集群,利用资源横向扩容能力。
3.5 数据仓库:数据分层、读写分离,分布式计算;将具有大数据属性的数据处理任务交给 Hbase 、ClickHouse、高斯等数据库。
3.6 用于统计分析的表设计成融合字段的宽表,一张表包含所有统计查询字段 ,对于任何数据库而言,单表分析性能都优于多表联合。
四、通过提升服务器硬件能力优化SQL执行效率
3.1 增加CPU核心数
目的:提升sum、count 计算型SQL 执行能力
3.2 增加内存大小
目的:扩大缓存空间大小,增加缓存命中率,降低回原表查询几率,提升速度。
3.3 普通硬盘存储介质切换为SSD高IO存储介质
目的:提升数据库读写的物理速度,当前 SSD 读写速度是普通磁盘的10倍左右。
————————————————
版权声明:本文为优快云博主「东吴键客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/mrlichengyi/article/details/123965450
5,描述jsp页面数据到sql数据库的过程;
6,jsp的对象如何捕获;
request.getparamter()
7,一大一小两个异常,都捕获之后运行一个还是两个;
答:如果两个异常属于同系,那么那么捕获大的异常就行。
若两个异常没有关联,那么就都要捕获;
8,内边距和外边距的表示单词;
padding,margin;
9,说一下你了解的设计模式;
Java常用的五种设计模式:
1、单例设计模式
所谓singleton设计模式,简单来说就是无论程序如何运行,
在采用singleton设计模式的类(Singleton类)中,永远只有一个实例化的对象。
具体步骤如下:
(1)将采用singleton设计模式的类的构造方法私有化(使用私有装饰)。
(2)在其中生成这个类的实例化对象,封装成私有静态类型。
(3)定义一个静态方法,返回这个类的一个实例。
2、工厂设计模式
在程序接口和子类之间增加一个过渡端,通过这个过渡端可以动态
获取实现公共接口的子类的实例化对象。
3、代理设计模式
是指由代理主题运营的真实主题,代理主题执行具体的业务操作,
而代理主题则负责其他相关业务的处理。比如日常生活中,
客户端通过代理访问网络,客户端通过代理连接网络(具体业务)。
代理服务器完成与上网相关的其他操作(相关业务),如用户权限、
访问限制等。
4、观察者设计模式
所谓观察者模式,比如现在很多购房者密切观察房价的变化。
房价变动时,所有购房者都能观察到,以上购房者属于观察者。
这是观察者模式。
Java借助可观察类和观察者接口,可以轻松实现上述功能。
当然,这种模式的实现不仅限于这两个类。
5、适配器模式
如果一个类想要实现一个有很多抽象方法的接口,但是只需要实现
接口中的一些方法就可以达到目的,这时候就需要一个中间的过渡类,
但是这个过渡类不想直接使用。所以把这个类定义为抽象类是最合适的,
后面的子类可以通过直接继承这个抽象类有选择地覆盖需要的方法,
这个抽象类就是适配器类。
10,分页实现的方式
11,数据库语句执行顺序
11.1,from
from语句执行从下到上,从右到左。
面试题(真) 二
1,说一说对面向对象的理解
将一个封装的标准JavaBean的类对象通过多态和继承满足用户的需求;
2,面向对象和面向过程相比面向对象的优势是什么?
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
3、类当中的方法有哪些属性?
修饰类:final,public,default
修饰方法:public ,private,protected
修饰属性:public,private,protected(同包可访问,继承类可访问)
4、修饰符的区别是什么?
访问修饰符,非访问修饰符(finall,abstract)
5、说一说对事务的理解
事务是指单个逻辑工作单元执行得一系列操作,要么都做,要么都不做,是不可分割的工作单位,是数据库环境中的的最小工作单元。
6、为什么要使用事务?
保证数据的一致性,保证数据不会出错
7、数据库当中表的关联关系有哪些?
一对一,一对多,多对多
8、html当中的块级和行级元素区别?
行级元素水平排列,块级元素纵向排列;
行级元素不可设置宽高,块级元素可以设置宽高;
块级元素可以包含行级元素;
**注解:**h5之后标签为块级元素
9,存储过程,
9.1 概念
一组预编译好的sql语句集合,理解为批处理语句
好处
- 提高代码的重用性
- 简化操作
- 减少编译次数并且减少和数据库服务器连接的次数,提高效率
10、js获取的对象有哪些方式?
获取标签对象的方法
10.1, 通过id获取 document.getElementById(‘box1’), 通过类名获取
var boxs =document.getElementsByClassName(‘box’);
得到的结果是一个类数组格式,可以通过下标获取对象boxs[0],
如果下标超过最大长度得到undefined而不会报错;
3) 通过标签名获取var lis=document.getElementsByTagName(‘li’);
得 到的结果是一个类数组格式,可以通过下标获取对象 lis[0],
如果下标超过最大长度得到undefined 而不会报错;
html5新增的获取对象的方法
4) 通过选择器获取
document.querySelector(".list li") 获取到的是单个元素 默认选择第一个;
document.querySelectorAll(".list li") 获取到的是多个元素(数组形式);
11、ajax的同步和异步区别?
Ajax包括两种请求:
1、异步请求
在同一时刻,双方可以同时执行。
2、同步请求
在一方进行请求的时候,另一方只能等待。
同步是在一条直线上的队列,异步不在一个队列上 各走各的;
jquery 的 async:false,这个属性默认是true:异步,false:同步。
举例:
同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到忙完才去吃饭
12、说一说单例模式
实例化一个对象进行操作
工厂模式是属于创建型模式的,通过工厂获取一个一个的新对象。说白了,工厂就是用来 new(创建)对象的,因此把它化分到创建型这一类中。
13、说一下冒泡排序?
@Test
public void test2(){
int[] a = {1,8,9,89,7};
for (int i = 1; i < a.length; i++) {
for (int j = 0; j < a.length-1;j++ ) {
if (a[j] > a[j+1]) {
int num = a[j];
a[j] = a[j+1];
a[j+1] = num;
}
}
}
for (int i :a){
System.out.println(i);
}
}
14、cookie和session的区别
位置不同,生命周期不同;
位置不同:cookie存在于浏览器,session存在于服务器;
生命周期不同:cookie;生命周期默认只有20min,可以通过setMaxAge()设置存活时间;session关闭就结束
14、ajav前后端交互的数据类型有哪些?
json,text,xml
15、http请求都有哪些?get和post的区别?
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:options, put, delete, trace 和 count 方法
区别:
get获取缓存,post不进行缓存
get长度限制,post不限制长度
get获取资源,post传输实体
GET 请求可以直接进行回退和刷新,不会对用户和程序产生任何影响;而 POST 请求如果直接回滚和刷新将会把数据再次提交
GET和POST本质上就是TCP链接
GET产生一个TCP数据包;POST产生两个TCP数据包。
16、说一下选择器的优先级是
ID选择器>;类选择器>;标签选择器
17、说一说MVC
18、mysql和oracle的区别
MySQL是一个开源的关系数据库管理系统(RDBMS)。它是世界上使用最多的RDBMS,作为服务器运行,提供对多个数据库的多用户访问。它是一个开源、免费的数据库;
面试题(liu) 三
面向对象三大特征
多态的体现
接口和抽象类的区别
cookie和session的区别
servlet和jsp的区别
jsp内置对象
多线程的创建
死锁
二分法查询
描述冒泡排序
session的生命周期
基本数据类型
集合存储基本数据类型为什么不报错
spring框架
如何跳出for循环
创建对象的方式
两个删除关键字的区别
group by和order by的顺序
mybatis如何防止sql注入
#{}和${}有什么区别
拦截器
面试题(li)四
1.https和http的区别
2.ajax和form表单提交的区别 3易买网的流程和模块 4多线程会出现什么不好的情况 5:注册,用户名已存在的实现方法 6ajax里面有啥,作用是什么,;6:创建线程的方式;7:关联表的方式,举例哪线情况能用到内链接和外连接
面试题(lei)五
1、现在有100万条数据,你怎么设计表
2、索引失效
3、面向对象的理解
4、什么是事务
5、有哪些设计模式,说一下单例与工厂
6、过滤器有什么作用
7、JS的var、let、const
8、for-in、for-of、for-each
9、Ajax异步同步区别
10、购物车实现方式
11、假如在秒杀情况下,3件物品全买后,别人还能不能买(大概意思)
12、加入数据量比较大的话性能方面的问题考虑过没有?怎么去解决呢(根据项目)
sql中文乱码
-- 设计未创建表编码格式
create table `user`(
`userId` int auto_increment primary key comment '主键Id',
`userName` varchar(25)
)default character set utf8;
-- 设计已创建表编码格式
ALTER TABLE teacher CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
insert into user values (0,'张扬好');
-- 设置数据库编码格式
ALTER DATABASE text1 CHARACTER SET utf8 COLLATE utf8_unicode_ci