Java面试题---Java基础(一)

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

        可以有多个类,但是只能有一个(public)修饰的类,并且类名必须与文件名一致。

2、Java中有没有goto?

        在C/C++中,goto常被用于跳出多重循环。但goto 语句的使用往往会使程序的可读性降低,所以 Java 不允许 goto 跳转。实际上,自从“goto有害论”提出后,软件开发就不建议使用goto了,但是Java中依然保留了goto这个关键字留作备用,但这个关键字没有任何作用,只是为了将来可能的扩展,防止使用goto作为程序中的标识符。
        类似地,Java中的const也只是一个不起作用的保留关键字(不具备C语言中定义常量的作用,Java中要想定义常量使用final关键字),与goto一样防止作为程序中的标识符。

3、&和&&的区别

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

&&还具有短路的功能,如果第一个表达式的结果为false,则不再计算第二个表达式,例如,对于if(str!=null && str.equals(""))表达式,当str为null时,后面的表达式不会执行,所以不会出现空指针异常,如果将&&改为&,则会抛空指针异常。if(x==33&++y>0)y会增长,if(x==33&&++y>0)不会增长

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

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

在switch(expr)中,expr可以是一个整数表达式或者枚举常量,整数表达式可以是int基本类型或Integer的包装类型,因为byte,short,char都可以隐式转换为int,所以这些类型以及包装类也可以。

Java5以前,switch(expr)中,expr只能为byte,short,int,char类型;

Java5以后,Java中引入了枚举类型,expr也可以为enum类型;

从Java7开始,expr也可以是String类型,但是long长整型在目前所有的版本中都是不支持的。

5、a=a+b和a+=b有何区别?

+=操作符会进行隐式自动类型转换,将右边的数据类型强转匹配左边的数据类型。

6、char型变量能不能存储一个中文汉字,为什么?

char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字,所以char型变量可以存储汉字。如果某个特殊的汉字没有包含在Unicode字符集中,那么char型变量就不能存储这个汉字。另外,Unicode编码占两个字节,所以char型变量也占两个字节。

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

2<<3,因为将一个数字左移n位就是这个数乘以2的n次方,位运算CPU直接支持,效率最高。

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

使用final关键字修饰变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

9、“==”和equals的区别?

==操作符用来比较两个变量的值是否相等,也就是用来比较变量所对应的内存中存储的数值是否相等;

equals方法是用来比较两个独立的对象的内容是否相等,而如果一个类没有重写equals方法,则默认的equals方法就是使用==操作符比较两个对象指向的对象是否是同一个对象。

10、两个对象的值相同(x.equals(y)==true)但却有不同的hashcode,对不对?

不对,如果两个对象x和y满足x.equals(y)==true,他们的哈希码(hashcode)应该相同。

(1)如果两个对象相同(equals方法返回true),那么他们的哈希值一定相同;

(2)如果两个对象的哈希值相同,他们并不一定相同。

重写equals方法要满足以下几个性质:

(1)首先 equals 方法必须满足自反性(x.equals(x)必须返回 true) ;

(2)对称性(x.equals(y)返回 true 时,y.equals(x) 也必须返回true);

(3)传递性(x.equals(y)和 y.equals(z)都返回 true时,x.equals(z)也必须返回true);

(4)一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null 值的引用x, x.equals(nul)必须返回 false。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java面试题真的很多,下面我来回答一个有关多线程的问题。 在Java实现多线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。这两种方式有何区别? 继承Thread类的方式是直接定义一个类继承Thread,并重写它的run()方法。然后创建该类的对象,并调用对象的start()方法来启动线程。这种方式简单直接,但因为Java是单继承的,所以如果某个类已经继承了其他类,就不能再直接继承Thread类实现多线程。 实现Runnable接口的方式是定义一个类实现Runnable接口,并实现其唯一的抽象方法run()。然后创建Thread类的对象,将实现了Runnable的对象作为参数传递给Thread类的构造方法。最后调用Thread对象的start()方法来启动线程。这种方式灵活性更大,因为Java允许一个类实现多个接口,所以即使某个类已经继承了其他类,仍然可以通过实现Runnable接口来实现多线程。 另一个区别在于资源共享的问题。继承Thread类的方式,不管是数据还是方法,都是线程自己拥有的,不存在共享的情况。而实现Runnable接口的方式,多个线程可以共享同一个对象的数据和方法,因为多个线程共同操作的是同一个Runnable对象。 总结来说,继承Thread类方式简单直接,但只能通过单继承来实现多线程;实现Runnable接口方式更灵活,可以解决单继承的限制,并且多个线程可以共享同一个Runnable对象的数据和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值