1 StringBuffer
线程安全的可变字符序列。一个类似于String的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法(append和insert)调用可以改变该序列的长度和内容。
从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder
。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
注意:StringBuffer是一个字符缓冲区,下图输出都相同,因为他们都在往一个缓冲区中添加数据。而且StringBuffer重写了toString方法,不然他会输出一个地址值
上面是append方法,insert是在指定位置添加元素,还有其他的方法,比如查找(charAt())删除(delete和deleteCharAt)替换(replace方法)反转(reverser)截取功能(subString)
2 String和StringBuffer之间的相互转换
3 StringBuffer和StringBuilder的区别
一个可变的字符序列。此类提供一个与 StringBuffer
兼容的 API,但不保证同步。该类被设计用作 StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer
要快。
4 String和StringBuffer作为参数在进行传递时产生的问题
String虽然是引用数据类型,但是它作为参数传递时和基本数据类型是一样的,原因在于String一旦被初始化就不会被改变。
上面很重要。但是StringBuffer作为参数传递就和引用数据类型是一样的了。
5 冒泡排序
冒泡排序的原理在于冒泡,虽然这看似是废话,但是挺有意义的,每一次比较,两两相邻的元素比较,大的往后排,其实也就是小的上浮(往左)大的下沉(往右),那么第一次就能把最大的放在最后一位。下一次比较最后一位就不用参加了。
package com.haidai.debug;
public class Demo_3 {
public static void main(String[] args) {
int[] arr = {12,3,4,5,6,6,7,8,8};
maopaoSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void maopaoSort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for(int j = 0;j < arr.length-1-i;j++) {
if(arr[j] > arr[j+1]) {
arr[j] = arr[j] ^ arr[j+1];
arr[j+1] = arr[j] ^ arr[j+1];
arr[j] = arr[j] ^ arr[j+1];
}
}
}
}
}
6 选择排序
选择排序可以这样理解,它和冒泡排序相反,为什么这样说呢?冒泡排序是每相邻的两个元素比较,但是选择排序是选择一个元素分别与其它元素比较,从而第一遍过后把最小的元素放在了第一位,第二遍比较从第二位开始与其它元素比较。
package com.haidai.debug;
public class Demo_4 {
public static void main(String[] args) {
int[] arr = {12,3,4,5,6,6,7,8,8};
xuanzeSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void xuanzeSort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i] > arr[j]) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
}
}
}
}
7 二分查找
二分查找的功能是,我们给出一个需要查找的值,方法返回我们这个数在数组中的索引,但是二分查找需要一个很重要的前提就是数组必须是有序的。
package com.haidai.debug;
public class Demo_5 {
public static void main(String[] args) {
int[] arr = {11,22,33,44,55,66,77};
System.out.println(erfenFind(arr, 33));
System.out.println(erfenFind(arr, 11));
System.out.println(erfenFind(arr, 88));
}
public static int erfenFind(int[] arr,int target) {
int min = 0;
int max = arr.length-1;
int mid = (min + max)/2;
while(arr[mid] != target) {
if(arr[mid] < target) { //要找的数在mid右边
min = mid+1;
}else if(arr[mid] > target) { //要找的数在mid左边
max = mid-1;
}
mid = (min + max)/2;
if(min > max) { //数组中不存在这个数
return -1;
}
}
return mid;
}
}