一些java笔试面试题



问题1:String s = new String("xyz") 创建了几个String Object?

答案:两个!

首先,"xyz "作为一个常量字符串被创建,它被保存在Constant Pool或者叫String Pool中,翻译成常量池。简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存在常量池中。如果常量池中已经存在 "xyz "这个串,你不需要再次创建一次,而是直接用"xyz”字符串就可以,这样当然是为了节省空间。注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。 
        然后,当调用到new String( "xyz ")的时候,使用String的构造器会在heap(堆)里创建一个对象, "xyz "作为传入构造器的实际参数,其含义就是:我在heap里创建一个字符串,它的内容和常量池中的 "xyz "内容一致!

首先你要理解constant pool, 这是一个特殊的共享区域,literate, Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。

但是如果把上面的表达式改成:String s = new String( "xyz ").intern(); 那么具体过程就变了,先在heap里创建一个String, 然后调用intern()方法,发现constant pool里存在 'xyz ',然后就会返回constant pool内对象的引用,稍后heap里的就not reachable了,会被gc,最终VM里只有一个 "xyz“

所以String s = new String("xyz") ,创建了两个String Object,一个在heap中,一个在String常量池。

问题2:Collection和Collections的区别?

答案:Collection是集合的上级接口,继承自他的接口有Set、List和Queue;Collections是操作集合的工具类,该工具类里提供了大量的静态方法对集合元素进行排序、查询和修改等操作,还提供了集合对象设置为不可变、对集合对象实现同步控制等方法。
问题3:HashMap和Hashtable的区别?

答案:HashMap和Hashtable都是Map接口的典型实现类,它们之间的关系完全类似于ArrayLista和Vector的关系:Hashtable是一个古老的Map实现类,它从JDK1.0起就已经出现了,当它出现时,Java还没有提供Map接口,所以它包含了一些古老而繁琐的方法。HashMap和Hashtable存在两点典型区别:(1)Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能高一点;但如果有多条线程访问同一个Map对象时,使用Hashtable实现类会更好。

(2)Hashtable不允许使用null作为key和value,如果试图把null值放进Hashtable中,将会引发NullPointerException异常;但HashMap可以使用null作为key或value。

问题4:Math.round(11.5)和Math.round(-11.5)分别等于多少?

答案:12和-11。round方法返回与参数最接近的长整数,向上取整。
问题5:final,finally,finalize的区别?

答案:final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

问题6:Vector、ArrayList、LinkedList

 

问题7: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正确。

如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确。这两个表达式都被称为赋值表达式。第二个表达式使用的是简单赋值操作符(=),而第一个表达式使用的是复合赋值操作符。Java语言规范中讲到,复合赋值(E1 op=E2)等价于简单赋值(E1=(T)((E1) op (E2))),其中T是E1的类型,除非E1只被计算一次。

换句话说,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。

因此,复合赋值表达式可能是危险的。为了避免这种令人不快的突袭,请不要将复合赋值操作符作用于byte、short或char类型的变量。

因为S1是short型的,占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,会发生自动类型的提升。也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,把4个字节的东西放在两个字节的空间里,肯定编译不通过。 后面的那个不会发生类型的提升,JAVA规范上说 e1+=e2 实际上是 e1=(T1)(e1+e2),其中T1是e1的数据类型。 s1+=1等效于 s1=(short)(s1+1),所以是正确的。

问题8:简述synchronized和java.util.concurrent.locks.Lock的异同?
答:主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

问题9:重写(override)和重载(overload)的区别?

答:1.方法的重写要遵循“两同两小一大”规则“两同”方法名相同、形参列表相同“两小”指子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常应比父类方法声明抛出的异常类更小或相等。“一大”指的是子类方法的访问权限应比父类方法更大或相等,尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。

当子类覆盖了父类的方法后,子类的对象将无法访问父类中被覆盖的方法,但可以在子类方法中调用父类中被覆盖的方法。
(1)如果要在子类中调用父类中被覆盖的实例方法,可以使用super。
(2)如果要在子类中调用父类中被覆盖的类方法,使用父类类名来调用。

2.方法的重写与方法的重载不同,方法的重载要遵循“两同,一个不同”规则“两同”即同一个类中、方法名相同,一个不同”即形参列表不同。Java允许同一个类里定义多个同名的方法,只要形参列表不同即可。 如果同一个类中包含了两个或两个以上的方法名相同,但参数列表不同,则被称为方法重载。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。


问题10:GC是什么?常用的两种方法是什么?
(1)GC是垃圾收集的意思(Garbage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
(2)答案:System.gc()用来强制立即回收垃圾,即释放内存。
java对内存的释放采取的垃圾自动回收机制,在编程的时候不用考虑变量不用时释放内存,java虚拟机可以自动判断出并收集到垃圾,但一般不会立即释放它们的内存空间,当然也可以在程序中使用System.gc()来强制垃圾回收,但是要注意的是,系统并不保证会立即进行释放内存.
gc首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。
问题11:sleep()和wait()的区别?

答:wait()导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或者notifyAll()方法来唤醒该线程。调用wait()方法的当前线程会释放对同步监视器的锁定。当前线程调用sleep()方法进入阻塞状态后,在其sleep()时间段内,该线程不会获得执行的机会,即使系统中没有其他可运行的线程,处于sleep的线程也不会运行,因此sleep()方法常用来暂停程序的执行。


问题12:&和&&的区别?

答:&是不短路的,&&是会短路的,其他的一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值