zoukankan      html  css  js  c++  java
  • java面试题8

    java面试题08

     

     

    1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

    short s1 = 1; s1 = s1 + 1;编译时错误。
    对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

    short s1 = 1; s1 += 1;没有错误
    因为运算符参与运算的时候会自动加强制转换符.也就是说s1 += 1等效于s1 = (short)(s1 + 1);

    2.用最有效率的方法算出2乘以8等於几?

    用移位运算 int a=2<<3; 
    a就是2乘以8 最后结果是16 这是最省内存 最有效率的方法 
    这个方法确实高效率的。我来解释一下:
    2的二进制是10 在32位存储器里面是0000 0000 0000 0010
    左移三位后变成 0000 0000 0001 0000 也就是16

    3.public protected private 和默认的区别?

    01.private是只有本类中才能访问
    02.public是都能访问
    03.默认(包访问权限)是只有本包内才能访问,包括本包内的子类和普通类
    04.而protected是只要本包内就能访问,包括本包内的子类和普通类,另外别的包内的子类也能访问,但是普通类不能访问。
    05.所以说protected和默认(包访问权限)是很相似的,在同一个包内,它们是一样的,而在另一个包内,默认是不能访问的,而protected是只有子类能访问。

    4.构造器Constructor是否能被override?

    构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。

    Constructor不能被继承,所以Constructor也就不能被override。每一个类必须有自己的构造函数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须负责在一开始调用父类的构造函数。

    5.是否可以继承String类?

    不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。
    public final class String implements java.io.Serializable, Comparable<String>, CharSequence {}

    关于final:
    final类不能被继承,没有子类,final类中的方法默认是final的。 
      final方法不能被子类的方法覆盖,但可以被继承。 
      final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 
      final不能用于修饰构造方法。 
      注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

    6.描述一下JVM加载class文件的原理机制?

    JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。 
      由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。 
      类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。      从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明:

      Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
      Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
      System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

    7.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

    java中的流分为两种,字节流(InputStream OutputStream),字符流(InputStreamReader OutputStreamWriter)
    分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。
    字符流和字节流是根据处理数据的不同来区分的。字节流按照8位传输,字节流是最基本的,所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。
    1.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
    2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

    8.struts的应用(如struts架构)?

    Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 
    Struts有如下的主要功能: 
    01.包含一个controller servlet,能将用户的请求发送到相应的Action对象。
    02.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。
    03.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。

    9.Hibernate的inverse属性的作用?

    inverse是Hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系。

    10.介绍一下Hibernate的二级缓存?

    二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate 的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。

    11.用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。

    <script type="text/javascript">  
            window.onload=function() {  
                   var tbl = document.getElementById("tbl");  
                   var rows = tbl.getElementsByTagName("tr");  
                   for(i=0;i<rows.length;i++) {  
                          var j = parseInt(i/3); // 此语句的效果是,以3个为单位,000 111 222 333 444 ...  
                          if(j%2==0) rows[i].style.backgroundColor="#f00";  
                          else  rows[i].style.backgroundColor="#0f0";  
                   }  
            };  
          </script>  

     

    12.第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大?

    public static void main(String[] args) {
    System.out.println(computeAge(8));
    }
    private static int computeAge(int i) {
    if(i==1){
    return 10;
    }
    return computeAge(i-1)+2;
    }

    13.请写出用于校验HTML文本框中输入的内容全部为数字的javascript代码

    <script type="text/javascript">
    function chkNumber(eleText) {
    var value = eleText.value;
    var len = value.length;
    for(var i = 0;i < len;i++) {
    if(value.charAt(i) > "9" || value.charAt(i) < "0") {
    alert("含有非数字字符");
    eleText.focus();
    break;
    }
    }
    }
    </script>

    14.查出比经理薪水还高的员工信息:

     Drop table if not exists employees;、

    create table employees(id int primary key auto_increment,name  varchar(50)
    ,salary int,managerid int references employees(id));

    insert into employees values (null,' lhm',10000,null), (null,' zxx',15000,1
    ),(null,'flx',9000,1),(null,'tg',10000,2),(null,'wzg',10000,3);

    Wzg大于flx,lhm大于zxx

     

    解题思路:
    根据sql语句的查询特点,是逐行进行运算,不可能两行同时参与运算。
    涉及了员工薪水和经理薪水,所有,一行记录要同时包含两个薪水,所有想到要把这个表自关联组合一下。
    首先要组合出一个包含有各个员工及该员工的经理信息的长记录,譬如,左半部分是员工,右半部分是经理。而迪卡尔积会组合出很多垃圾信息,先去除这些垃圾信息。
    select e.* from employees e,employees m where e.managerid=m.id and e.sala ry>m.salary;


    15.一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?


    alter table dropcolumn score;
    alter table addcolunm score int;
    可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,
    这样的操作时无法回滚的,在我的印象中,只有inert updatedelete等DML语句才能回滚,
    对于create table,droptable ,alter table等DDL语句是不能回滚。

    解决方案一,update user set score=0;
    解决方案二,假设上面的代码要执行好长时间,超出我们的容忍范围,那我就alter table userdrop column score;alter table user add column score int。

    下面代码实现每年的那个凌晨时刻进行清零,或者使用spring框架集成quartz来实现定时调度。
    Runnable runnable=
    new Runnable(){
    public void run(){
    clearDb();
    schedule(this,new Date(newDate().getYear()+1,0,0));
    }
    };

    schedule(runnable,
    new Date(new Date().getYear()+1,0,1));

  • 相关阅读:
    Django之DRF框架
    工单系统之用户模块整体实现
    用户模块+jwt实现+注册带token值
    iOS控件之UITableView之滚动
    iOS控件之UITableView
    iOS控件
    iOS 长连接
    MAC PHP Composer
    smartSVN 删除目录/仓库
    smartSVN 分支与合并
  • 原文地址:https://www.cnblogs.com/Blogyin/p/8145047.html
Copyright © 2011-2022 走看看