参考Java程序员面试笔试宝典:
目录
1.java提供哪些基本数据类型
8种原始数据类型:byte,short,int,long,float,double,char,boolean,在声明之后立刻在栈上分配内存空间;其他都是引用类型(类、接口、数组等),引用类型类似于C++中的引用或指针概念,以特殊的方式指向对象实体,声明时不会分配内存空间,只是存储了一个内存地址。
引申:
1.java中的null值是什么?在内存中null是什么?
null不是一个合法的Object实例,编译器没有为其分配内存,仅仅用于表明该引用目前没有指向任何对象。与C语言类似,null是将变量的值全部置为0.
2.如何理解赋值语句String x=null?
java中,变量分为 原始值 和 引用值 。原始类型的变量存储的是实际的值,引用类型的变量存储的是实际对象的地址(指针,引用)。对于此语句,定义了一个变量“x”,x中存放的是String引用,此处为null。
3.int和Integer有什么区别?
int是java语言的原始数据类型,Integer是java语言为int提供的封装类。Java为每个原始数据类型提供封装类。
4.赋值语句float f=3.4是否正确?
不正确。数据3.4默认double类型,将双精度类型赋值给float,造成精度损失,需要强转。float f=(float)3.4或float f=3.4F
2.什么是不可变类
当创建这个类的实例后,不允许修改它的值了,由点类似常量,只允许别的程序读,不允许修改。
java类库中,所有基本类型的包装类都是不可变类,如Integer、Float。还有String也是不可变类。
创建不可变类遵循原则:
1.所有成员变量用private修饰
2.类中只提供构造函数,一次生成,永不改变,没有setxxx等修改成员变量的方法
3.确保类中方法不会被子类覆盖,可用final修饰符
4.如果一个成员不是不可变量,在成员初始化或使用get方法获取值时,通过clone()方法确保类的不可变性
5.若有必要,使用覆盖Object类的equals()方法和hashCode()方法。
注意:由于类的不可变性,在创建对象时需要初始化所有成员变量,最好提供一个带参构造函数初始化
Java语言有很多不可变类,因为其具有使用简单、线程安全、节省内存等优点,也有缺点,不可变类的对象会因为值的不同产生新的对象,导致无法预料的问题。
3.值传递与引用传递有哪些区别
值传递:
方法调用时,实参把值传给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参值相同,但存储单元不同,形参的改变不会影响实参。
引用传递:
方法调用时,传递的是对象(也可看作对象的地址),这是形参和实参指向同一块存储单元,形参的改变会影响实参的值。
Java中,原始数据类型传递参数都是按值传递,包装类型传递参数是按引用传递。
4.不同数据类型的转换有哪些规则
当参与运算的两个变量数据类型不同时,需要进行隐式的数据类型转换,规则为从低精度向高精度转换,优先级满足byte<short<char<int<long<float<double,如short能够自动转为int,反之则需要强转。
java中,类型转换分为:
1)类型自动转换
低级数据类型自动转高级数据类型,其中注意:
1.char类型转高级类型,如int、long,会转换为其对应ASCII码值
2.byte、char、short参与运算会自动转为int,但使用“+=”运算,不会产生转换
3.基本数据类型不能与boolean类型转换
2)强制类型转换
高级数据类型转换为低级数据类型,需要强制类型转换,可能会损失精度。
5.强制类型转换的注意事项
short s1=1;s1=s1+1,由于运行时会将s1转换为int型,报错
正确写法:short s1=1;s1=(short)(s1+1)
有种例外,“+=”为java规定的运算法,编译器会特殊处理,也可写为short s1=1;s1+=1
6.运算符优先级
结合性从左向右
7.Math类中的round、ceil、floor方法
1)round方法表示四舍五入,实现原理在原来数字基础上加0.5再向下取整,等同于(int)Math.floor(x+0.5f),返回值int型
2)ceil方法表示向上取整,取大于参数的最小整数值,返回值double型,若正数,小数“入”,负数则“舍”
3)floor方法表示向下取整,取小于参数的最大整数值,返回值double型,若正数,小数“舍”,负数则“入”
8.如何实现无符号数的右移操作
“>>”有符号右移运算符,“>>>”无符号右移运算符,功能是将参与运算的对象对应的二进制数右移指定的位数。
“>>”:若参与运算的数字为正数,高位补0;若为负数,高位补1
“>>>”:参与运算无论正数负数,都高位补0
注意:char、byte、short移位操作时,自动转换为int,int只占4byte(32bit),当右移超过32bit,则移位无效。保证有效性,右移位数不超过32bit,采用取余操作。
a>>n等价于a>>(n%32)
引申:
"<<"运算符和“>>”运算符有何不同?
“<<”表示左移,左移n位表示原始值乘2的n次方,常用来代替乘法操作。如m乘16可表示为m<<4,CPU直接支持位运算,因此位运算比乘法运算效率高。
左移运算没有有符号和无符号,左移时,移除高位同时在低位补0
9.char类型是否可以存储一个中文汉字
java语言默认使用Unicode编码方式,每个字符占两个字节,可以用来存储中文。
英文占一个字符,中文占两个字符,可以减少所需存储空间,提高存储效率。
public class Test{
public static void getLen(String str){
System.out.println(str+" 的长度:"+str.length()+" 所占字节:"+str.getBytes().length);
}
public static void main(String[] args) {
String s1="hello";
String s2="你好";
getLen(s1);
getLen(s2);
}
}
结果:
hello 的长度:5 所占字节:5
你好 的长度:2 所占字节:6
书上最后的字节数是4,但我的确跑出来是6,不知道和编译器有没有关系,我用的idea2018.3
这种方法可以用来判断一个字符串中是否包含中文字。