Java基础题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础题相关的知识,希望对你有一定的参考价值。

1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

答:可以包括多个类;限制:一个文件只能有一个public类,且与文件名同名。

 

2、Java有没有goto?

答:没有。

 

3、说说&和&&的区别。

答:两者都是(and)逻辑运算符,&是非短路,&&是短路的。

 

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

答:1.return 2.循环语句定义一个标签,再使用带有标签的break语句。

 

5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

答:switch语句作用一个整数表达式或枚举常量,byte,short,char能隐式转换成int,byte可以作用,long不可以,在JDK7之前String不支持,JDK7后可以。

 

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

答:加运算隐式转成int型,与short不符。

 

7、char型变量中能不能存贮一个中文汉字?为什么?

答:可以。char占2个字节,java默认使用的16位Unicode编码一个码占2个字节,中文和英文都是由Unicode码表示,所以char可以存储。

 

8、用最有效率的方法算出2乘以8等于几?

答:2<<3。

 

9、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

答:引用的变量不能改变,引用变量所指的对象可以改变。

 

10、"=="和equals方法究竟有什么区别?

答:“==”是比较引用地址,equals比较具体的值。

 

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

答:静态变量属于类,所有对象可以共享。实例变量属于对象,必须实例化才能使用。

 

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

答:不可以。非static方法属于对象,必须创建一个对象才能调用,而static方法不需要创建对象可以直接调用。

 

13、Integer与int的区别。

答:Integer是高级类型,int是基本类型。Integer是int的封装类。Integer的默认值为null,int的默认值为0。

 

14、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:Math类中ceil是向上取整,floor是向下取整,round是+0.5再向下取整。所以(11.5)=12,(-11.5)=-11。

 

15、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

答:重载是重名不重参,重写是子类重新定义父类方法。重载与返回值无关,可以改变。

 

16、构造器Constructor是否可被override?

答:不能被继承,因此不能被重写,但可以重载。

 

17、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?

答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承具体类,抽象类中可以有静态方法。

 

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

答:clone有缺省行为,super.clone();因为要把父类复制到位才能复制自己的成员。

 

19、面向对象的特征有哪些方面?

答:1、封装:把数据跟过程隐藏起来,对数据的访问只能通过已定义的接口。

  2、继承:子类继承父类的所有方法和属性(不包括private)。

  3、多态:继承,重写,父类的引用指向子类对象。

 

20、java中实现多态的机制是什么?

答:父类的引用指向子类对象。

 

21、abstract class和interface有什么区别?

答:抽象类里可以有方法体,接口里没有方法体。抽象类可以包含静态方法,接口不可以。抽象类跟接口都可以有静态成员变量,抽象类的访问类型可以任意,接口只能用public static final类型。一个类可以实现多个接口,但只能继承一个抽象类,接口可以继承多个父类接口。接口类里必须都是接口,创建的属性必须赋值。实现抽象类和接口的类必须实现其所有方法。

 

22、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

答:不可以static,因为抽象方法要被子类实现,不能是native,不能是synchronized。

 

23、什么是内部类?Static Nested Class 和 Inner Class的不同。

答:内部类就是在一个类里定义一个类。内部类中不能定义静态变量(毫无意义,禁止),内部类可以访问外部类中的成员变量,内部类定义在方法体内时不能有访问类型修饰符,可以使用final或abstranct,这种内部类访问方法体的局部变量必须给变量前加final。静态内部类引用不需要外部类创建实例对象就可以直接创建,由于不依赖外部类实例对象,所以不能访问外部类非static成员变量,内部类与外部类相互引用不需要加上外部类名字,可以引用外部类的静态变量,访问静态方法的局部变量需要加上final。

 

24、内部类可以引用它的包含类的成员吗?有没有什么限制?

答:可以。静态只能引用静态,非静态能引用静态。

 

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

答:可以继承,可以实现。

 

26、String是最基本的数据类型吗?

答:不是,String是final类型。

 

27、String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

答:没有,String是不能被继承,不能被修改的。

 

28、String 和StringBuffer的区别?

答:String的字符串不能被修改,StringBuffer可以被修改。

  StringBuffer线程安全,性能差。

  StringBuilder线程非安全,性能好。

 

29、数组有没有length()这个方法? String有没有length()这个方法?

答:数组对象没有任何方法,只有length属性。String有length()方法,用来求字符串的长度。

 

30、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

答:会执行,return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

 

31、final, finally, finalize的区别。

答:final声明属性、方法和类,属性不能被改变,方法不能被覆盖,类不能被继承。

  finally是处理异常语句的部分,表示总是执行。

  finalize是Object类的一个方法,在垃圾回收器执行时会调用被回收对象的次方法。

 

32、运行时异常与一般异常有何异同?

答:运行时异常表示虚拟机的通常操作可能出现的异常,java编译器抛出的是可能发生的非运行时异常,不要求必须声明抛出未被捕获的运行时异常。

 

33、error和exception有什么区别?

答:error表示系统级的错误和程序不必处理的异常。exception表示需要捕捉或需要程序进行处理的异常,它是由程序设计引起的问题。

 

34、Java中的异常处理机制的简单原理和应用。

答:当java程序违反了java语义规则时,就会发生错误抛出异常。违反语义规则有2种:1是java类库内置的语义检查,2是程序员扩展这种语义检查,创建自己的异常并选择在何时用throw引发异常。

 

