Java技术分享Java 杂谈

Java基础面试题-2

2018-01-22  本文已影响14人  Belmode
  1. 创建Hibernate持久化对象需要注意的事项

    • 实体类是个简单Java类,拥有私有属性和setter/getter方法
    • 不能被final修饰
    • 拥有有主键
    • 必须拥有无参构造器
  2. java中,线程的生命周期

    • 新建 (new)
    • 就绪 (执行start())
    • 运行 (虚拟机调度,执行run()方法)
    • 阻塞 (死锁,sleep,wait,io阻塞,等待通知)
    • 死亡 (被jvm回收)
  3. struts2 动态Action

    • 第一种方式:指定method属性

    • 第二种方式:感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用

      <constant name="struts.enable.DynamicMethodInvocation" value="true" />

    • 第三种方式:通配符方式(官网推荐使用)

      首先得关闭开关
      <constant name="struts.enable.DynamicMethodInvocation" value="false" />

      <action name="someaction_*" class="com.SomeAction"
      method="{1}">
      <result name="success">/success.jsp</result>
      </action>

      新版本配置

      <allowed-methods>"方法名"</allowed-methods>

      <allowed-methods>regex:.*</allowed-methods>

  4. 同步方法和同步代码块的区别

    同步方法是粗粒度锁,而同步代码块是细粒度锁。

    (同步方法里可以有同步代码块。)

    懒汉式单例模式-双重锁的例子

  5. 构造器能被重写吗?为什么不能被重写

    不能。重写的前提是继承,而构造方法不能被继承,所以不能被重写。(可以被重载)

  6. Oracle分页

    ROWNUM
    可能都知道ROWNUM只适用于小于或小于等于,如果进行等于判断,那么只能等于1,不能进行大于的比较。
    ROWNUM是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推。
    ROWNUM总是从1开始,不管当前的记录是否满足查询结果,ROWNUM返回的值都是1,如果这条记录的值最终满足所有的条件,那么ROWNUM会递加,下一条记录的ROWNUM会返回2,否则下一条记录的ROWNUM仍然返回1。
    理解了这一点,就清楚为什么一般的ROWNUM大于某个值或等于某个不为1的值是无法返回结果的,因此对于每条记录的ROWNUM都是1,而ROWNUM为1不满足查询的结果,所以下一条记录的ROWNUM不会递增,仍然是1,因此所有的记录都不满足条件。
    

    分页查询格式1
    在查询的最外层控制分页的最小值和最大值。查询语句如下:

    SELECT * FROM   
    (  
    SELECT A.*, ROWNUM RN   
    FROM (SELECT * FROM TABLE_NAME) A   
    )  
    WHERE RN BETWEEN 21 AND 40  
    

    分页查询格式2

    SELECT * FROM   
    (  
    SELECT A.*, ROWNUM RN   
    FROM (SELECT * FROM TABLE_NAME) A   
    WHERE ROWNUM <= 40  
    )  
    WHERE RN >= 21 
    

    分页查询格式3
    考虑到多表联合的情况,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

    SELECT /*+ FIRST_ROWS */ * FROM   
    (  
    SELECT A.*, ROWNUM RN   
    FROM (SELECT * FROM TABLE_NAME) A   
    WHERE ROWNUM <= 40  
    )  
    WHERE RN >= 21 
    

    效率问题
    对比这两种写法,绝大多数的情况下,第2个查询的效率比第1个高得多。
    这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第2个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
    而第1个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第1个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
    上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

  7. MySQL分页

    select * from 表名 limit 起始点,页长度 //起始点从0开始

  8. 获取类对象有哪几种方式

    第一种方式:new关键字

    第二种方式:通过类本身来获得对象

    ​ 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。

    SomeClass instance = (CreateInstance)Class.forname("com.create.instance.CreateInstance").newInstance();
    SomeClass sc = SomeClass.class.newInstance();
    

    第三种方式:运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

    ObjectInputStream in = new ObjectInputStream(new FileInputStream("序列化文件")); 
    SomeClass sc = (SomeClass) in.readObject();
    

    第四种方式:clone()克隆方法

    SomeClass sc1 = (SomeClass) sc.clone();
    
  9. 循环三要素

    循环变量、循环体和循环终止条件三要素

  10. Struts2中,图片如何上传,要注意什么

    不想写了。。。

    input域修改type=“file” 和 accept属性(是MIME类型)

    form表单 修改 enctype="multipart/form-data"

    struts配置文件上传类

  11. Hibernate是如何使用的

    1. 读取并解析配置文件(Configuration().configure()
    2. 读取并解析映射信息,创建SessionFactory
    3. 打开Session
    4. 开始一个事务(增删改操作必须,查询操作可选)
    5. 数据库操作
    6. 提交事务(回滚事务)
    7. 关闭session
  12. MySQL与Oracle的区别

    转载来自:http://blog.csdn.net/c332472988/article/details/52804078

     一、并发性
     
    并发性是oltp数据库最重要的特性,但并发涉及到资源的获取、共享与锁定。
     
    mysql:
    mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。
    虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
     
    oracle:
    oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以oracle对并发性的支持要好很多。
     
    二、一致性
    oracle:
    oracle支持serializable的隔离级别,可以实现最高级别的读一致性。每个session提交后其他session才能看到提交的更改。oracle通过在undo表空间中构造多版本数据块来实现读一致性,
    每个session查询时,如果对应的数据块发生变化,oracle会在undo表空间中为这个session构造它查询时的旧的数据块。
     
    mysql:
    mysql没有类似oracle的构造多版本数据块的机制,只支持read commited的隔离级别。一个session读取数据时,其他session不能更改数据,但可以在表最后插入数据。
    session更新数据时,要加上排它锁,其他session无法访问数据。
     
    三、事务
    oracle很早就完全支持事务。
     
    mysql在innodb存储引擎的行级锁的情况下才支持事务。
     
    四、数据持久性
    oracle
    保证提交的数据均可恢复,因为oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,
    如果出现数据库或主机异常重启,重启后oracle可以考联机在线日志恢复客户提交的数据。
    mysql:
    默认提交sql语句,但如果更新过程中出现db或主机重启的问题,也许会丢失数据。
    
    
    五、提交方式
    oracle默认不自动提交,需要用户手动提交。
    mysql默认是自动提交。
     
    六、逻辑备份
     
    oracle逻辑备份时不锁定数据,且备份的数据是一致的。
     
    mysql逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用。
     
    七、热备份
    oracle有成熟的热备工具rman,热备时,不影响用户使用数据库。即使备份的数据库不一致,也可以在恢复时通过归档日志和联机重做日志进行一致的回复。
    mysql:
    myisam的引擎,用mysql自带的mysqlhostcopy热备时,需要给表加读锁,影响dml操作。
    innodb的引擎,它会备份innodb的表和索引,但是不会备份.frm文件。用ibbackup备份时,会有一个日志文件记录备份期间的数据变化,因此可以不用锁表,不影响其他用户使用数据库。但此工具是收费的。
    innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。
     
    八、sql语句的扩展和灵活性
    mysql对sql语句有很多非常实用而方便的扩展,比如limit功能,insert可以一次插入多行数据,select某些管理数据可以不加from。
    oracle在这方面感觉更加稳重传统一些。
     
    九、复制
    oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以自动切换备库到主库,但配置管理较复杂。
    mysql:复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。且需要手工切换丛库到主库。
     
    十、性能诊断
    oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等
    mysql的诊断调优方法较少,主要有慢查询日志。
     
    十一、权限与安全
     
    mysql的用户与主机有关,感觉没有什么意义,另外更容易被仿冒主机及ip有可乘之机。
    oracle的权限与安全概念比较传统,中规中矩。
     
    十二、分区表和分区索引
    oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。
    mysql的分区表还不太成熟稳定。
     
    十三、管理工具
    oracle有多种成熟的命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。
    mysql管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin, etc),有一定复杂性。
    
    服务端提供oracle服务的实例,其是数据库的核心,用于数据库的管理,对象的管理与存储、数据的存储、查询、数据库资源的监控、监听等一些服务。
    而客户端只是一个与服务端交互的工具,如sqlplus,在sqlplus里执行SQL语句传到服务端,服务端进行解析后执行SQL里的操作,并将操作结果输出到客户端。
    这就完成了一个客户端与服务端交互的过程。
    
  13. MySQL数据库如何给用户添加一个字段

    alter table 表名 add 字段 类型 其他参数

  14. 为什么说HashMap是线程不安全的

    HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。

    javadoc中关于hashmap的一段描述如下:

    此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问

    详细解释:http://blog.csdn.net/mydreamongo/article/details/8960667

  15. 图片轮播是怎么实现的

    最简单的方式,写几个li在ul中,每个li里面都有img

    使用setTimeOut或者setInteval定时,到了指定时间,就修改每个li的class属性(已有显示和隐藏的css),给他添加或者删除class名,或者,直接对li进行修改css,displaly,block或者none

  16. Ajax分页查询的实现(原生JS/JS框架)

    原生js

    var xmlhttp;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    
    
    xmlhttp.open("GET","参数",true);
    xmlhttp.send();
    

    jQuery

    $.ajax()/$.post()/$.get()
    略
    

    后台只需接受页码,排序规则(可选),操作,每页大小(可在服务器定义,不传参);反回 对应排序规则和大小的记录,和总页数。

上一篇下一篇

猜你喜欢

热点阅读