java面试一

java异常

当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

java接口

由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。

java垃圾回收

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

java线程同步的方法

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

java中error和exception的区别

Error表示系统级的错误和程序不必处理的异常,表示恢复不是不可能但很困难的情况下的一种严重问题

Exception表示需要捕捉或者需要程序进行处理的异常。

在java中一个类被声明为final类型,表示了什么意思?

表示该类不能被继承,是顶级类。

常用的代码风格

1.首字母大写

2.常量全部大写中间使用下划线连接

3.方法一般private,如果只在当前类中使用定义为private,子类需要沿用的话使用protected

4.代码注释十分重要

5.代码在功能安全性的基础上实现优化

6.尽量使用interface

java堆栈的区别heap和stack有什么区别。

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性先进后出

堆是栈的一个组成元素,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要 在运行时动态分配内存,存取速度较慢。先进先出

java中final, finally, finalize的区别。

final 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。

finally 在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

finalize 方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

匿名内部类是没有名字的内部类,不能被继承,但是一个内部类可以作为一个接口,有另一个内部类来实现

Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。

java内部类和c++嵌套类最大的不同在于是否有指向外部的引用

1.创建一个static内部类的对象,不需要一个外部类的对象

2.不能从一个static内部类的一个对象访问一个外部类对象

java中&和&&的区别

两个都是逻辑上的运算符,但是两个的区别在于,&是两边都需要判断,&&如果前面为false的时候后面则不会再运行判断,直接返回false

hashMap和hashTable的区别

都属于map的实现类

1.hashmap没有分类或者排序,允许一个或者多个空值null

2.hashtable不允许null键和null值,他比hashmap慢,因为他是同步的

collection和collections的区别

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。

Collection是个java.util下的接口,它是各种集合结构的父接口。

什么时候用到assert

断言是一个包含布尔表达式的语句,如果表达式为false那么系统就会报告给出一个assertionerror,

断言的形式有两种

1.assert one

2.assert two

断言再默认情况下是禁用的:需要javac -source 1.4Test.java

启用断言使用 enableassertions -ea

关闭断言使用 disableassertions -da

java中的gc

gc是垃圾回收器,java程序员不用担心内存管理,gc会自动管理

System.gc()

Runtime.getRuntime.gc()

String str = new String (“xyz”);创建了几个String Object对象

两个对象,一个是"xyz",一个是指向"xyz"的对象

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

short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

sleep() 和 wait() 有什么区别? 搞线程的最爱

sleep是使线程停止一段时间的方法,在停止的时间到了,线程不一定立即执行,这是因为在那个时刻,其他线程可能正在运行且没有被调度为放弃执行,除非醒来的线程具有更高的优先级,正在运行的线程因为其他的原因被阻塞

wait是线程交互时,如果线程对一个同步对象x发出一个wait调用,该线程会暂停执行,被调对象进入等待状态,知道被唤醒或者等待时间结束。

java中有没有goto

java中的保留字,没有在java中使用

数组中和String中有没有length()方法

数组中有length属性。String中有length()方法

overload和override的区别

方法的重写Overriding 和 重载Overloading 是 Java多态性 的不同表现。重写Overriding 是父类与子类之间多态性的一种表现。重载Overloading 是一个类中多态性的一种表现。

如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

set里的元素是不能重复的,那么用什么来区别重复与否呢

那么用iterator()方法来区分重复与否

equals和==的区别

==

1、比较的是操作符两端的操作数是否是同一个对象。

2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。

3、比较的是地址

equals

equals用来比较的是两个对象的内容是否相等

super()与 this()的区别

This():当前类的对象,super 父类对象。

Super():在子类访问父类的成员和行为,必须受类继承规则的约束

而 this 他代表当前对象,当然所有的资源都可以访问.

在 JAVA 中,如何跳出当前的多重嵌套循环?

用 break; return 方法。

什么是 java 序列化,如何实现 序列化

序列化:
可以将一个对象保存到一个文件,所以可以通过流的方式在网络上传输,可以将文件的内容读取,转化为一个对象。
处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法,implements Serializable

排序都有哪几种方法?请列举

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)快速排序的伪代码。

什么是类的返射机制

通过类(Class 对象),可以得出当前类的 fields、method、construtor、interface、superClass、modified 等,同是可以通过类实例化一个实例、设置属性、唤醒方法。Spring 中一切都是返射、struts、hibernate 都是通过类的返射进行开发的。

类的返射机制中的包及核心类

java.lang.Class
java.lang.refrection.Method
java.lang.refrection.Field
java.lang.refrection.Constructor
java.lang.refrection.Modifier
java.lang.refrection.Interface

得到 Class 的三个过程是什么

对象.getClass()
类.class 或 Integer.type(int) Integer.class(java.lang.Integer)
Class.forName();

java中存在内存泄漏吗

存在,如:int i,i2; return (i-i2);

when i 为足够大的正数,i2 为足够大的负数。结果会造成溢位,导致错误。

静态变量和实例变量的区别?

static i = 10; //常量
i =10;//可变
静态方法可以调用静态变量。
实现方法可以调用静态变量、实例变量

是否可以从一个 static 方法内部发出对非static方法内部发出对非 static 方法的调用?

不可以,如果其中包含对象的 method();不能保证对象初始化.

写clone()方法时,通常都有一行代码,是什么

clone有缺省行为,super.clone(),她负责产生正确的大小的空间,并逐位复制

java语言如何进行异常处理,关键字throws throw try catch finally分别代表的含义,try中可以抛异常吗

Try:执行部分,产生异常
Catch:捕捉异常
Finally:不管有没有异常都执行
Throws:在方法声明处声明要抛出的异常,调用者必须Throw:抛出一个异常
在 try 中可以抛出异常,一般与声明的异常相同。
自定义异常要继承于 Exception 或 Exception 的子类

集合的作用是什么

数据的传送,增删改查,可以存放不同类型的对象

集合的通用方法
集合List的遍历方法

Iterator

For

Get

Set

Collection的通用方法

Iterator()

Add()

Remove()

Clear()

基本数据类型

byte char int long float double boolean short

对象的三大状态

自由 与session无关

持久 由session管理

游离 被session抛弃

mybatis的好处

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

jdbc问题总结如下

1、 数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。

2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。

3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。

4、 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

#{}和${}的不同

#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

java 第三方接口错误码列表 java接口描述错误_java{}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, java 第三方接口错误码列表 java接口描述错误_sql_02{}括号中只能是value。

parameterType和resultType

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中

Mybatis解决jdbc编程的问题

1、 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。

2、 Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3、 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

4、 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型

mybatis与hibernate不同

Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好

Mapper动态代理方式

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper接口开发需要遵循以下规范:

1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同