首页 >  面试题 > JAVA,PHP企业面试宝典 > 

java基础面试(二)

java基础面试(二)

作者:elc 来源: 时间:2017-04-21 访问次数:1234
有两个静态网页:input.html和result.html,如果input.html需要把一个表单数据传递到result.html,有几种方法,分别是什么



1. 有两个静态网页:input.html和result.html,如果input.html需要把一个表单数据传递到result.html,有几种方法,分别是什么?

答:1).JavaScript静态页面值传递之URL篇能过URL进行传值.把要传递的信息接在URL上.


  2)JavaScript静态页面值传递之Cookie篇。Cookie是浏览器存储少量命名数据.它与某个特定的网页或网站关联在一起.Cookie用来给浏览器提供内存,以便脚本和服务器程序可以在一个页面中使用另一个页面的输入数据.


  3).JavaScript静态页面值传递 Window.open。这两窗口之间存在着关系.父窗口parent.htm打开子窗口son.htm子窗口可以通过window.opener指向父窗口.这样可以访问父窗口的对象.



2、你熟悉的js框架有什么,他们有什么优点?



答:( 1 ).Jquery 


JQuery 是一款同 prototype 一样优秀 js 开发库类,特别是对 css 和 XPath 的支持,使我们写 js 变得更加方便!如果你不是个 js 高手又想写出优秀的 js 效果,那么 JQuery 可以帮你达到目的!并且简介的语法和高的效率一直是jQuery追求的目标。 


<2>.优点:注重简介和高效,js 效果有 yui-ext 的选择,因为 yui-ext 重用了很多 jQuery 的函数


<3>.缺点:据说太嫩,历史不悠久。


( 2 ).EXT js


<1>.介绍
基于 Yahoo UI 的扩展包 yui-ext 是具有 CS 风格的 Web 用户界面组件,能实现复杂的 Layout 布局,界面效果可以和 backbase 媲美,而且使用纯 javascript 代码开发。真正的可编辑的表格 Edit Grid,支持 XML 和 Json 数据类型,直接可以迁入 Grid。许多组件实现了对数据源的支持,例如动态的布局,可编辑的表格控件,动态加载的 Tree 控件、动态拖拽效果等等。从 1.0 beta 版开始同 Jquery 合作,推出基于 jQuery 的 Ext 1.0,提供了更多有趣的功能。


<2>.优点:结构化,类似于 java 的结构,清晰明了,底层用到了 Jquery 的一些函数,使整合使用有了选择,最重要的一点是界面太让让人震撼了。


<3>.缺点:太过复杂,整个界面的构造过于复杂。


( 3 ).Dojo 


<1>.介绍


Dojo 是目前最为强大的JS框架,它在自己的 Wiki 上给自己下了一个定义,Dojo 是一个用 JavaScript 编写的开源的DHTML工具箱。Dojo 很想做一个“大一统”的工具箱,不仅仅是浏览器层面的,野心还是很大的。Dojo 包括 Ajax、Browser、Event、Widget 等跨浏览器 API,包括了 JS 本身的语言扩展,以及各个方面的工具类库,和比较完善的 UI 组件库,也被广泛应用在很多项目中,他的 UI 组件的特点是通过给 HTML 标签增加 TAG 的方式进行扩展,而不是通过写 JS 来生成,Dojo 的 API 模仿 Java 类库的组织方式。用 Dojo 写 Web OS 可谓非常方便。Dojo 现在已经 4.0 了,Dojo 强大的地方在于界面和特效的封装,可以让开发者快速构建一些兼容标准的界面。


<1>.优点:库相当完善,发展时间也比较长,功能强大,据说利用 Dojo 的 io.bind() 可以实现 comet 看见其功能强大非一般,得到 IBM 和 SUN 的支持。


<2>.缺点:文件体积比较大,200多KB,初次下载相当慢,此外,Dojo 的类库使用显得不是那么易用,JS语法增强方面不如 Prototype 



3、String、StringBuffer、StringBuilder的区别。



答:

String字符串常量   不可变  使用字符串拼接时是不同的2个空间

StringBuffer  字符串变量   可变   线程安全  字符串拼接直接在字符串后追加

StringBuilder 字符串变量   可变   非线程安全  字符串拼接直接在字符串后追加

