09.int和Integer有什么區(qū)別
- int是基礎(chǔ)數(shù)據(jù)類型,字節(jié)長(zhǎng)度為4,它的創(chuàng)建不會(huì)在堆內(nèi)存中開(kāi)辟空間,一般保存在棧內(nèi)存里,可以用算術(shù)運(yùn)算符進(jìn)行加減乘除等操作。在參數(shù)傳遞的時(shí)候,直接傳遞它的值。
- Integer是int的包裝類,而本質(zhì)是一個(gè)類,它的創(chuàng)建會(huì)在堆內(nèi)存中開(kāi)辟一塊新的空間。它的含義也是表示一個(gè)整型的數(shù)字,但是,算術(shù)運(yùn)算符不能操作它。在參數(shù)傳遞的時(shí)候,傳遞的是它所代表的對(duì)象的一個(gè)引用。
10.如何用BigDecimal類進(jìn)行精確運(yùn)算
使用BigDecimal類來(lái)進(jìn)行精確的算術(shù)計(jì)算,也就是使用它所提供的一系列的API,主要分為以下步驟:
- 用float或double變量構(gòu)建BigDecimal對(duì)象
- 通過(guò)調(diào)用BigDecimal的加、減、乘、除等相應(yīng)的方法進(jìn)行算術(shù)運(yùn)算
- 把BigDecimal對(duì)象轉(zhuǎn)換成float、double、int等類型
- 一般來(lái)說(shuō),可以用BigDecimal的構(gòu)造方法或靜態(tài)的valueOf()方法把基本類型的變量或其字符串構(gòu)建成BigDecimal對(duì)象,例如下面的代碼:
BigDecimal v1 = new BigDecimal(Double.toString(0.05));
BigDecimal v2 = BigDecimal.valueOf(0.01); - 對(duì)于常用的加、減、乘、除運(yùn)算,BigDecimal提供了相應(yīng)的成員方法。它們都是把運(yùn)算的操作對(duì)象作為參數(shù)傳入,與自身進(jìn)行相應(yīng)的計(jì)算,并且返回計(jì)算后的值,代碼如下:
public BigDecimal add(BigDecimal augend) //加法
public BigDecimal subtract(BigDecimal augend) //減法
public BigDecimal multiply(BigDecimal augend) //乘法
public BigDecimal divide(BigDecimal augend) //除法 - 進(jìn)行相應(yīng)的計(jì)算以后,可能會(huì)需要將BigDecimal對(duì)象轉(zhuǎn)換成相應(yīng)的基本數(shù)據(jù)類型的變量,就可以調(diào)用floatValue()、doubleValue()等方法。以下是一段使用BigDecimal進(jìn)行運(yùn)算的示例代碼:
public class BigDecimalTest {
public static void main(String[] args){
System.out.println(add(0.05,0.01));
}
//提供精確加法計(jì)算的add方法
public static double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
}
11.Java可以用非0來(lái)代表true嗎
Java不能用非0代表true,也不能用0代表false,只能用布爾型的true和false來(lái)進(jìn)行條件判斷
12.字符串字面量是否自動(dòng)生成一個(gè)String對(duì)象
答案是肯定的。字符串類具有一定的特殊性,JVM在執(zhí)行雙引號(hào)操作符的時(shí)候,會(huì)自動(dòng)創(chuàng)建一個(gè)String對(duì)象,并返回這個(gè)對(duì)象的引用。
13.String、StringBuffer和StringBuilder的區(qū)別
String是不可變的,StringBuffer是可變的;StringBuffer是線程安全的,StringBuilder是非線程安全的。
因而在大部分情況下字符串的拼接速度為:StringBuilder > StringBuffer > String
解釋如下:
- String是不可變的(通過(guò)ide的debugger可以發(fā)現(xiàn)其屬性大都為final類型),因此每次對(duì)其操作改變其變量值,其實(shí)是生成一個(gè)新的對(duì)象,然后將變量引用指向新對(duì)象;因此速度慢。
- StringBuffer則不同,對(duì)其操作即直接操作對(duì)象指向的引用,無(wú)需產(chǎn)生新對(duì)象,速度很快;它是線程安全的,在維護(hù)多線程的同步等也會(huì)消耗一點(diǎn)性能。
- StringBuilder是jdk5之后新增的,其用法與StringBuffer完全一致,但它是線程不安全的,在單線程中最佳,因?yàn)槠洳恍枰S護(hù)線程的安全,因此是最快的。