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));

posted @ 2017-10-31 22:02  迷茫王子  阅读(248)  评论(0编辑  收藏  举报