1.StringBuilder执行效率高于StringBuffer高于String

2.String是一个常量,是不可变的,所以对于每一次+=赋值都会创建

一个新的对象,StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append方法,在原来的基础上进行追加,所以性能比

String要高,又因为StringBuffer  是线程安全的而StringBuilder是线程非安全的,所以StringBuilder的效率高于 StringBuffer.

2. 对于大数据量的字符串的拼接,采用StringBuffer,StringBuilder.



4、请说出Set、List、Map的区别?List有几个实现类,它们有哪些区别?




答:List特点:元素有放入顺序,元素可重复

Map特点:元素按键值对存储,无放入顺序

Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,

但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)

List接口有三个实现类:LinkedList,ArrayList,Vector

LinkedList:底层基于链表实现,链表内存是散乱的,

每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢

ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低

Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet

SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现)

Query接口有一个实现类:LinkList

Map接口有三个实现类:HashMap,HashTable,LinkeHashMap

  HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null

SortedMap有一个实现类:TreeMap

其实最主要的是,list是用来处理序列的,而set是用来处理集的。Map是知道的,存储的是键值对

set 一般无序不重复.map kv 结构 list 有序



5、Hibernate中查询数据的方式有哪些?你更习惯使用哪种方式?



答:1).导航对象图查询:根据已经加载的对象,导航到其他对象。


例如,对于已经加载的Customer对象,调用它getOrders().iterator()方法就可以导航到所有关联的Order对象,假如在关联级别使用了延迟加载检索策略,那么首次执行此方法时,hibernate会从数据库中加载关联的Order对象,否则就从缓存中取得Order对象。


2).OID方式:按照对象的OID来检索对象。


Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。

 get与load比较

get()和load(),它们的用法完全一样,都需要两个参数,第1个是持久化对象类名.class,第2个是行号,也就是说这2个方法都只能返回固定的某一行的数据,但是需要注意的是:当输入的参数行号在数据库中不存在时,get()会返回一个空对象,不会报错,而load()会直接报错。


3).HQL检索方式:Hibernate Query Language(重要的、Hibernate强调的)


使用面向对象的HQL查询语言。Session的find()方法用于执行HQL查询语句。此外,Hibernate还提供了Query接口,它是Hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句。

它具有以下功能:

1)在查询语句中设定各种查询条件

2)支持投影查询,即仅检索出对象的部分属性

3)支持分页查询

4)支持连接查询

5)支持分组查询,允许使用having和group by关键字

6)提供内置聚集函数,如sum()、min()和max()

7)能够调用用户定义的SQL函数

8)支持子查询,即嵌入式查询

9)支持动态绑定参数

例:Query query = session.createQuery(“from UserPO”);获得一个query对象,注意参数字符串中不是一个SQL语句,from后面跟的是持久化对象名字,List list = query.list();就可以获得数据库中对应表的数据集合


4).QBC检索方式:Query By Criteria的API来检索对象


这种API封装了基于字符串形式的查询语句,提供了更加面向对象的接口

例:Criteria cr = session.createCriteria(UserPO.class);创建一个Criteria对象,参数是所关联的持久化对象,cr.add(Restrictions.ge(“id”, 2));将查询条件加入对象中,后面的操作就和query对象一样了。


5).本地SQL:SQL语句查询


使用本地数据库的SQL查询语句,Hibernate会负责把检索到的JDBC ResultSet结果集映射为持久化对象图


6、斐波那契数列的规则如下:1、1、2、3、5、8、13、21、34...求第n个数是多少?请设计算法实现,并考虑效率和内存空间占用。




答:public class Fibonacci {  

  

    public static void main(String[] args) {  

        Scanner scanner = new Scanner(System.in);  

        System.out.println("Please input this fibonacci n:");  

        int n = scanner.nextInt(); // 假设输入为大于零的整数  

          

        System.out.println(fibonacci(6) + ":" + fibonacciNormal(6));  

          

        int sum = 0;  

        for(int i = 1; i <= n; i++){  

            sum += fibonacci(i);  

        }  

        System.out.println(sum);  

    }  

      

    // 递归实现方式  

    public static int fibonacci(int n){  

        if(n <= 2){  

            return 1;  

        }else{  

            return fibonacci(n-1) + fibonacci(n-2);  

        }  

    }  

      

    // 递推实现方式  

    public static int fibonacciNormal(int n){  

        if(n <= 2){  

            return 1;  

        }  

        int n1 = 1, n2 = 1, sn = 0;  

        for(int i = 0; i < n - 2; i ++){  

            sn = n1 + n2;  

            n1 = n2;  

            n2 = sn;  

        }  

        return sn;  

    }  

}  



