本帖最后由 逆风TO 于 2018-5-8 14:26 编辑
领域/融资:互联网金融,A轮 公司规模:500-999人 公司地址:西安雁塔高新六路与科技一路十字万象汇B座22层
面试前话 笔试作为招聘的第一个环节,一般考察的都是专业基础知识,也有很多人会发现,我明明考的是javaEE的卷子为啥前端的知识点考的这么多,而且有时候也会发现,大多是算法和逻辑思维题。比起笔试,面试的最大好处是可以可以和面试官面对面交流,可以更具象展示自己优点特长, 面试官也可以通过提示和追问来调整难度来挖掘你对知识点的理解是否深刻等, 面试题有很多种类型:项目细节、知识型问题,开放性问题,一下是面试中被问到的知识点汇总,希望能够帮到面试的你: 1: 是否了解连接池,使用连接池有什么好处? 数据库连接是非常消耗资源的,影响到程序的性能指标。连接池是用来分配、管理、释放数据库连接的,可以使应用程序重复使用同一个数据库连接,而不是每次都创建一个新的数据库连接。通过释放空闲时间较长的数据库连接避免数据库因为创建太多的连接而造成的连接遗漏问题,提高了程序性能 2:mvvm和mvc区别?
mvc和mvvm其实区别并不大。都是一种设计思想。主要就是mvc中Controller演变成mvvm中的viewModel。mvvm主要解决了mvc中大量的 DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。和当 Model 频繁发生变化,开发者需要主动更新到View 。
3:vue的优点是什么?
(1)低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。(2)可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
(3)独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。(4)可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。(5)组件之间的传值(6)路由之间跳转
4:Vector,ArrayList,LinkedList之间的区别:
(1)同步性
ArrayList,LinkedList是不同步的,而Vestor是同步的。所以如果不要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步而耗费的开销。但在多线程的情况下,有时候就不得不使用Vector了。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。
(2)数据增长
从内部实现机制来讲ArrayList和Vector都是使用Objec的数组形式来存储的。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。 (3)检索、插入、删除对象的效率 ArrayList和Vector中,从指定的位置(用index)检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1)。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行(n-i)个对象的位移操作。 LinkedList中,在插入、删除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的时候比较慢,为O(i),其中i是索引的位置。 5:什么是Sql注入?如何防止sql注入?
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。怎么防止SQL注入,使用存储过程来执行所有的查询;检查用户输入的合法性;将用户的登录名、密码等数据加密保存。 6:什么是存储过程?有哪些优缺点?什么是存储过程?有哪些优缺点?
存储过程就像我们编程语言中的函数一样,封装了我们的代码(PLSQL、T-SQL)。存储过程的优点:能够将代码封装起来保存在数据库之中让编程语言进行调用存储过程是一个预编译的代码块,执行效率比较高一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率存储过程的缺点:每个数据库的存储过程语法几乎都不一样,十分难以维护(不通用)业务逻辑放在数据库上,难以迭代 7:什么是视图?以及视图的使用场景有哪些?
视图是一种基于数据表的一种虚表。(1)视图是一种虚表。(2)视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。(3)向视图提供数据内容的语句为 SELECT 语句,可以将视图理解为存储起来的 SELECT 语句。(4)视图向用户提供基表数据的另一种表现形式。(5)视图没有存储真正的数据,真正的数据还是存储在基表中。(6)程序员虽然操作的是视图,但最终视图还会转成操作基表。(7)一个基表可以有0个或多个视图有的时候,我们可能只关系一张数据表中的某些字段,而另外的一些人只关系同一张数据表的某些字段...那么把全部的字段都都显示给他们看,这是不合理的。我们应该做到:他们想看到什么样的数据,我们就给他们什么样的数据...一方面就能够让他们只关注自己的数据,另一方面,我们也保证数据表一些保密的数据不会泄露出来...我们在查询数据的时候,常常需要编写非常长的SQL语句,几乎每次都要写很长很长....上面已经说了,视图就是基于查询的一种虚表,也就是说,视图可以将查询出来的数据进行封装。。。那么我们在使用的时候就会变得非常方便...值得注意的是:使用视图可以让我们专注与逻辑,但不提高查询效率 8:什么是事务?
(1)事务简单来说:一个Session中所进行所有的操作,要么同时成功,要么同时失败ACID — 数据库事务正确执行的四个基本要素包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)中的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易。举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账户的钱没变,B账户的钱也没变】。 (2)事务隔离级别数据库定义了4个隔离级别:Serializable【可避免脏读,不可重复读,虚读】Repeatable read【可避免脏读,不可重复读】Read committed【可避免脏读】Read uncommitted【级别最低,什么都避免不了】分别对应Connection类中的4个常量: TRANSACTION_READ_UNCOMMITTED TRANSACTION_READ_COMMITTED TRANSACTION_REPEATABLE_READ TRANSACTION_SERIALIZABLE 脏读:一个事务读取到另外一个事务未提交的数据例子:A向B转账,A执行了转账语句,但A还没有提交事务,B读取数据,发现自己账户钱变多了!B跟A说,我已经收到钱了。A回滚事务【rollback】,等B再查看账户的钱时,发现钱并没有多。 不可重复读:一个事务读取到另外一个事务已经修改(update)的数据,也就是说一个事务可以看到其他事务所做的修改注:A查询数据库得到数据,B去修改数据库的数据,导致A多次查询数据库的结果都不一样【危害:A每次查询的结果都是受B的影响的,那么A查询出来的信息就没有意思了】 虚读(幻读):是指在一个事务内读取到了别的事务插入(insert)的数据,导致前后读取不一致。注:和不可重复读类似,但虚读(幻读)会读到其他事务的插入的数据,导致前后读取不一致 简单总结:脏读是不可容忍的,不可重复读和虚读在一定的情况下是可以的【做统计的肯定就不行】。 9:数据库优化的思路
SQL优化在我们书写SQL语句的时候,其实书写的顺序、策略会影响到SQL的性能,虽然实现的功能是一样的,但是它们的性能会有些许差别。因此,下面就讲解在书写SQL的时候,怎么写比较好。
(1)选择最有效率的表名顺序数据库的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表将被最先处理在FROM子句中包含多个表的情况下:如果三个表是完全无关系的话,将记录和列名最少的表,写在最后,然后依次类推也就是说:选择记录条数最少的表放在最后如果有3个以上的表连接查询:如果三个表是有关系的话,将引用最多的表,放在最后,然后依次类推。也就是说:被其他表所引用的表放在最后例如:查询员工的编号,姓名,工资,工资等级,部门名emp表被引用得最多,记录数也是最多,因此放在form字句的最后面select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dnamefrom salgrade,dept,empwhere (emp.deptno = dept.deptno) and (emp.sal between salgrade.losal and salgrade.hisal)
(2)WHERE子句中的连接顺序数据库采用自右而左的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之左,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的之右。emp.sal可以过滤多条记录,写在WHERE字句的最右边 select emp.empno,emp.ename,emp.sal,dept.dname from dept,emp where (emp.deptno = dept.deptno) and (emp.sal > 1500)
(3)SELECT子句中避免使用*号我们当时学习的时候,“*”号是可以获取表中全部的字段数据的。但是它要通过查询数据字典完成的,这意味着将耗费更多的时间使用*号写出来的SQL语句也不够直观。
(4)用TRUNCATE替代DELETE这里仅仅是:删除表的全部记录,除了表结构才这样做。DELETE是一条一条记录的删除,而Truncate是将整个表删除,保留表结构,这样比DELETE快
(5)多使用内部函数提高SQL效率例如使用mysql的concat()函数会比使用||来进行拼接快,因为concat()函数已经被mysql优化过了。
(6)使用表或列的别名如果表或列的名称太长了,使用一些简短的别名也能稍微提高一些SQL的性能。毕竟要扫描的字符长度就变少了。。。
(7)多使用commitcomiit会释放回滚点...
(8)善用索引索引就是为了提高我们的查询数据的,当表的记录量非常大的时候,我们就可以使用索引了。
(9)SQL写大写我们在编写SQL 的时候,官方推荐的是使用大写来写关键字,因为Oracle服务器总是先将小写字母转成大写后,才执行
(10)避免在索引列上使用NOT因为Oracle服务器遇到NOT后,他就会停止目前的工作,转而执行全表扫描
(11)避免在索引列上使用计算WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描,这样会变得变慢
(12)用 >= 替代 > 低效: SELECT * FROM EMP WHERE DEPTNO > 3 首先定位到DEPTNO=3的记录并且扫描到第一个DEPT大于3的记录 高效: SELECT * FROM EMP WHERE DEPTNO >= 4 直接跳到第一个DEPT等于4的记录(13)用IN替代OR select * from emp where sal = 1500 or sal = 3000 or sal = 800; select * from emp where sal in (1500,3000,800);
(14)总是使用索引的第一个列如果索引是建立在多个列上,只有在它的第一个列被WHERE子句引用时,优化器才会选择使用该索引。 当只引用索引的第二个列时,不引用索引的第一个列时,优化器使用了全表扫描而忽略了索引 create index emp_sal_job_idex on emp(sal,job); ---------------------------------- select * from emp where job != 'SALES'; 上边就不使用索引了。数据库结构优化1)范式优化: 比如消除冗余(节省空间。。)2)反范式优化:比如适当加冗余等(减少join)3)拆分表: 垂直拆分和水平拆分
|