short s1 = 1; s1 = s1 +1;有什么错?
short s1 = 1; s1 +=1;有什么错?
答:因为byte、 short、 int 不会互相转换,它们三者在计算时会转换成 int 类型。 而“+”是算术运算符,有算术运算符,就是已经在运算了,所以结果会转成int 类型。 如果把 int 类型的结果赋给 byte、short类型的结果,必须加上强制声明。 所以, 上面的第一个语句块,错在用“+”这个算术运算符运算后,结果变成了 int 型, 然后重新把计算结果赋给 short 型的变量时,没有强制声明值为 short的型的,所以会出错。 应该更改为: short s1 = 1; s1 = (short)s1 + 1; 而第二个语句块,s1 += 1; 不会出错,因为“+=”是赋值运算符,不牵涉与其它类型的数字计算,也不会转成 int 类型的,所以没错。
简单的理解:1例 使用简单赋值运算, 2例 使用复合赋值运算,而简单赋值运算和复合赋值运算的最大差别就在于:复合赋值运算符会自动地将运算结果转型为其左操作数的类型!switch是否能作用在byte上,是否能作用在long上,是否能作用在string上?
答:switch[expr1]中,expr1是一个证书表达式,因此传递给switch和case语句的参数应该是int、short、char或者byte。long、string不能作用在switch上。String、StringBuffer、StirngBuider的区别
答:
1.可变与不可变
String 有final修饰,是不可变的,且不能被继承
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下所示,可知这两种对象都是可变的。
char[] value;
2.String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:
public synchronized StringBuffer reverse() {
super.reverse();
return this;
}
public int indexOf(String str) {
return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法
}
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的
3.StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。
抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
4. 基本类型和封装类型的区别?
答:
基本类型:boolean、char、byte、shot、int、long、float、double
封装类型:Boolean、Character、Byte、Short、Integer、Long、Flot、Double、BigInteger、BigDecmail
其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算,BigInteger 支持任意精度的整数,
BigDecimal支持任意精度带小数点的运算。
1、在Java中,一切皆对象,但八大基本类型却不是对象。
2、声明方式的不同,基本类型无需通过new关键字来创建,而封装类型需new关键字。
3、存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中能高效的存取,封装类型需要通过引用指向实例,具体的实例保存在堆中。基本类型由于在堆栈中,效率会比较高,但是可能会存在内存泄漏的问题
4、初始值的不同,封装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0,boolean类型为false;
5、使用方式的不同,比如与集合类合作使用时只能使用包装类型。
6、基本数据类型只能按值传递,而封装类按引用传递。