java基础知识(一)

1、 switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String ?

switch expr1 )中, expr1 只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是 int 基本类型或 Integer 包装类型,

由于, byte,short,char 都可以隐含转换为 int ,所以,这些类型以及这些类型的包装类型也是可以的。显然, long String 类型都不符合 sitch 的语法规定,并且不能被隐式转换成 int 类型,所以,它们不能作用于 swtich 语句中。

 

2 short s1 = 1; s1 = s1 + 1; 有什么错 ? short s1 = 1; s1 += 1; 有什么错 ?

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

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

 

3 、请设计一个一百亿的计算器

首先要明白这道题目的考查点是什么,一是大家首先要对计算机原理的底层细节要清楚、要知道加减法的位运算原理和知道计算机中的算术运算会发生越界的情况,二是要具备一定的面向对象的设计思想。

首先,计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一定的范围的,为了便于讲解和理解,我们先以 byte 类型的整数为例,它用 1 个字节进行存储,表示的最大数值范围为 -128 +127 -1 在内存中对应的二进制数据为 11111111 ,如果两个 -1 相加,不考虑 Java 运算时的类型提升,运算后会产生进位,二进制结果为 1,11111110 ,由于进位后超过了 byte 类型的存储空间,所以进位部分被舍弃,即最终的结果为 11111110 ,也就是 -2 ,这正好利用溢位的方式实现了负数的运算。 -128 在内存中对应的二进制数据为 10000000 ,如果两个 -128 相加,不考虑 Java 运算时的类型提升,运算后会产生进位,二进制结果为 1,00000000 ,由于进位后超过了 byte 类型的存储空间,所以进位部分被舍弃,即最终的结果为 00000000 ,也就是 0 ,这样的结果显然不是我们期望的,这说明计算机中的算术运算是会发生越界情况的,两个数值的运算结果不能超过计算机中的该类型的数值范围。 由于 Java 中涉及表达式运算时的类型自动提升,我们无法用 byte 类型来做演示这种问题和现象的实验,大家可以用下面一个使用整数做实验的例子程序体验一下:

           int a = Integer.MAX_VALUE;

           int b = Integer.MAX_VALUE;

           int sum = a + b;

           System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);

 

先不考虑 long 类型,由于 int 的正数范围为 2 31 次方,表示的最大数值约等于 2*1000*1000*1000 ,也就是 20 亿的大小,所以,要实现一个一百亿的计算器,我们得自己设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大概功能如下:

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

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

()提供加减乘除的功能

public class BigInteger

{

           int sign;

           byte[] val;

           public Biginteger(String val)

           {

                    sign = ;

                    val = ;

           }

           public BigInteger add(BigInteger other)

           {

                   

           }

           public BigInteger subtract(BigInteger other)

           {

                   

           }

           public BigInteger multiply(BigInteger other)

           {

                   

           }

           public BigInteger divide(BigInteger other)

           {

                   

           }

 

}

备注:要想写出这个类的完整代码,是非常复杂的,如果有兴趣的话,可以参看 jdk 中自带的 java.math.BigInteger 类的源码。面试的人也知道谁都不可能在短时间内写出这个类的完整代码的,他要的是你是否有这方面的概念和意识,他最重要的还是考查你的能力,所以,你不要因为自己无法写出完整的最终结果就放弃答这道题,你要做的就是你比别人写得多,证明你比别人强,你有这方面的思想意识就可以了,毕竟别人可能连题目的意思都看不懂,什么都没写,你要敢于答这道题,即使只答了一部分,那也与那些什么都不懂的人区别出来,拉开了距离,算是矮子中的高个,机会当然就属于你了。另外,答案中的框架代码也很重要,体现了一些面向对象设计的功底,特别是其中的方法命名很专业,用的英文单词很精准,这也是能力、经验、专业性、英语水平等多个方面的体现,会给人留下很好的印象,在编程能力和其他方面条件差不多的情况下,英语好除了可以使你获得更多机会外,薪水可以高出一千元。


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值