1、StringBuffer类概述:线程安全的可变字符序列,一个类似于String的字符串缓冲区,但不能修改(不能像String那样用加号与其他类型数据连接),但通过某些方法调用可以改变该序列的长度和内容。java.lang包下,使用时不用导包。final修饰,不能有子类。
2、StringBuffer相当于一个容器。
3、StringBuffer是一个线程安全的可变字符序列 ,但需要同步,效率较低。
4、StringBuffer和String的区别:String是一个不可变的字符序列,StringBuffer是一个可变的字符序列 。
5、每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从JDK5开始,为该类补充了一个单个线程使用的等价类,即StringBuilder。与该类相比,通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度很快。
6、StringBuffer的构造方法:
public StringBuffer():无参构造方法。构造一个不带字符的字符串缓冲区,其初始容量为16个字符,初始容量即实际容量。
public StringBuffer(int capacity):构造一个不带字符,但具有指定容量的字符串缓冲区对象,实际容量给多少是多少。
public StringBuffer(String str):构造一个按指定字符串内容初始化的的字符串缓冲区对象,但不占初始容量,实际容量为字符串的length加上初始容量16。
7、StringBuffer的一般方法:
public int capacity():返回当前容量。调用capacity方法看容器的实际容量(理论值)。
public int length():返回长度(字符数)。调用length()方法看容器中的字符个数(实际值)。
8、StringBuffer在new的时候,是在堆内存创建了一个对象,底层是一个长度为16的字符数组。当调用添加的(append())方法时,不会再重新创建对象,而是在不断地向原缓冲区添加字符。
9、StringBuffer重写了toString方法,显示的是对象中的属性值。
10、StringBuffer的添加功能:
public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身。
public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身。如果没有指定位置的索引就会报索引越界异常。
11、StringBuffer的删除功能:
public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身。当缓冲区中这个索引没有元素的时候就会报StringIndexOutOfBoundsException。
public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身。删除时包含头不包含尾。
12、清空缓冲区:变量名.delete(0, 变量名.length()); 不要直接用创建对象的方式清空缓冲区,原来的对象会变成垃圾,浪费内存(原来的变量名 = new StringBuffer();)。
13、StringBuffer的替换功能:
public StringBuffer replace(int start,int end,String str):从start开始到end用str替换。
14、StringBuffer的反转功能:
public StringBuffer reverse():字符串反转。
15、StringBuffer的截取功能:
public String substring(int start):从指定位置截取到末尾。截取后产生新的字符串,用String记录。
public String substring(int start,int end):截取从指定位置开始到结束位置,包括开始位置,不包括结束位置。
16、注意:substring()的返回值类型不再是StringBuffer本身,而是一个String。创建String变量去接收返回值。
17、Alt + Shift + R改名。
18、String转换成StringBuffer:
ⅰ.通过StringBuffer的构造方法。直接在参数列表中添加字符串。相当于把字符串变成了StringBuffer对象。
ⅱ.通过StringBuffer的append()方法。通过append()方法将字符串转换为StringBuffer对象。
19、StringBuffer转换成String:
ⅰ.通过String的构造方法。
ⅱ.通过StringBuffer的toString()方法。最常用,直接调用,用String变量接收。
ⅲ.通过StringBuffer的subString(0,length); 通过截取此字符串。
20、把数组中的数据按照指定个格式拼接成一个字符串。String会不断产生垃圾,StringBuffer只会产生一个对象。
21、StringBuilder的概述:一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为大多数实现中,它比StringBuffer要快。
22、StringBuffer和StringBuilder的区别:
StringBuffer是jdk1.0版本的,是线程安全的,同步的,效率低。
StringBuilder是jdk1.5版本的,是线程不安全的,不同步的,效率高。
23、String和StringBuffer,StringBuilder的区别:
String是一个不可变的字符序列。
StringBuffer,StringBuilder是可变的字符序列。
24、写出方法名和参数列表,Ctrl+1直接创建方法。
25、基本数据类型的值传递,不改变其值。引用数据类型的值传递,改变其值。
26、String作为参数传递。String类虽然是引用数据类型,但是他作为参数传递时和基本数据类型是一样的。String类一旦初始化,其值就不会被改变。
27、StringBuffer作为参数传递。两个引用指向同一个对象,所以值会改变。
28、冒泡排序:轻的上浮,沉的下降。
两个相邻位置元素进行比较,如果前面的元素比后面的元素大就交换位置。第一轮结束,最大值出现在最大索引处,截取除最大索引的元素后重复比较交换的步骤,直到截取的只剩首个索引位置的元素。利用for的嵌套循环实现。
外循环次数根据比较次数,内循环次数根据外循环次数设定。一般外循环次数为数组长度-1,内循环次数为数组长度-1-外循环次数所在次数(一般也就是i),数值上等于外循环次数-i。
具体交换过程,在比较后,设个int变量做中间媒介,进行交换即可。
29、选择排序:
从0索引开始,依次和后面其他索引位置上的元素比较,小的往前放。第一轮结束,最小值出现在了最小索引处,截取除最小索引的元素后重复比较交换的步骤,直到截取的只剩最后索引位置的元素。利用for的嵌套循环实现。
内循环初始次数应设为外循环次数所在次数值加一(一般即j = i + 1),外循环次数根据比较次数。
30、冒泡排序是相邻元素之间进行比较,大数后放。选则排序是固定索引,与后依次比较,小数前放。
31、冒泡排序的内循环次数,是在设置循环次数范围时根据外循环次数的减少而减少,而选择排序的内循环次数,是在每次初始化的时候根据外循环次数的增加而增加。(初始化值的增加等同于循环次数范围的减少)。
32、二分查找:查找元素对应的索引。前提:数组元素有序
ⅰ.创建方法,返回值类型为int。设定三个int类型变量分别为最小值存储数组首个元素的索引,最大值存储数组末尾元素的索引即数组长度-1,和中间值存储最大值加最小值的和被二整除的值所代表的索引。
ⅱ.用while循环,条件是当中间值不等于要找的值,即开始循环查找。分两种情况,当中间值小于了要找的值,就使最小值代表的索引等于中间值的索引加一;当中间值大于要找的值,就使最大值代表的索引等于中间值的索引减一。无论最大索引还是最小索引改变,中间索引等于新的最大索引或最小索引加上不变的最小索引或最大索引的和被二整除。最后判断,如果最小索引比最大索引还大,就返回-1。
ⅲ.如果仍未满足中间值等于要找的值,也没返回-1,则重复第二步。如果满足中间值等于要找的值,则返回中间索引。
33、 注意:如果数组无序,就不能使用二分查找。因为即使你排序了,但是你排序的时候已经改变了最原始的元素索引位置。
34、Arrays类概述:针对数组进行操作的工具类。java.util包下,使用需要导包。方法均被静态修饰,直接通过类名.调用即可 Arrays.方法名。提供了排序,查找等功能。
35、Arrays类成员方法:
public static String toString(int[] a) 将数组转换成字符串。
public static void sort(int[] a) 对数组进行排序。
public static int binarySearch(int[] a,int key) 二分查找法。返回:如果它包含在数组中,则返回搜索键的索引;否则返回(-(插入点)-1)。插入点被定义为将键插入数组的那一点:即第一个大于此键的元素索引,如果数组中的所有元素都小于指定的键,则为a.legth,这保证了当且仅当此键被找到时,返回的值将>=0。
36、Ctrl + Shift + T打开类搜索。Ctrl + O打开方法搜索。
37、解析:
//toString源码
public static String toString(long[] a) {
if (a == null) //如果传入的数组是null
return "null"; //返回null
int iMax = a.length - 1; //iMax最大索引
if (iMax == -1) //如果数组中没有元素
return "[]"; //返回[]
StringBuilder b = new StringBuilder(); //线程不安去,效率高
b.append('['); //将[添加到字符串缓冲区中
for (int i = 0; ; i++) { //遍历数组,判断语句没有写默认是true
b.append(a[i]); //把第一个元素添加进字符串缓冲区
if (i == iMax) //如果索引等于最大最大值
return b.append(']').toString(); //将[添加到字符串缓冲区,再转换成字符串并返回
b.append(", "); //如果不等于最大索引就将, 添加到缓冲区
}
}
//binarySearch0源码
private static int binarySearch0(long[] a, int fromIndex, int toIndex,
long key) {
int low = fromIndex; //最小索引0
int high = toIndex - 1; //最大索引数组长度-1
while (low <= high) { //最小索引小于等于最大索引可以循环判断
int mid = (low + high) >>> 1; //求出中间索引值,(最小+最大)/2
long midVal = a[mid]; // 通过中间索引获取中间值
if (midVal < key) //中间索引对应的值小于查找的值
low = mid + 1; //最小索引变化
else if (midVal > key) //中间索引对应的值大于查找的值
high = mid - 1; //最大索引变化
else
return mid; // key found //找到了
}
return -(low + 1); // key not found. //-插入点-1
}
38、基本类型包装类的概述:为什么会有基本类型包装类:将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。
39、基本类型包装类常用的操作之一:用于基本数据类型与字符串之间的转换。
40、八种基本类型和包装类的对应:
基本类型 |
对应包装类 |
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
boolean |
Boolean |
41、Integer类概述:Integer 类在对象中包装了一个基本类型 int 的值,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。
42、Integer类的常量:
public static final int MAX_VALUE值为2^31-1的常量,它表示int类型能够表示的最大值。
public static final int MIN_VALUE值为-2^31的常量,它表示int类型能够表示的最小值。
43、Integer类的构造方法:
public Integer(int value) 构造一个新分配的Integer对象,它表示指定的int值。
public Integer(String s) 构造一个新分配的Integer对象,它表示String参数所指示的int值。必须传int类型(数字类型)的字符串,否则报NumberFormatException数字格式异常。
44、int类转换成String类:推荐用前两个方法。
ⅰ.用+和""进行拼接。
ⅱ.public static String valueOf(int i)
ⅲ.int -- Integer -- String(Integer类的toString方法():返回一个表示该Integer值的String对象)
ⅳ.public static String toString(int i)(Integer类的静态方法) 直接类名调用,参数传int值。Integer.toString(int值);
45、String类转换成int类:推荐第二种。
ⅰ.String -- Integer -- int (Integer类的intValue()方法:以int类型返回该Integer的值。)
ⅱ.public static int parseInt(String s) (Integer类的parseInt()方法:将字符串参数作为有符号的十进制整数作为解析。静态方法,Integer.parseInt(String值);)
46、基本数据类型包装类有8种,其中七种有parseXxx的方法,可以将这七种的字符串表现形式转换成基本数据类型。char的包装类Character中没有parseXxx的方法。字符串到字符的转换,通过toCharArray()就可以把字符串转换为字符数组。
47、JDK5以前装箱和拆箱:
int x = 100;
Integer i1 = new Integer(x);//将基本数据类型包装成对象,装箱
int y = i1.intValue(); //将对象转换为基本数据类型,拆箱
48、JDK5的新特性:
自动装箱:把基本类型转换为包装类类型。基本数据类型直接给引用数据类型赋值,把基本数据类型转换成对象。
自动拆箱:把包装类类型转换为基本类型。把对象转换为基本数据类型。底层相当于调用intValue()。
49、注意:在使用时,Integer x = null;代码就会出现NullPointerException。空指针调intValue方法报空指针异常。建议先判断是否为null,然后再使用。
50、Integer中的equals方法:public boolean equals(Object obj) :比较此对象与指定对象,当且仅当参数不为null,并且是一个与该对象包含相同int值的Integer对象时,结果为true。
51、 Integer的面试题:看程序写结果。
Integer i1 = new Integer(97);
Integer i2 = new Integer(97);
System.out.println(i1 == i2); //false
System.out.println(i1.equals(i2)); //true
System.out.println("-----------");
Integer i3 = new Integer(197);
Integer i4 = new Integer(197);
System.out.println(i3 == i4); //false
System.out.println(i3.equals(i4)); //true
System.out.println("-----------");
/*-128到127是byte的取值范围,如果在这个取值范围内,自动装箱就不会新创建对象,而是从常量池中获取
如果超过了byte取值范围就会新创建对象。*/
Integer i5 = 127;
Integer i6 = 127;
System.out.println(i5 == i6); //true
System.out.println(i5.equals(i6)); //true
System.out.println("-----------");
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8); //false
System.out.println(i7.equals(i8)); //true
/*public static Integer valueOf(int i) { //Cache缓存
if (i >= IntegerCache.low && i <= IntegerCache.high) //i >= -128 && i <= 127
return IntegerCache.cache[i + (-IntegerCache.low)]; //底层创建数组,数组大小256,0索引位置存的是-128,255索引位置存的127。i5和i6都是从数组直接取值,所以结果相同。
return new Integer(i);
}*/