13、是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以
在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是
说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法
中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无
法成立,所以,不可以一个static方法内部发出对非static方法的调用。
-------------------------------------------------------------------------------
14、Integer与int的区别
int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer
是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以
区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参
加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null
,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用
el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。
-------------------------------------------------------------------------------
15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它
们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,
所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;
floor的英文意义是地板,该方法就表示向下取整,
所以,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;
最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原
来的数字加上0.5后再向下取整,
所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
-------------------------------------------------------------------------------
8、abstract class和interface有什么区别?
含有abstract修饰符的class即为抽象类,抽象类不能创建的实例对象。
含有abstract方法的类必须定义为abstract class,
abstract class类中的方法不必是抽象的。
abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,
所以,不能有抽象构造方法或抽象静态方法。
如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的
。接口中的方法定义默认为public abstract类型,
接口中的成员变量类型默认为publicstatic final。
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有
非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且
默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以
任意,但接口中定义的变量只能是public static final类型,并且默认即为public
static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
-------------------------------------------------------------------------------
14. jdk中哪些类是不能继承的?
不能继承的是类是那些用final关键字修饰的类。一般比较基本的类型或防止扩展类无
意间破坏原来方法的实现的类型都应该是final的,在jdk中System,String,StringBuffer
等都是基本类型。
-------------------------------------------------------------------------------
11、String s = "Hello";s = s + " world!";这两行代码执行
后,原始的String对象中的内容到底变了没有?
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对
象。在这段代码中,s原先指向一个String对象,内容是
"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?
答案是没有。这时,s不指向原来那个对象了,而指向了另一个
String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个
引用变量不再指向它了。
-------------------------------------------------------------------------------
5、String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含
多个字符的字符数据。String类表示内容不可改变的字符串。而StringBuffer类表示内容可
以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,
你可以使用StringBuffers来动态构造字符数据。
-------------------------------------------------------------------------------
8.StringBuffer与StringBuilder的区别
StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程
不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个
线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量
,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。
-------------------------------------------------------------------------------
38、数组有没有length()这个方法?String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。
-------------------------------------------------------------------------------
43、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,
什么时候被执行,在return前还是后?
try中的return语句调用的函数先于finally中调用的函数执行,
也就是说return语句先执行,finally语句后执行
-------------------------------------------------------------------------------
12、final, finally, finalize的区别。
final
用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,
可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此
方法总被调用
-------------------------------------------------------------------------------
33、请写出你最常见到的5个runtime exception。
数组脚本越界(ArrayIndexOutOfBoundsException)
空指针异常(NullPointerException)
类转换异常(ClassCastException)
-------------------------------------------------------------------------------
56、多线程有几种实现方法?同步有几种实现方法?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉I
nterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切
的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的
锁,而是让它们竞争。
-------------------------------------------------------------------------------
30、启动一个线程是用run()还是start()? .
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一
个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
-------------------------------------------------------------------------------
47、当一个线程进入一个对象的一个synchronized方法后,
其它线程是否可进入此对象的其它方法?
分几种情况:
1.其他方法前是否加了synchronized关键字,如果没加,则能。
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不
能同步,因为非静态的方法用的是this。
-------------------------------------------------------------------------------
4、HashMap和Hashtable的区别
就HashMap与HashTable主要从三方面来说。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java
1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程不安全的,不
是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value
-------------------------------------------------------------------------------
5、List 和 Map 区别?
一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的
数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它
的值是可以有重复的。
-------------------------------------------------------------------------------
7、说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增
加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内
存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全
),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需
要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较
快。
LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作
堆栈和队列来使用。
-------------------------------------------------------------------------------
9、Collection 和 Collections的区别。
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、
排序、线程安全化等操作。
-------------------------------------------------------------------------------
39、Set里的元素是不能重复的,那么用什么方法来区分重
复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,元素重复与否是使用equals()方法进行判断的。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分
离的对象的内容和类型相配的话,返回真值。
-------------------------------------------------------------------------------
45、两个对象值相同(x.equals(y) ==
true),但却可有不同的hash code,这句话对不对?
对。
如果对象要保存在HashSet或HashMap中,它们的equals相等,那么,它们的hashcode值就
必须相等。
如果不是要保存在HashSet或HashMap,则与hashcode没有什么关系了,这时候hashcode不
等是可以的,例如arrayList存储的对象就不用实现hashcode,当然,我们没有理由不实现
,通常都会去实现的。
-------------------------------------------------------------------------------
100、java中有几种类型的流?JDK为每种类型的流提供了
一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流继承于InputStream
OutputStream,字符流继承于InputStreamReader
OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方
便。
-------------------------------------------------------------------------------
105、什么是java序列化,如何实现java序列化?或者请解
释Serializable接口的作用。
我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个ja
va对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我
们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提
供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java
帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊
处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的
类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,
implements Serializable只是为了标注该对象是可被序列化的。
例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象
序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行
网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实
现Serializable接口。