风雷体育
封装继承多态的理解
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行封装隐藏。封装分为属性的封装和方法的封装。
继承:是对有着共同特性的多类事物,进行再抽象成一个父类。父类的意义在于抽取多类事物的共性。
多态:允许不同类的对象对同一消息做出响应。方法的重载(一个类中的方法参数个数,类型不同)、类的重写(父类子类之间方法的改写)正体现了多态。
public private protected作用域
接口和抽象类区别及使用场景
一、相同点:
两者都是抽象类,都不能实例化。
interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。
二、区别:
1、接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
2、抽象类可以有构造方法,接口中不能有构造方法。
3、接口可以多继承,抽象类不行
4、接口方法类型为public abstract,而抽象类的方法类型为public/protected等。
5、接口中基本数据类型为public static final,而抽象类可以有普通成员变量。
反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。动态获取信息以及动态调用对象方法的功能称为反射机制。Java程序可以加载一个运行时才得知名称的class,获悉其完整构造,并生成其对象实体、或对其fields设值、或唤起其methods。
应用:反编译:.class -> .java
Arraylist Linkedlist区别,使用范围
ArrayList:默认大小为10,底层动态数组实现,查找快,插入删除效率差
LinkedList:底层是双向链表,查找慢,插入删除效率高
多线程的使用
多线程 公有变量的同时读和写 脏数据 解决方案
对非安全的代码进行加锁控制;使用线程安全的类;多线程并发情况下,线程共享的变量改为方法级的局部变量。
SpringMVC处理请求的过程
1、 发送请求——>DispatcherServlet,前端控制器收到请求后委托给处理器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象;
3、 HandlerMapping——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、HandlerAdapter——>处理器(Controller)功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View(策略模式);
6、View——>渲染,View会根据传进来的Model模型数据(Map)进行渲染;DOM渲染,CSSOM渲染,JS解析,repaint,reflow
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
hibernate和mybatis区别
相同点:
Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。Hibernate和MyBatis都支持JDBC和JTA事务处理。
Mybatis优势
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
MyBatis容易掌握,而Hibernate门槛较高。
Hibernate优势
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
区别:
1. hibernate是全自动,而mybatis是半自动。
hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。
2. hibernate数据库移植性远大于mybatis。
hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、MySQL等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法。
3. hibernate拥有完整的日志系统,mybatis则欠缺一些。
hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。
4. mybatis相比hibernate需要关心很多细节
hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。
5. sql直接优化上,mybatis要比hibernate方便很多
SQL优化
避免模糊查询,索引(B+树),指定字段查询,临时表,减少访问数据库的次数,使用where代替having
1、选取最适用的字段属性
MySQL可以很好的支持大数据量的存取,数据库中的表越小,查询也就会越快。因此,可以将表中字段的宽度设得尽可能小。
应该尽量把字段设置为NOTNULL,在执行查询的时候,数据库不用去比较NULL值。
对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。
2、使用连接(JOIN)来代替子查询(Sub-Queries)
MySQL从4.1开始支持SQL的子查询。可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。
使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是有些情况下,子查询可以被更有效率的连接(JOIN)替代。因为MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。
3、使用联合(UNION)来代替手动创建的临时表
MySQL从4.0的版本开始支持union查询,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用union来创建查询的时候,我们只需要用UNION作为关键字把多个select语句连接起来就可以了,要注意的是所有select语句中的字段数目要相同。
4、事务
要么语句块中每条语句都操作成功,要么都失败。换句话说,就是保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。
5、锁定表
包含有WRITE关键字的LOCKTABLE语句可以保证在UNLOCKTABLES命令被执行之前,不会有其它的访问来对inventory进行插入、更新或者删除的操作。
6、使用外键
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。
7、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。
一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。
在创建表的时可以同时创建索引,也可以使用ALTER TABLE或CREATE INDEX在以后创建索引。MySQL从版本3.2.3开始支持全文索引和搜索。全文索引在MySQL中是一个FULLTEXT类型索引,但仅能用于MyISAM类型的表。
8、优化查询语句
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。
首先,最好是在相同类型的字段间进行比较的操作。
其次,在建有索引的字段上尽量不要使用函数进行操作。
第三,在搜索字符型字段时,有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。
最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。
@注解原理(反射)
@Documented:注解是否将包含在JavaDoc中
@Retention:什么时候使用该注解
RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
@Target:注解用于什么地方
ElementType.TYPE:用于描述类、接口或enum声明
ElementType.FIELD:用于描述实例变量
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE 另一个注释
ElementType.PACKAGE 用于记录java文件的package信息
@Inherited:是否允许子类继承该注解
缓存的使用
Hibernate二级缓存 Ehcache
动态页面缓存 应用程序把动态文件生成的html文件缓存到文件服务器,以后用户请求动态文件,直接从文件服务器加载对应的静态缓存的html文件返回给用户
客户端浏览器缓存 Last-Modified,If-Modified-Since,Expires,Cache-Control等标识,和服务器进行协商,是否是采用客户的本机缓存来实现。
反向代理服务器nginx
缓存数据库redis和memcache
本地内存(HashMap)
HTTP请求的组成部分
请求行(Request Line):请求方法、请求 URI 和 HTTP 版本,它们用空格分隔 如:GET /news.asp HTTP/1.1
消息头(Message Headers):由域名/值对组成,每行一对,域名和值之间用紧跟的英文冒号(“:”),单空格(SP)分开。
消息体(Entity Body):用于携带与请求相关联的数据;消息头与消息体之间通过空行来分隔。
引申:http响应的组成部分:状态行 响应头(Response Header) 响应正文
POST和GET区别
京东研究院
Spring设计模式
工厂方法 代理模式 单例模式 观察者模式 模板方法 策略模式 适配器模式
AOP方式
静态AOP:AspectJ在编译时进行增强,会在编译的时候将AOP逻辑织入到代码中,需要专有的编译器和织入器
动态AOP:
JDK动态代理:在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。实现原理是为被代理的业务接口生成代理类,将AOP逻辑写入到代理类中,在运行时动态织入AOP,使用反射执行织入的逻辑。主要实现方式依赖java.lang.reflect包下的InvocationHandler和Proxy类。
CGLib动态字节码生成:在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中。CGLib是动态代码字节生成的实现,它封装字节码生成工具Asm,原理是在运行期间目标字节码加载后,生成目标类的子类,将切面逻辑加入到子类中,所以使用CGLib实现AOP不需要基于接口。
自定义类加载器:在运行前,目标加载前,将切面逻辑加到目标字节码中。可以考虑javassist来实现。Javassist 是一个编辑字节码的框架,可以让你很简单地操作字节码。它可以在运行期定义或修改Class。使用Javassist实现AOP的原理是在字节码加载前直接修改需要切入的方法。
bean命名冲突
@qualifer 注解作用为bean起别名。 @Autowired是根据类型进行自动装配的。如果当spring上下文中存在不止一个或者不存在对象的bean的时候,会抛出BeanCreationException异常。可以使用@Qualifier配合@Autowired来解决命名冲突。
ArrayList和LinkedList区别
sleep和wait区别
1,这两个方法来自不同的类,分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁。
3,wait和notify/notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
5,wait通常被用于线程间交互,sleep通常被用于暂停执行
volatile和synchronized区别
volatile修饰的变量不保留拷贝,直接访问主内存中的。volatile 变量提供顺序和可见性保证,例如,JVM 或者 JIT为了获得更好的性能会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。某些情况下,volatile 还能提供原子性,如读 64 位数据类型,像 long 和 double 都不是原子的,但 volatile 类型的 double 和 long 就是原子的。
synchronized修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、volatile是变量修饰符,而synchronized则作用于对象,代码块或方法。
二、volatile只是在线程内存和“主”内存间同步某个变量的值;而synchronized通过锁定和解锁某个监视器同步所有变量的值。
三、synchronized要比volatile消耗更多资源
京东金融(电话面试)
Spring MVC流程
IOC原理
IOC是所有的类都会在spring容器中登记,告诉Spring的bean工厂需要哪个bean,然后spring会在系统运行到适当的时候,通过BeanFactory或者ApplicationContext把你需要的类或者对象实例主动给你。所有的类的创建,销毁都由Spring来控制。
jQuery
jQuery是一个快速、简洁的JavaScript框架。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
ibatis和mybatis区别
Mybatis实现了接口绑定,使用更加方便。ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定。即 <mapper namespace="完整路径">
对象关系映射(ORM)的改进,效率更高
MyBatis采用功能强大的基于OGNL(Object-Graph Navigation Language)的表达式来消除其他元素 if choose otherwise #{} ${}
Linux命令
tail –f *.log动态查看日志
grep/find查找文件
查看进程
ps 命令用于查看当前正在运行的进程。grep 是搜索,-e 显示所有进程,环境变量 -f 全格式
ps -ef | grep java表示查看所有进程里 CMD 是 java 的进程信息
ps -aux | grep java -aux 显示所有状态
数据库集群
是利用至少两台或者多台数据库服务器,构成一个虚拟单一数据库逻辑映像,向客户端提供透明的数据服务。
同步:数据库客户端发出数据更新请求后,要等集群的每个节点全部更新后,才给客户端返回结果。
异步:数据库客户端发出数据更新请求后,接受请求的节点立马给客户端返回结果,被更新的数据则会在接下来的某个时间里被复制传输到集群的其它节点上。
连接负载均衡:在客户端发起登陆的时候,按照某种负载均衡算法,选择登录到集群某台数据库,此后所有客户端的请求全部会发送到此数据库上。
请求负载均衡:是在客户端发起登陆的时候,集群网关会同时登录到集群各节点数据库,此后所有的客户端请求,经过集群网关的分析被分成两类,查询请求根据负载均衡算法挑选一个节点执行,数据更新请求则有主机执行并实时同步数据到集群各节点。
分布式数据库:通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台计算机中都可能有DBMS的一份完整拷贝副本,或者部分拷贝副本,并具有自己局部的数据库,位于不同地点的许多计算机通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库。基本思想是将原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上,以获取更大的存储容量和更高的并发访问量。
索引(聚集)
指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有一个聚集索引,可以包含多个列(组合索引),有着更快的检索速度。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。
是否写过JavaScript逻辑代码
xml文档解析,图片处理,订单计算
京东商城(现场面试2017.5.8)
Ajax异步设置
JavaScript原生方式:obj.open('GET', url, true);
JQuery方式:async:true;
Mybatis传递参数
参数类型:基本数据类型 Java实体类 Map #{属性名}或#{map的KeyName}
parameterType
注解 需要在接口的参数上添加@Param注解
多个参数:1、dao:method(a,b) #{0},#{1}
2、dao:method(map) map.put(a,v) map.put(b,v) #{a},#{b}
3、dao:method(@param(“a”)a,@param(“b”)b) #{a},#{b}
Spring特性 AOP理解(代理模式)
定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流
将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系 统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性
使用场景:Authentication 权限、Caching 缓存、Context passing 内容传递
Error handling 错误处理、Lazy loading懒加载、Debugging调试
logging, tracing, profiling and monitoring记录跟踪 优化 校准
Performance optimization性能优化、Persistence持久化
Resource pooling资源池、Synchronization 同步、Transactions 事务
JSP内置对象
out JspWriter类的实例,是向客户端输出内容的对象
request HttpServletRequest类的实例
response HttpServletResponse类的实例
session HttpSession类的实例.
pageContext 提供了对JSP页面内所有的对象及名字空间的访问
application 实现了用户间所有数据的共享,可存放全局变量。生命周期为服务器的启动,直到服务器的关闭
config 是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
exception是一个异常对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是Java.lang.Throwable的对象
page 是指向当前JSP页面本身,类似于类中的this指针
金山云(现场面试2017.5.10)
用到的技术栈
HTML5 CSS JavaScript JSP JQuery Java Hibernate Spring Spring MVC Mybatis
JavaScript对象(封装)
项目部署
配置JDK、Tomcat、数据库、代理服务器
打包上传:将项目打包成 war 文件,然后利用ftp软件传到远程服务器。
利用putty远程登录服务器,将war文件移动到 Tomcat 目录下的 webapps 下。sh startup.sh启动 Tomcat,访问我们的项目。tail –f /logs 查看日志。
Tomcat处理过程
Tomcat是一个JSP/Servlet容器,有两大组件:Connector和Container,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。
server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;
web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;
URL处理过程
1、域名解析为IP地址(DNS 浏览器的缓存 操作系统的缓存 本地的域名服务器 DNS服务器 根域名服务器 顶级域名服务器)
2、根据IP和端口号来建立socket连接 TCP三次握手
3、向服务器发送http请求 GET或者POST
4、服务器主机收到请求,业务逻辑处理
5、向浏览器响应,得到HTML代码
6、浏览器解析HTML代码,并请求其他静态资源
7、关闭连接 四次挥手
8、浏览器页面渲染 DOM CSSOM render树 重绘 回流
SQL索引和语句
创建索引:CREATE INDEX或ALTER TABLE
普通:ALTER TABLE 表名 ADD INDEX 索引名 (列名);
主键:ALTER TABLE 表名 ADD PRIMARY KEY (列名);
唯一:ALTER TABLE 表名 ADD UNIQUE (列名);
全文:ALTER TABLE 表名 ADD FULLTEXT (列名);
多列:ALTER TABLE 表名 ADD INDEX 索引名 (列名,列名,列名…);
CREATE INDEX 索引名ON 表名 (列名)
CREATE UNIQUE INDEX 索引名 ON 表名 (列名)
删除索引: DROP INDEX 索引名 ON 表名
ALTER TABLE表名DROP INDEX索引名
ALTER TABLE表名DROP PRIMARY KEY
聚集索引
指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有一个聚集索引。InnoDB使用主键进行聚集,如果没有主键,InnoDB会使用唯一的非空索引来代替,如果没有这种索引,InnoDB就会定义隐藏的主键,然后在上面进行聚集。InnoDB只聚集在同一页面的记录,包含相邻键值的页面也许会相距甚远。聚集索引把索引和数据都保存到同一个B树中。
优点:协助快速查询、更新数据库表中数据
缺点:增加了数据库的存储空间;插入和修改数据时要花费较多的时间,磁盘查找存取的次数往往由树的高度所决定
底层实现:
B树:平衡的多路搜索树,每个节点都有数据域 中序遍历有序
B+树:**,只有叶子节点由数据域,更适合用来存储外部数据,即磁盘数据
文件的组织方式便是B树或B+树
B+树每层节点个数多,层数少,可以减少IO次数,叶子结点通过指针连接,可以区间访问
磁盘读取数据是以盘块(block)为基本单位的。位于同一盘块中的所有数据都能被一次性全部读取出来。而磁盘IO代价主要花费在查找时间Ts上。因此我们应该尽量将相关信息存放在同一盘块,同一磁道中。或者至少放在同一柱面或相邻柱面上,以求在读/写信息时尽量减少磁头来回移动的次数,避免过多的查找时间Ts。
索引使用B+树的原因:索引比较占空间,以文件的形式存储在磁盘上,需要大量的磁盘IO消耗,因此索引要尽量减少查找过程中磁盘I/O的存取次数,而磁盘预读(局部性原理),可以提高IO效率。B树层数少,每层节点多,IO次数少,只有叶子节点存储数据,检索方便,效率高。
Set HashSet TreeSet(实现Sortedset接口)
Java 集合是多个引用变量所组成的集合,这些引用变量指向实际的即Java对象,底层数据结构主要有:Array,HashTable,红黑树
Set不含重复元素,加入Set的元素必须定义equals()方法以确保对象的唯一性。Set接口不保证维护元素的次序。Hashcode() + equals()
HashSet底层由Hashmap实现,子类LinkedHashSet元素迭代顺序与添加顺序相同数据结构由哈希表和链表实现,保证唯一性和有序性
TreeSet底层为TreeMap(红黑树(自平衡的排序二叉树)),唯一且能够根据某种排序规则进行排序,而比较是依赖于compareTo方法,方法在comparable接口内,需要排序的类要实现该接口。
红黑树特性:局部平衡;旋转次数最多为3
ArrayList原理和扩容方法
ArrayList是List接口的可变数组的实现,单线程。实现了所有可选列表操作,并允许包括 null 在内的所有元素。ensureCapacity(int minCapacity)扩容,数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量是其原容量的1.5倍。
多线程:Collections.synchronizedList(List l) 或者CopyOnWriteArrayList
ArrayList实现了Serializable接口,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,即通过下标序号进行快速访问,实现了Cloneable接口,能被克隆。
Transient(不被持久化) 私有属性Object[] elementData;int size;
Arrays.copyof()和System.arraycopy() 数组复制
Hashmap结构和自定义实现
Hashmap是一个散列表,存储的内容是键值对(key-value)映射,默认大小为16(2的幂)。HashMap底层实现是数组+链表(哈希冲突)。Hashmap继承于AbstractMap,实现了Map、Cloneable、Java.io.Serializable接口。Hashmap的函数都不是同步的,是线程不安全的。key、value都可以为null。Hashtable中的映射不是有序的。Hashtable 的实例有两个参数影响其性能:初始容量和加载因子loadFactor。
Java数据类型传递
int String Object参数传递 不会改变原值
京东金融(现场面试 2017.5.11)
笔试
(图片传不上去,需要看的私聊我)
9.你对金融科技公司的看法,对应聘岗位的看法,以及对爬虫的理解
多态(重载、重写)
方法的重写Override和重载Overload是Java多态性的不同表现。重写Override是父类与子类(继承)之间多态性的一种表现,重载Overload是一个类中多态性的一种表现。子类中定义某方法与父类有相同的名称和参数,即为重写 (Override)。在一个类中定义了多个同名的方法,有不同的参数个数或有不同的参数类型,即重载(Overloadi)。Overload的方法是可以改变返回值的类型。
String、StringBuffer与StringBuilder区别
String是字符串常量 每次拼接都是新对象 效率差 消耗资源
StringBuffer/StringBuilder字符串变量 字符串拼接 不会生成新的对象 效率高
StringBuffer是线程安全的,StringBuilder是线程不安全的,
效率:StringBuilder>StringBuffer>String
集合(ArrayList,HashMap)
ArrayList底层是Object类型的动态数组,Array的升级版本,提供了动态的增加和减少元素,实现了Collection中的List接口,灵活的设置数组的大小等好处。
HashMap底层实现是数组+链表,基于哈希表的 Map 接口的实现,以key-value的形式存在。key-value作为一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,可以通过key快速地存、取value。
堆和栈的区别
JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而所有的对象实例和数组在堆上分配。
当新建New()时候,JVM会在堆上建一个对象,然后将其地址信息注册到栈上,并把它赋给我们的引用对象,整个创建->注册->赋值过程结束。
当创建基本数据类型的时候,JVM会在栈上直接注册。
栈的优势是存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性,栈数据可以共享。
堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
SQL语句 跨表查询 获取数据表倒数第五条记录
外连接 左连接left join 或 left outer join 右连接right join 或 right outer join
完全外连接 full join 或 full outer join
内连接 join 或者inner join
Select * from 表名 order by 表名.id desc limit 1,1;
HTTP理解
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求,建立一个TCP连接。HTTP服务器监听客户端发送过来的请求。一旦收到请求,服务器发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。HTTP协议的网页HTTP使用TCP的原因在于一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。通过HTTP或者HTTPS(默认端口是443)协议请求的资源由统一资源标示符(Uniform Resource Identifiers)(URLs)来标识。
HTTP/1.0不支持连接保持,后来HTTP/1.1增加了Connection:keep-alive以及管道,管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序。
HTTP/2.0是一个彻底的二进制协议;实现双向的、实时的通信(多工),避免了队头阻塞;用ID来区分数据流,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数;可以取消数据流;客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应;引入了头信息压缩机制和信息表;允许服务器未经请求,主动向客户端发送资源,叫做服务器推送;
TCP三次握手和四次挥手
volatile和synchronized区别,使用场景
1、volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住;
2、volatile仅能使用在变量级别,synchronized则可以使用在变量、方法和代码块;
3、volatile仅能实现变量的修改可见性,而synchronized则可以保证变量的修改可见性和原子性;
4、volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞;
5、当一个域的值依赖于它之前的值时,volatile就无法工作了,如n=n+1,n++等。如果某个域的值受到其他域的值的限制,那么volatile也无法工作,如Range类的lower和upper边界,必须遵循lower<=upper的限制;
6、使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域。
多线程遇到的问题及解决方案
脏数据:加锁、线程安全的类、synchronized
Spring和Spring MVC区别和使用原因
Spring 是是一个开源框架,是为了解决企业应用程序开发
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。Spring MVC只是Spring其中的一部分。Spring 可以支持 hibernate,mybatis,JMS,JDBC支持事务管理,注解功能,表达式语言,测试。Spring MVC就是一个简单的web 框架,上手很快,可以代替SSH框架。Spring MVC比 struts2 性能优一些。