35、请写出你最常见到的5个runtime exception。

答:1、NullPointerException 

  2、ArrayIndexOutOfBoundsException

  3、ArithmeticException

  4、ClassCastException

  5、NumberFormatException

 

36、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

答:throws是获取异常。

  throw是抛出异常。

  try是将会发生异常的语句括起来,从而进行异常处理,也可以在try中抛出新的异常。

  catch是有异常就会执行里面的语句。

  finally不论是否有异常都会执行。

 

37、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

答:3种:继承Thread,实现Runnable接口,实现Callable接口。

  用synchronized同步。

  stop不安全,suspend容易锁死。

 

38、sleep() 和 wait() 有什么区别?

答:sleep属于Thread类,不会释放锁。wait属于Object类,在休眠时会释放锁,在锁定块中使用。

 

39、同步和异步有何异同,在什么情况下分别使用他们?举例说明。

答:同步:某一临界资源某一时刻只能有一个线程访问。

  异步:同时做几件事情。

 

40、启动一个线程是用run()还是start()?

答:start()方法是启动(即开辟)一个线程的方法,因此线程的启动必须通过此方法, 
  而run()方法,只是Thread类的一个方法,它本身并不能开辟线程。

 

41、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

答:分几种情况:
     1.其他方法前是否加了synchronized关键字,如果没加,则能。
     2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
     3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
     4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。

 

42、线程的基本概念、线程的基本状态以及状态之间的关系。

答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

  状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。

  调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。

 

43、简述synchronized和java.util.concurrent.locks.Lock的异同?

答:主要相同点:Lock能完成synchronized所实现的所有功能

  主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

 

44、介绍Collection框架的结构。

答:Collection 集合的意思(单列集合),子类有list和set。list有序重复,set无序不重复。list有ArrayList和LinkedList:ArrayList数组的存储方式,读取快,插入删除慢;LinkedList链表存储方式读取慢,插入删除快。set有HashSet和MapSet:HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key。

 

45、Collection框架中实现比较要实现什么接口?

答:comparable/comparator。

 

46、ArrayList和Vector的区别?

答:都实现了list接口,都是有序的。ArrayList线程不安全,Vector线程安全。数据增长:Vector增长原来的一倍,ArrayList增加原来的0.5倍。

 

47、HashMap和Hashtable的区别?

答:HashMap线程不安全,Hashtable线程安全。

 

48、List 和 Map 区别?

答:List是有序的,可以重复。Map是无序的,key不能重复,value可以重复。

 

49、List, Set, Map是否继承自Collection接口?

答:List,Set是,Map不是。

 

50、List、Map、Set三个接口,存取元素时,各有什么特点?

答:List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

 

51、说出ArrayList,Vector, LinkedList的存储性能和特性。

答:ArrayList和Vector都是使用数组方式存储数据,LinkedList使用双向链表实现存储。

  Vector由于使用了synchronized方法(线程安全),ArrayList线程不安全,LinkedList也是线程不安全的。

 

52、Collection 和 Collections的区别。

答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List.

  Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

 

53、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别

答:Set里的元素是不能重复的,元素重复与否是使用equals()方法进行判断的。equals()和==方法决定引用值是否指向同一对象。

 

54、你所知道的集合类都有哪些?主要方法?

答:List 和 Map。

  List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,Map 集合类用于存储元素对(称作"键"和"值")。

 

55、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

答:对。

  如果对象要保存在HashSet或HashMap中,它们的equals相等,那么,它们的hashcode值就必须相等。

  如果不是要保存在HashSet或HashMap,则与hashcode没有什么关系了,这时候hashcode不等是可以的,例如arrayList存储的对象就不用实现hashcode,当然,我们没有理由不实现,通常都会去实现的。

 

56、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

答:当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法。

 

57、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

答:字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。

 

58、字节流与字符流的区别?

答:字符流是字节流的包装,字符流是直接接受字符串,它内部将串转成字节,再写入底层设备。

 

59、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。

答:序列化就是用来将对象进行流化来读写、传输操作的机制。将要被序列化的类实现Serializable接口。实现接口会进行特殊处理,编译的类才可以被writeObject方法操作。

 

60、描述一下JVM加载class文件的原理机制?

答:JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

 

61、heap和stack有什么区别。

答:1、heap是堆,stack是栈。2、stack的空间操作是系统自动分配和释放的,heap是new来分配。3、stack空间有限,heap空间大。

 

62、GC是什么? 为什么要有GC?

答:垃圾回收,可以达到自动回收垃圾的功能。

 

63、垃圾回收的优点和原理。并考虑2种回收机制。

答:垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。

  垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清理和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

  回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

 

64、什么时候用assert?

答:assertion检查通常在开发和测试时开启。它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。

 

65、java中会存在内存泄漏吗,请简单描述

答:会。java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。

 

66、能不能自己写个类,也叫java.lang.String?

答:可以。但在应用的时候,需要用自己的类加载器去加载。

 

 


 











以上是关于Java基础题的主要内容,如果未能解决你的问题,请参考以下文章

Java工程师面试题,二级java刷题软件

Java进阶之光!2021必看-Java高级面试题总结

Java语言基础之方法的设计

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

JSP基础

java面试题及答案(基础题122道,代码题19道)(转)