面试题Java必备.docx

上传人:b****8 文档编号:30067561 上传时间:2023-08-04 格式:DOCX 页数:71 大小:79.66KB
下载 相关 举报
面试题Java必备.docx_第1页
第1页 / 共71页
面试题Java必备.docx_第2页
第2页 / 共71页
面试题Java必备.docx_第3页
第3页 / 共71页
面试题Java必备.docx_第4页
第4页 / 共71页
面试题Java必备.docx_第5页
第5页 / 共71页
点击查看更多>>
下载资源
资源描述

面试题Java必备.docx

《面试题Java必备.docx》由会员分享,可在线阅读,更多相关《面试题Java必备.docx(71页珍藏版)》请在冰豆网上搜索。

面试题Java必备.docx

面试题Java必备

Java基础方面

基础部分的顺序:

基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法.

1.作用域public,private,protected,以及不写时的区别

作用域          当前类      同一package 子孙类      其他package

public           √             √                 √            √

protected       √             √                 √            ×

friendly         √             √                  ×           ×

private          √             ×                  ×           ×不写时默认为friendly

2.AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)

答:

匿名的内部类是没有名字的内部类.不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现

3.StaticNestedClass和InnerClass的不同

答:

NestedClass(一般是C++的说法),InnerClass(一般是JAVA的说法).Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上.注:

静态内部类(InnerClass)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象

4.&和&&的区别

&和&&都可以用作逻辑与的运算符,表示逻辑与(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位,例如,0x31&0x0f的结果为0x01.

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

在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环.例如,

for(inti=0;i<10;i++)

{for(intj=0;j<10;j++)

{System.out.println(“i=”+i+“,j=”+j);if(j==5)breakok;}}

另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字.

intarr[][]={{1,2,3},{4,5,6,7},{9}};

booleanfound=false;

for(inti=0;i

found;i++)

{for(intj=0;j

if(arr[i][j]==5){found=true;break;}}}

6.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的.显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中.

7.请设计一个一百亿的计算器

要实现一个一百亿的计算器,我们得自己设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大概功能如下:

(1)这个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数

(2)有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中

(3)提供加减乘除的功能

publicclassBigInteger{intsign;byte[]val;

publicBiginteger(Stringval){sign=;val=;}

publicBigIntegeradd(BigIntegerother){}

publicBigIntegersubtract(BigIntegerother){}

publicBigIntegermultiply(BigIntegerother){}

publicBigIntegerdivide(BigIntegerother){}}

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

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的.例如,对于如下语句:

final StringBuffer a=new StringBuffer("immutable");

执行如下语句将报告编译期错误:

a=new StringBuffer("");

但是,执行如下语句则可以通过编译:

a.append(" broken!

"); 

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

publicvoidmethod(finalStringBufferparam){}

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

param.append("a");

9."=="和equals方法究竟有什么区别?

(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)

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

如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objetobj=newObject();变量obj是一个内存,newObject()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址.对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较.

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的.例如,对于下面的代码:

String a=new String("foo");String b=new String("foo");

两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true.

在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,Stringinput=…;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,记住,字符串的比较基本上都是使用equals方法.

如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:

boolean equals(Object o){return this==o;}

这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false.如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的.

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

在语法定义上的区别:

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

在程序运行时的区别:

实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量.静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了.总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用.

例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次.

publicclassVariantTest

{publicstaticintstaticVar=0;

publicintinstanceVar=0;

publicVariantTest()

{staticVar++;instanceVar++;

System.out.println(“staticVar=”+staticVar+”,instanceVar=”+instanceVar);}}

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

不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用.也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?

这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用.

12.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层的表单数据的类型.

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

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

13.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.

编程:

1编写一个函数将一个十六进制数的字符串参数转换成整数返回.

Stringstr=“13abf”;intlen=str.length;intsum=0;

for(inti=0;i

intn=Character.digit(c,16);sum+=n*(1<<(4*i));}其实,也可以用Integer.parseInt(str,16)

编程:

2银行贷款的还款方式中最常用的是一种叫“等额本息”,还款法,即借款人在约定还款期限内的每一期(月)归还的金额(产生的利息+部分本金)都是相等的,现有一笔总额为T元的N年期住房贷款,年利率为R,要求算出每一期的还款的本金和利息总额,请写出解决思路和任意一种编程语言实现的主要代码.

思路:

既然是按月还款,那我就要将N年按月来计算,即要还N*12个月,这样就可以求出每月要还的本金.由于每月要还的那部分本金所欠的时间不同,所以,它们所产生的利息是不同的,该部分本金的利息为:

部分本金额*所欠月数*月利率.应该是这么个算法,如果利息还计利息,如果月还款不按年利率来算,老百姓算不明白的.

intmonthMoney=T/N/12;floatmonthRate=R/12;

inttotalMonth=N*12;floattotalRate=0;

for(inti=1;i<=totalMonth;i++){totalRate+=monthMoney*monthRate*i;}

intresult=monthMoney+totalRate/N/12;

编程:

3任意数字序列“123456”之类,输出它们所有的排列组合

Stringstr=“xafdvs”;

char[]arr1=str.toCharArray();

char[]arr2=Arrays.copyOf(arr1,arr1.length);

for(inti=0;i

{for(intj=i+1;j

arr1[i]+“,”+arr2[j];}}

14.Collection和Collections的区别

答:

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

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

15.什么时候用assert

答:

assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制.在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出.一般来说,assertion用于保证程序最基本.关键的正确性.assertion检查通常在开发和测试时开启.为了提高性能,在软件发布后,assertion检查通常是关闭的

16.Strings=newString("xyz");创建了几个StringObject

答:

两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个.NewString每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象.如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿.

17.Math.round(11.5)等於多少?

Math.round(-11.5)等於多少

答:

 Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回与参数最接近的长整数,参数加1/2后求其floor

18.shorts1=1;s1=s1+1;有什么错?

shorts1=1;s1+=1;有什么错

对于shorts1=1;s1=s1+1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误.

对于shorts1=1;s1+=1;由于+=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译.

19.Java有没有goto?

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

20.数组有没有length()这个方法?

String有没有length()这个方法

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

21.Overload和Override的区别.Overloaded的方法是否可以改变返回值的类型

方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了.如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading).Overloaded的方法是可以改变返回值的类型

Overload是重载的意思,Override是覆盖的意思,也就是重写.

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同).

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

override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用.对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法.除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法.在覆盖要注意以下的几点:

1.覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

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

3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

4.被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖.

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行.在使用重载要注意以下的几点:

1.在使用重载时只能通过不同的参数样式.例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

2.不能通过访问权限.返回类型.抛出的异常进行重载;

3.方法的异常类型和数目不会对重载造成影响;

4.对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果.

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

是用==还是equals()?

它们有何区别?

答:

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否.equals()是判读两个Set是否相等

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

23.给我一个你最常见到的runtimeexception

常见的运行时异常有如下这些ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

24.

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

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1