7、一个6位数乘以一个3位数,得到一个结果。但不能清楚6位数中的两个数字是什么,而且结果中有一个数字也不清楚,找出问号代表的数字(答案可能有多个,说出思路,不用具体实现12?56?X   123…………=154?4987



答:for(int i=0;i<9;i++)

{

  if((120560+i+i*1000)*123==15404987+i*10000)

   System.out.println(i);

}


public static void main(String args[]){


for(int a=0;a<10;a++)

{

  for(int   b=0;b <10;b++)  

  {  

    for(int   c=0;c <10;c++)  

    {  

     if((120560+a+b*1000)*123==15404987+c*10000)

      {

      System.out.println(a);

      System.out.println(b);

      System.out.println(b);

     }

    }

  }

}

}



8、如果发现一个查询页面非常缓慢,请分步骤说一下如何查找原因和优化?



答:1).(重点)(必须说) SELECT语句中避免使用 *, 尽量应该根据业务需求按字段进行查询


举例:如果表中有个字段用的是clob或者是blob这种大数据字段的话,他们的查询应该根据业务需要来进


行指定字段的查询,切记勿直接用*



2).(重点) 删除重复记录(oracle):


最高效的删除重复记录方法 ( 因为使用了ROWID)例子


DELETE  FROM  EMP E  WHERE  E.ROWID > (SELECT MIN(X.ROWID)


FROM  EMP X  WHERE  X.EMP_NO = E.EMP_NO);


3). 用>=替换>


    如一个表有100万记录,一个数值型字段A,

      A=0时,有30万条;

      A=1时,有30万条;

      A=2时,有39万条;

      A=3时,有1万记录。


      那么执行 A>2 与 A>=3 的效果就有很大的区别了,因为 A>2 时,ORACLE会先找出为2的记录索引再

进行比较,而A>=3时ORACLE则直接找到=3的记录索引。


4).(重点)尽量多使用COMMIT

如对大数据量的分段批量提交


5). (重点)用NOT EXISTS 或(外连接+判断为空)方案 替换 NOT IN操作符

此操作是强列推荐不使用的,因为它不能应用表的索引。

    推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替


6).(重点 必须说)LIKE操作符(大数据的全文检索使用luncene)(solr)

    因为使用like不当,会导致性能问题,原因是like在左右两边都有%的时候,不会使用索引。

    如LIKE '%5400%' 这种查询不会引用索引,而LIKE 'X5400%' 则会引用范围索引。

一个实际例


    查询营业编号 YY_BH LIKE '%5400%' 这个条件会产生全表扫描, 如果改成   YY_BH LIKE 'X5400%' OR


YY_BH LIKE 'B5400%'则会利用    YY_BH  的索引进行两个范围的查询,性能肯定大大提高



7).(重点,必须说)避免在索引列上使用计算和函数,这样索引就不能使用


   举例:


低效:

    SELECT … FROM  DEPT  WHERE SAL * 12 > 25000;


      高效:

      SELECT … FROM DEPT WHERE SAL > 25000/12;


8).(重点 必须说)用UNION-ALL 替换UNION,因为UNION-ALL不会过滤重复数据而且不会自动排序,


所执行效率要快于UNION。



9). (优化,重点,3个方面 a.缓存 b.分段批量 c.存储过程)减少访问数据库的次数


举例:如果批量删除多条数据,可以用  delete  from tableName where id  in (1,2,3)而不要用多条delete语句

行删除


10).(重点 必须说)用TRUNCATE替代DELETE


TRUNCATE不记录日志,DELETE记录日志,所以TRUNCATE要快于DELETE但是一旦用TRUNCATE进行


删除就不能进行恢复,TRUNCATE是删除整张表的数据不能加where条件。


mysql,sqlserver中如果id为自增类型,那么如果用TRUNCATE删除,则id字段再插入数据时从1开始,如果delete删除的话,则从


删除之前的id的值继续增长。