又一次的面试经历,下班去面试的,热情的HR,一家外企大公司,从未接触的规模与环境,满怀期待,面试的是三个中年男子,问了很多问题,真的很多,方方面面,感觉答的不是很尽善尽美,有些东西还是说不清楚或者完全没接触过,就这样,磕磕绊绊,半个小时的面试结束了。
第二天早上,热情的HR通知我下班去二面,人事面,谈工资福利,哇哦,这意思是不是就是通过啦,心里窃喜,不负众望,果然,通过啦,薪资和我心里的价码相差无几,新的生活即将开始!
面试真题系列近阶段应该不会再继续写了,感谢大家的支持,这四篇文章都是我的血和泪啊,都是各大面试官对我的灵魂拷问,希望也可以给大家带来一些帮助。
欲速则不达,欲达则欲速!
byte的范围是-128~127。
字节长度为8位,最左边的是符号位,而127的二进制为01111111,所以执行+1操作时,01111111变为10000000。
大家知道,计算机中存储负数,存的是补码的兴衰。左边第一位为符号位。
那么负数的补码转换成十进制如下:
一个数如果为正,则它的原码、反码、补码相同;一个正数的补码,将其转化为十进制,可以直接转换。
已知一个负数的补码,将其转换为十进制数,步骤如下:
例如10000000,最高位是1,是负数,①对各位取反得01111111,转换为十进制就是127,加上负号得-127,再减去1得-128;
1、选取适合的字段属性
2、使用join连接代替子查询
3、使用联合union来代替手动创建的临时表
注意:union用法中,两个select语句的字段类型要匹配,而且字段个数要相同。
4、事务
要么都成功,要么都失败。
可以保证数据库中数据的一致性和完整性。事务以begin开始,commit关键字结束。
如果出错,rollback命令可以将数据库恢复到begin开始之前的状态。
事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方式为用户提供一种安全的访问方式,这样就可以保证用户的操作不被其他的用户干扰。
5、锁定表
尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在大应用中。
由于在事务执行的过程中,数据库会被锁定,因此其它用户只能暂时等待直到事务结束。
有的时候可以用锁定表的方法来获得更好的性能,
共享锁:其它用户只能看,不能修改
lock table person in share mode;
对于通过lock table 命令主动添加的锁来说,如果要释放它们,只需发出rollback命令即可。
6、使用外键
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性,这个时候可以使用外键。
7、使用索引
索引是提高数据库查询速度的常用方法,尤其是查询语句中包含max()、min()、order by这些命令的时候,性能提高更为显著。
一般来说索引应该建在常用于join、where、order by的字段上。尽量不要对数据库中含有大量重复的值得字段建立索引。
8、优化的查询语句
在索引的字段上尽量不要使用函数进行操作。
尽量不要使用like关键字和通配符,这样做法很简单,但却是以牺牲性能为代价的。
避免在查询中进行自动类型转换,因为类型转换也会使索引失效。
Spring事务传播机制详解
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。
getClass、equals、hashcode、clone、wait、notify、notifyAll、
通过监听session对象的方式来实现在线人数的统计和在线人信息展示,并且让超时的自动销毁。
对session对象实现监听,首先必须继承HttpSessionListener类,该程序的基本原理就是当浏览器访问页面的时候必定会产生一个session对象,当关闭该页面的时候必然会删除session对象。所以每当产生一个新的session对象就让在线人数+1,当删除一个session对象就让在线人数-1。
还要继承一个HttpSessionAttributeListener,来实现对其属性的监听。分别实现attributeAdded方法,attributeReplace方法以及attributeRemove方法。
sessionCreated//新建一个会话的时候触发,也可以说是客户端第一次喝服务器交互时触发。
sessionDestroyed//销毁会话的时候,一般来说只有某个按钮触发进行销毁,或者配置定时销毁。
HttpSessionAttributeListener有三个方法需要实现
【Spring Boot 21】Spring Boot 项目如何部署
IOC可以称为控制反转或依赖注入,通过引入IOC容器,利用依赖注入的方式,实现对象之间的解耦。
AOP是面向切面编程,在不改变原有逻辑的基础上,增加一些额外功能。
AOP适用于解决日志、事务、权限方面的问题,这种散布在各处的无关的代码称为横切,在OOP的设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP是面向切面编程,将影响多个类的共同行为封装到一个可重用的模块,并将其命名为“Aspect”,即切面。
关于切面是将那些与业务无关,却被业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
beanFactory是Spring关于容器的父接口,用来管理bean的接口,管理bean的注入和销毁;
factoryBean是Spring用来对beanFactory中的bean进行修饰的类,相当于装饰器模式;
① 参数:<%=request.getParameter(paramName)%>
② 属性值:<%=request.getAttribute("attributeName")%>
无排序的版本:
SELECT * FROM (SELECT rownum AS rowno,w.* FROM ct_worker w WHERE rownum <=20) worker WHERE worker.rowno>10
有排序的版本:
SELECT * FROM (SELECT rownum AS rowno,w.* FROM (SELECT ctw.* FROM CT_WORKER ctw ORDER BY capid desc) w WHERE rownum <=20) worker WHERE worker.rowno>10
where使用在group by之前,where子句不能有分组函数;
group by 进行分组,having进行分组之后的过滤,having中可以使用聚合函数;
select t1.name 学生姓名,
sum(t2.score) 总分,
avg(t2.score) 平均分,
max(t2.score) 最高分,
min(t2.score) 最低分
from t_student t1, t_score t2
where t1.studentid = t2.studentid
group by t1.name having sum(t2.score)>250;
1、线程的实现方式
(1)继承Thread类;
(2)实现Runnable接口;
该方式的优点:
可以避免由于java单继承带来的局限性,适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想。
2、线程生命周期
创建、就绪、运行、阻塞、死亡
3、线程控制
线程休眠sleep、线程加入join、线程礼让yield
异步读取
新建一个 ExcelModelListener 监听类出来,并且 继承 AnalysisEventListener 类
package com.zh.oukele.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.zh.oukele.model.ExcelMode;
import java.util.ArrayList;
import java.util.List;
/***
* 监听器
*/
public class ExcelModelListener extends AnalysisEventListener {
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 5;
List list = new ArrayList();
private static int count = 1;
@Override
public void invoke(ExcelMode data, AnalysisContext context) {
System.out.println("解析到一条数据:{ "+ data.toString() +" }");
list.add(data);
count ++;
if (list.size() >= BATCH_COUNT) {
saveData( count );
list.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveData( count );
System.out.println("所有数据解析完成!");
System.out.println(" count :" + count);
}
/**
* 加上存储数据库
*/
private void saveData(int count) {
System.out.println("{ "+ count +" }条数据,开始存储数据库!" + list.size());
System.out.println("存储数据库成功!");
}
}
上一篇:如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-23)
下一篇:Java面试题总结(绝对经典)