Java充电站:面试必知的15道Java数据类型题
1、Java 的基本数据类型都有哪些各占几个字节?
2、String 是最基本的数据类型吗?
不是,String是引用类型,底层是用char数组实现的。
Java 中的基本数据类型只有8 个:
byte
、short
、int
、long
、float
、double
、char
、boolean
;除了基本类型(primitive type),剩下的都是引用类型(referencetype), Java 5 以后引入的枚举类型也算是一种比较特殊的引用类型。
3、运行short s1 = 1, s1 = s1 + 1 ;会出现什么结果?运行short s1 = 1; s1 += 1 ;又会出现什么结果?
- 运行第一个会报错,因为1是
int
类型,而s是short
类型,通过+运算后s1自动转换成int
型。错误提示:Error:(21, 17) java: 不兼容的类型: 从int
转换到short
可能会有损失- 运行第二个是正确的,s1=2,+1是
int
类型的操作,s1自动转换int
类型
4、int 和Integer 有什么区别?
Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是Integer,从Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
- 原始类型: boolean, char, byte, short, int, long, float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
public class AutomaticUnboxing {
public static void main(String[] args) {
Integer a1 = 100,a2 = 100,z3 = 139, z4 =139;
System.out.println(a1 == a2); //true
System.out.println(z3 == z4); //false
}
}
如果整型字面量的值在-128 到127 之间,那么不会new 新的Integer对象,而是直接引用常量池中的Integer 对象
5、float f=3.4;是否正确?
不正确。3.4是双精度。将双精度型(double) 赋值给浮点型(float)属于下转型( down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换
float f =(float)3.4
; 或者写成float f =3.4F
;。
6、用最高效率的方法算出2 乘以8 等于多少。
移位运算符:
int i = 2 << 3
;
7、String 类常用方法
方法 | 描述 |
---|---|
int length() | 返回此字符串的长度 |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引 |
int indexOf(int ch, int fromIndex) | 返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索 |
int lastIndexOf(int ch) | 返回指定字符在此字符串中最后一次出现处的索引 |
String concat(String str) | 将指定字符串连接到此字符串的结尾。 |
boolean endsWith(String suffix) | 测试此字符串是否以指定的后缀结束。 |
String replace(char oldChar, char newChar) | 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
String[] split(String regex) | 根据给定正则表达式的匹配拆分此字符串。 |
String substring(int beginIndex) | 返回一个新的字符串,它是此字符串的一个子字符串 |
String trim() | 返回字符串的副本,忽略前导空白和尾部空白 |
boolean equals(Object anObject) | 将此字符串与指定的对象比较。 |
8、String 、 StringBuffer 、 StringBuilder 的区别?
1、可变与不可变
String:字符串常量,在修改时不改变自身;若修改,等于生成新的字符串对象
StringBuffer:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对象;使用场景:对字符串经常改变情况下,主要方法: append insert ()等。
2、线程是否安全
String:对象定义后不可变,线程安全。
StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区大量数据。
StringBuilder :是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。
3、共同点
StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
StringBuilder、StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如 super.append(…)。只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用StringBuilder 效率高于StringBuffer。
对于三者使用的总结
-
如果要操作少量的数据用 = String
-
单线程操作字符串缓冲区下操作大量数据 = StringBuilder
-
多线程操作字符串缓冲区下操作大量数据 = StringBuffer
9、 while 和do while 有什么区别?
while是先判断再执行;do…while是先执行再判断,同等条件下,后者多执行了一次。
10、switch 语句能否作用在byte 、long 、String 上?
- 可以用在
byte、int、short、char
以及它们的封装类上- 不能用在其他基本类型上
long、double、float、boolean
以及封装类- jdk1.7及以上,可以用以字符串
- 可以用于枚举类型
11、String s =new String("xyz");
,创建了几个String 对象?二者之间再什么区别。
创建了2个对象,一个是内存中的“xyz”,还有一个是s,指向xyz
12、自动装箱与拆箱
自动装箱:将基本类型用他们的引用类型包装起来
自动拆箱:将包装类型转换为基本类型
13、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。
14、下面代码运行结果是多少?
int count = 0;
for (int k = 0; k < 100; k++) {
count = count++;
}
System.out.println(count);
解析:++是先赋值,再自增,所以count永远是0
15、Java中基本类型是如何转换的?
基本类型等级从低到高:
- byte、short、int、long、float、double
- char、int、long、float、double
自动转换:运算过程中,低级可以自动向高级进行转换
强制转换:高级需要强制转换成低级,可能会丢失精度
规则:
- = 右边先自动转换成表达式中最高级的数据类型,再进行运算。整型经过运算会自动转化最低 int 级别,如两个 char 类型的相加,得到的是一个 int 类型的数值。
- = 左边数据类型级别 大于 右边数据类型级别,右边会自动升级
- = 左边数据类型级别 小于 右边数据类型级别,需要强制转换右边数据类型
- char 与 short,char 与 byte 之间需要强转,因为 char 是无符号类型