面试题-----Java基础
一:说说&和&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否则,只要有一方为 false,则结果为 false。
&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式,例如,对于 if(str != null && !str.equals(“”))表达式,当 str 为 null 时,后面的表达式不会执行,所以不会出现 NullPointerException 如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>>0) y会增长,If(x==33 && ++y>0)不会增长&还可以用作位运算符,当&操作符两边的表达式不是 boolean类型时,&表示按位与操作,我们通常使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位。
二、char 型变量中能不能存贮一个中文汉字?为什么?
char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,所以,char 型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char 类型的变量也是占用两个字节。
三:"=="和 equals 方法究竟有什么区别
==可以直接用于基本数据类型的判断,也可以用于引用数据类型的判断(判断的是地址)。是用于 判断基本数据类型的值和引用数据类型的地址是否相等。
equals方法是用于比较两个独立对象的内容是否相同,如:
String a =new String("11");
String b =new String("11");
这两个语句创建了两个对象,然后用a,b两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,若a==b,返回false。但是两个对象中的内容是相同的,故a.equals(b)将返回true。
四:是否可以从一个 static 方法内部发出对非 static方法的调用
不可以。因为非static方法与对象关联,必须创建一个对象后,才可以在该对象上进行方法调用。而static方法调用时不需要创建对象,可以直接调用。即当一个static方法被调用时,可能还没有创建任何实例对象,非static方法无法关联到对象上。
五:Integer与int的区别
int是Java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是Java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int无法表达出未赋值的情况。在JSP开发时,Integer的默认值为null,所以el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0。所以int不适合作为web层的表单数据的类型。
Integer提供了多个与整数相关的操作方法,如:将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
六:String是最基本的数据类型吗?
基本数据类型包括byte、int、char、long、float、double、boolean和 short。
java.lang.String类是final类型的,因此不能继承这个类、不能修改这个类。为了提高效率节省空间,应使用StringBuffer类。
七:是否可以继承String类?
java.lang.String类是final类型的,因此不能继承这个类、不能修改这个类。
八:final、finally、finalize的区别
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是在java.lang.Object里定义的,即每个对象都有这个方法。这个方法在gc启动,该对象被回收的时候被调用。gc可以回收大部分的对象(new创建出来的方法gc都能回收,一般使用new来创建对象),所以一般不实现finalize。
子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
九:sleep()和wait()有什么区别?
sleep 睡眠 ,在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时会自动恢复。调用sleep不会释放对象锁。
wait等待 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池。
十:启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码。
run()只是用于定义要执行的任务,start()是用于创建并开 启一个线程。
十一:List和Map区别?
一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。
十二:List, Set, Map 是否继承自 Collection 接口?
List,set继承,Map不继承。
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。Java JDK不能提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的"子接口",如:List和Set。
Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同key,每个key只能映射一个value。