`
DangDang0701
  • 浏览: 77241 次
  • 性别: Icon_minigender_2
  • 来自: 大连
社区版块
存档分类
最新评论

笔试题:第五道和第六道怎么解?

    博客分类:
  • JAVA
阅读更多

最近参加了一个面试。

 

之前在网上查询此公司的信息,一大堆诋毁的言论。

到公司之后,感觉并没有网上所说的不堪。除了气氛不是很轻松以外,别的都还可以。

 

面试官也很和蔼。

 

进去之后,面试官说一会还有个会,让我先作一套题。

 

因为是外企,所以题都是英文的。

一共6道题。
第一道:给出一个程序,给出结果。是关于String不变性的考察,很基础,很简单。


第二道:关于接口和抽象类之间的关系。也比较基础。


第三道:关于Statement和Preparedstatement之间的区别。
当时我只是写了Statement里的SQL语句必须是完整给出的。
Preparedstatement是预编译语句,里边的SQL可以有占位符号?出现,后边的程序再对Preparedstatement进行赋值。

看起来似乎没有什么问题,但是这种回答太表面了,这只是使用的时候得简单区别,没有给出面试官相要的答案。面试官可能更想要知道性能方面的差异。

如果用以下的回答也许更好。
1.联系和区别:
PreparedStatement接口继承 Statement,作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能,并与之在两方面有所不同,包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。

2.性能差异:
每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.

当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.
3.安全性:
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?

select * from tb_name = '随意' and passwd = '' or '1' = '1';
因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:
把[';drop table tb_name;]作为varpasswd传入进来,则:
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.

 

第四道:是对SQL的考察。
给出了三个表,我们熟悉的学生表,课程表,分数表。检索出高出数学平均分15分的学生信息。
我首先给出了一个数学平均分的中间表,加上给出的三个表,四个表作联合查询。
感觉性能上应该没有问题。

 

第五道:算法的考察。
给出两个整型数组,给出他们相减的结果。
例:A={1,2,3},B={2,3,4} A-B={1}

我的思路是嵌套循环,第一个数组做外循环,对A数组的每个值,在B数组里循环检索,没有的话就放在数组C中。

当时我也想到有效率的问题,但是也没有想到好办法。就这么地了。后来面试官问如果数据很多,效率很低。

 

第六道:给出一个单链表,如何检查它有没有回路。给出算法,不用编程。
这个问题,因为我的英语不太好,当时没有看明白,就没有做。面试官后来给我说了一下题意,问我该怎么做。我没有答上来。
后来我想到是不是改用MAP,用键和值分别记录单链表的值和指针,如果MAP的值在键里边存在的话,就说明有回路的存在。
我虽然这样想了,但是我没有说出来,怕弄不好,要被鄙视了。

 

希望各位能探讨一下第5题和第6题的好方法。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics