Java核心面试题.docx

上传人:b****2 文档编号:491485 上传时间:2023-04-29 格式:DOCX 页数:40 大小:118.01KB
下载 相关 举报
Java核心面试题.docx_第1页
第1页 / 共40页
Java核心面试题.docx_第2页
第2页 / 共40页
Java核心面试题.docx_第3页
第3页 / 共40页
Java核心面试题.docx_第4页
第4页 / 共40页
Java核心面试题.docx_第5页
第5页 / 共40页
Java核心面试题.docx_第6页
第6页 / 共40页
Java核心面试题.docx_第7页
第7页 / 共40页
Java核心面试题.docx_第8页
第8页 / 共40页
Java核心面试题.docx_第9页
第9页 / 共40页
Java核心面试题.docx_第10页
第10页 / 共40页
Java核心面试题.docx_第11页
第11页 / 共40页
Java核心面试题.docx_第12页
第12页 / 共40页
Java核心面试题.docx_第13页
第13页 / 共40页
Java核心面试题.docx_第14页
第14页 / 共40页
Java核心面试题.docx_第15页
第15页 / 共40页
Java核心面试题.docx_第16页
第16页 / 共40页
Java核心面试题.docx_第17页
第17页 / 共40页
Java核心面试题.docx_第18页
第18页 / 共40页
Java核心面试题.docx_第19页
第19页 / 共40页
Java核心面试题.docx_第20页
第20页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Java核心面试题.docx

《Java核心面试题.docx》由会员分享,可在线阅读,更多相关《Java核心面试题.docx(40页珍藏版)》请在冰点文库上搜索。

Java核心面试题.docx

Java核心面试题

简答题

Java核心

1.基本语法

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

有什么限制

答:

可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一

致。

2、Java有没有goto?

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

3、八种基本数据类型和包装类以及大小。

八种基本数据类型包装类大小

byteByte8位-2^7~2^7-1

shortShort16位-2^15~2^15-1

intInteger32位-2^31~2^31-1

longLong64位-2^63~2^63-1

floatFloat32位-2^31~2^31-1

doubleDouble64位-2^63~2^63-1

charCharacter16位\u0000~\uFFFF

booleanBoolean1位

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

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str!

=null&&!

str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31&

0x0f的结果为0x01。

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

2<<3,

因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2<<3。

6.能被Switch的数据类型有哪些?

在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量,

所以能被Switch的数据类型有:

byte,short,int,char。

在jdk1.7之后String也可以。

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

为什么?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,unicode编码占用两个字节,所以char类型的变量也是占用两个字节。

一个char类型的大小为16位也就是两个字节所以能存储一个汉字

2.面向对象

8、Overload和Override(OverWrite)有什么区别?

Overload的方法是否可以改变返回值的类型?

1)重载Overload是方法的重载,表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同,这些不同包括位置不同,个数不同,类型不同。

2)重写Override是方法的重写,表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

3)Override子类覆盖父类的方法时,只能比父类抛出更少的异常和更小的异常,或者抛出父类抛出的异常的子异常。

子类方法的访问权限只能和父类相同或者比父类的更大,不能更小。

如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

覆盖的方法的返回值必须和被覆盖的方法的返回一致;

4)Overload与返回值类型和修饰符以及异常无关只要方法名相同形式参数不同即为重载。

9、成员变量(全局变量)和局部变量的区别?

1,定义的位置。

局部变量定义在函数中,语句内。

成员变量定义在类中。

2,内存中的位置。

局部变量存储在栈内存中。

成员变量存储在堆内存中。

3,初始化值。

局部变量没有默认初始化值,必须赋值才可以使用。

成员变量有默认初始化值。

4,生命周期。

局部变量一旦作用区域结束,就立刻释放。

成员变量也称为实例(对象)变量,随着对象的出现而出现。

随着对象的被回收而释放。

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

在语法定义上的区别:

静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:

实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。

静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。

总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

1,生命周期。

成员变量又叫实例变量,是随着对象的出现而出现,随着对象的消失而消失。

静态变量又叫类变量,是随着类的加载而出现,随着类的消失而消失。

2,内存中的存储位置。

成员变量存在在堆内存的对象中。

静态变量存储在方法区的静态区中。

3,存储的数据特点。

成员变量存储的数据是对象的特有数据。

静态变量存储的数据是对象的共享数据。

4,调用方式。

成员变量,只能被对象所调用。

静态变量,能被对象调用,也可以被类名调用

11、请说出作用域public,private,protected,以及不写时的区别

说明:

如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。

12、构造器Constructor能否被继承?

是否可被override?

能否被overload?

构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。

13、final,finally,finalize的区别

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

内部类要访问局部变量,局部变量必须定义成final类型。

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

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

JVM不保证此方法总被调用。

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

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。

参见笔试题第十二题

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

不可以。

因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。

也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?

这个逻辑无法成立,所以,一个static方法内部不能对非static方法的调用。

16、接口是否可继承接口?

抽象类是否可实现(implements)接口?

抽象类是否可

继承具体类(concreteclass)?

抽象类中是否可以有静态的main方法?

接口可以继承接口。

抽象类可以实现(implements)接口,抽象类可以继承具体类。

抽象类中可以有静态的main方法。

17、abstractclass(抽象类)和interface(接口)有什么区别?

抽象类:

(1)含有abstract修饰符的类即为抽象类,abstract类不能创建的实例对象换句话说就是不能被new。

(2)包含有abstract方法的类必须定义为抽象类,抽象类中的可以有普通方法。

(3)抽象类的子类必须全部覆盖该抽象类的所有的抽象方法,所以,不能有抽象构造方法或抽象静态方法。

如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

(4)Abstract能修饰类,修饰方法,不能修饰属性

接口:

(1)接口(interface)可以说成是抽象类的一种特例,接口为更为纯粹的抽象类,不能有任何方法的实现,只能有方法的声明。

(2)接口中的方法定义默认为publicabstract类型,接口中的成员变量类型默认为publicstaticfinal。

(3)实现类必须实现所有接口中的全部方法声明;(4)接口中没有构造函数,即接口没有对象;(5)接口是多实现,即一个类可以实现多个接口,中间用逗号隔开;

两者比较语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4.抽象类中可以包含静态方法,接口中不能包含静态方法

5.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是publicstaticfinal类型,并且默认即为publicstaticfinal类型。

6.一个类可以实现多个接口,但只能继承一个抽象类。

两者在应用上的区别:

接口更多的是在系统架构设计方法发挥作用,接口是用来定义规范的。

主要用于定义模块之间的通信契约。

而抽象类在代码实现方面发挥作用,可以实现代码的重用,实现了一种价值叫模版策略。

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

多态可分为:

1.编译多态:

主要是体现在重载,系统在编译时就能确定调用重载函数的哪个版本。

2.运行多态:

主要体现在OO设计的继承性上,子类的对象也是父类的对象,即上溯造型,所以子类对象可以作为父类对象使用,父类的对象变量可以指向子类对象。

因此通过一个父类发出的方法调用可能执行的是方法在父类中的实现,也可能是某个子类中的实现,它是由运行时刻具体的对象类型决定的。

靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

19、什么是内部类?

StaticNestedClass和InnerClass的不同

(1)内部类就是在一个类的内部定义的类,内部类分为静态内部类,非静态内部类,局部内部类和匿名内部类。

(2)非静态内部类可以无条件访问外部类的成员,不可以和自己的外部类重名但是可以与外部类平级同包的类重名,非静态内部类不能有static修饰的变量,

(3)静态内部类不能访问外部类的非静态属性,外部类也不能访问静态内部类的成员,但是可以使用静态内部类的类名作为调用者使用。

(4)内部类可以通过new外部类().new内部类()进行实例化Innerin=newOuter().newInner();

内部类可以被其他类继承继续它的类需要写一个构造方法并且手工调用外部类.super();

publicclassSubClassextendsOut.In{

publicSubClass(Outout){

out.super();

}

}

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

 

21、Integer与int的区别

(1)int是java提供的8种原始数据类型之一。

Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。

int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。

(2)在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

(3)在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。

(4)另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。

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

必须实现Cloneable接口重写clone方法

protectedObjectclone()throwsCloneNotSupportedException{

returnsuper.clone();

}

23、是否可以继承String类?

String类是final修饰的。

因此不可以继承这个类、不能修改这个类。

为了提高效率节省空间,我们应该用StringBuffer类

24、Strings="Hello";s=s+"world!

";这两行代码执行后,原始的String对象中的内容到底变了没有?

没有。

因为String被设计成不可变类,所以它的所有对象都是不可变对象。

在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Helloworld!

",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

25、Strings=newString("xyz");创建了几个StringObject?

二者之间有什么区别?

两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。

NewString每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。

如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。

3.集合相关

26、String和StringBuffer、StringBuilder的区别

(1)String和StringBuffer、StringBuilder它们可以储存和操作字符串,即包含多个字符的字符数据。

String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM的GC就会开始工作,那速度是一定会相当慢的。

如果是使用StringBuffer类则结果就不一样了,每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用

(2)StringBuffer和StringBuilder中StringBuffer是线程安全的StringBuilder是线程不安全的,三者之间执行的速度是StringBuilder>StringBuffer>String;

(3)另外,String实现了equals方法,newString(“abc”).equals(newString(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以newStringBuffer(“abc”).equals(newStringBuffer(“abc”)的结果为false。

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

String有没有length()这个方法?

数组没有length()这个方法,有length的属性。

String有有length()这个方法。

28、介绍Collection框架的结构

可以更详细的叙述每个集合。

29、ArrayList和Vector和LinkedList的区别?

1)ArrayList和Vector底层实现是基于数组的实现而LinkedList底层实现是基于链表的实现。

2)ArrayList和Vector实现了List接口(List继承于Collection接口)、而LinkedList除了实现了List接口以外还实现了Deque接口。

3)他们都是有序集合,即存储在集合中的元素的位置都是有顺序的,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的。

4)从同步性来说Vector是属于线程安全的而ArrayList和LinkedList不是线程安全的

5)从效率来说ArrayList和Vector底层属于数组查找修改速度快增加删除效率慢

LinkedList底层是链表所以增删比较快查改慢

6)(这个可以选择回答)从数据增长来说:

ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时。

在jdk1.7中ArrayList底层实现增长的方式是intnewCapacity=oldCapacity+(oldCapacity>>1);Vector实现增长的方式是intnewCapacity=oldCapacity+((capacityIncrement>0)?

capacityIncrement:

oldCapacity);

30、HashMap和Hashtable的区别

1)继承不同。

publicclassHashtableextendsDictionaryimplementsMap

publicclassHashMapextendsAbstractMapimplementsMap

2)Hashtable中的方法是同步的(线程安全的),而HashMap中的方法在缺省情况下是非同步的(线程不安全的)。

在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了

3)Hashtable不允许使用null作为key和value,否则会引发空指针异常,HashMap允许空(null)作为键值(key)和Value,但最多只能有一项key-value中key为null,但是key-value中可以有多个value为null

31、Collection和Collections的区别

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

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

32、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?

是用==还是equals()?

它们有何区别?

Set里的元素是不能重复的,元素重复与否是使用equals()方法进行判断的。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

33、象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?

对。

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

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

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

当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前这个对象的类中是如何编写这个方法的。

publicclassParentimplementsComparable{

privateintage=0;

publicParent(intage){

this.age=age;

}

publicintcompareTo(Objecto){

System.out.println("methodofparent");

Parento1=(Parent)o;

returnage>o1.age?

1:

age

-1:

0;

}

}

 

publicclassChildextendsParent{

publicChild(){

super(3);

}

publicintcompareTo(Objecto){

System.out.println("methodofchild");

return1;

}

}

publicclassTreeSetTest{

publicstaticvoidmain(String[]args){

TreeSetset=newTreeSet();

set.add(newParent(3));

set.add(newChild());

set.add(newParent(4));

System.out.println(set.size());

}

}

执行结果:

methodofparent

methodofchild

methodofparent

methodofparent

3

4.异常相关

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

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。

java编译器要求方法必须声明抛出可能发生的非运行时异常或者捕获,但是并不要求必须声明抛出未被捕获的运行时异常。

36、error和exception有什么区别?

error表示恢复不是不可能但很困难的情况下的一种严重问题。

是java运行环境中的内部错误或者硬件问题。

比如:

内存资源不足等。

对于这种错误,程序基本无能为力比如说内存溢出。

exception表示一种设计或实现问题。

它处理的是因为程序设

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2