示例:
public class Test6 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("abc");
// capacity()输出字符串缓冲区的容量,默认容量是16.此处容量打印19。
// 是把默认容量和添加的字符串相加后的容量。
System.out.println(s.capacity());
// System.out.println(s.append(12).append(arr).append(3.14));
// append()的使用,返回一个对象可以继续调方法。
System.out.println(s.append(12).append(3.14));
StringBuffer s1 = s.insert(1, "asdf");
System.out.println(s1);
// 获取指定索引处的字符值
char c = s1.charAt(3);
System.out.println(c);
StringBuffer s2 = s1.append(3.14);
// 替换指定索引处的内容,含头不含尾
System.out.println(s2.replace(9, s2.length(), "*"));
StringBuffer s3 = s.append("qwer");
// 反转功能
StringBuffer reverse = s3.reverse();
System.out.println(reverse);
System.out.println("===========");
StringBuffer sb=new StringBuffer("qaz");
StringBuffer sb1 = sb.append("wsx");
System.out.println(sb1);
sb.append("edc");
System.out.println(sb);
System.out.println("========");
// StringBuffer---->String 转换
System.out.println(sb.toString());
System.out.println(sb.substring(0, sb.length() - 1));
// String------>StringBuffer
String str="lkm";
StringBuffer buffer = new StringBuffer(str);
buffer.append("kkkkhjn");
System.out.println(buffer);
// delete();删除指定开始和结束的数据。含头不含尾
buffer.delete(buffer.length()-1,buffer.length());
System.out.println(buffer);
}
}
public class Test7 {
public static void main(String[] args) {
String s1="abc";
StringBuffer s2 = new StringBuffer("abc");
getStr(s1);
getStr(s2);
System.out.println(s1); //abc
System.out.println(s2);//abcqwe
}
// StringBuffer作为参数传递,是一个引用传递,把地址值传递过去,形参改变影响实参
private static void getStr(StringBuffer s2) {
s2.append("qwe");
}
// String 作为参数传递,是当作一个数值传递,形参改变不影响实参。
private static void getStr(String s1) {
s1+="qwe";
}
}
//冒泡法排序数组数值,每次将两个数据对比,将大的数放在后面,以此一轮对比结束,最大的
//数据就在最后。然后在对比一次,不用对比最后那个数据。这样就会将所有的数据按顺序排列。
public class Test {
public static void main(String[] args) {
int[] arr = new int[]{12, 13, 24, 56, 3, 19, 51, 8};
for (int j = 0; j < arr.length - 1; j++) {
for (int i = 0; i < arr.length - 1 - j; i++) {
// arr[i]>arr[i+1],是将数据从小到大排列
// arr[i]
if (arr[i] > arr[i + 1]) {
int m = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = m;
}
}
}
for (int k = 0; k < arr.length; k++) {
System.out.print(arr[k] + " ");
}
}
}
选择排序法
/*
选择排序方法,对数组排序,从0索引处开始和后面的每个数据比较,将小的放到最前面
这样每轮结束之后,最小的数就在最前面。
然后从1 索引处开始,依次比较,结束之后就把数据从小到大排序了。
*/
import java.util.Arrays;
public class Test2 {
public static void main(String[] args) {
int[] arr = new int[]{12, 13, 24, -7, 3, 19, 5, 8};
for (int index = 0; index < arr.length-1; index++) {
for (int i = index+1; i < arr.length; i++) {
if (arr[index]>arr[i]){
int m=arr[index];
arr[index]=arr[i];
arr[i]=m;
}
}
}
// 数组遍历的方法
System.out.println(Arrays.toString(arr));
}
}
直接插入排序法
//直接插入法排序数组
//依次从头开始将数据插入到有序数组中,并仍然保持有序。
import java.util.Arrays;
public class Test3 {
public static void main(String[] args) {
int[] arr = {1, 23, 21, 5, 3, -1, 80, -34};
// 刚开始将第一个数据看成是有序数列,和第一个对比排序
for (int index = 1; index < arr.length; index++) {
// 每次对比不止和前一个数对比,要和前面所有的数据对比,才能确定最终位置。
for (int j = index; j > 0; j--) {
if (arr[j] < arr[j - 1]) {
int m = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = m;
}
}
}
System.out.println(Arrays.toString(arr));
System.out.println("==========");
// 第二个方法
for (int i = 1; i < arr.length; i++) {
int j=i;
while (j>0&&arr[i]<arr[i-1]){
int mi=arr[i];
arr[i]=arr[i-1];
arr[i-1]=mi;
j--;
}
}
System.out.println(Arrays.toString(arr));
}
}
快速排序法
//快速排序法(挖坑排序法)
/*
思想:是把第一个数值挖出来(坑位1),然后从后向前找,直到找到比它小的,然后放在(坑位1),
腾出(坑位2)
然后从前向后找,直到找到比它大的挖出来,放到(坑位2),腾出(坑位3),
每次从后向前或者从前向后找,都要从上次索引的位置后出发,不要从头开始找。
直到索引相同了就结束了,这样就分出左右区,然后在左右区中,左区肯定比起始数据都小,
右区肯定比起始数据都大,然后在左右区继续这样排序,就会得到有序数列。
*/
import java.util.Arrays;
public class Test4 {
public static void main(String[] args) {
int[] arr = {12, 4, 23, 1, 4, 35, 67, 2};
Tools tools = new Tools();
tools.quicksore(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
}
class Tools {
public void quicksore(int[] arr, int start, int end) {
if (start < end) {
int i = getIndex(arr, start, end);
// 返回分界线,分解线的前一个索引就是左区的终止索引
quicksore(arr, start, i - 1);
// 返回分界线,分解线的后一个索引就是右区的开始索引
quicksore(arr, i + 1, end);
}
}
public int getIndex(int[] arr, int start, int end) {
int s = start;
int e = end;
// 起始比较数据
int x = arr[start];
int index = -1;
while (s < e) {
// 从后向前找,直到找到比它小的,
while (s < e && arr[e] > x) {
e--;
}
// 将数据放到坑中,自己的位置腾出来
if (s < e) {
arr[s] = arr[e];
// 让从前向后找的所以增加一个位置
s++;
}
// 从前向后找,直到找到比它大的数据
while (s < e && arr[s] < x) {
s++;
}
// 将数据放到坑中,自己的位置腾出来
if (s < e) {
arr[e] = arr[s];
// 让从后向前找的索引向前进一个位置
e--;
}
}
// 索引相遇了,将起始数据放到相遇的坑位,
arr[s] = x;
// 相遇点就是分界线
index = s;
return index;
}
}
二分法查找元素:
//二分法寻找一个数据的索引,这样寻找速度比较快,比遍历的效率高。
//二分法的前提是:这个数组必须是有序的。
/*思路:就是每次寻找中间的数据,和目标对比。
* 如果相等直接输出索引
* 大于中间值,那就在后面的范围以此方法寻找
* 小于中间值,那就在前面的范围以此方法寻找
* */
public class Test5 {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50, 60, 90, 100, 110};
Demo demo = new Demo();
int i = demo.getIndex(arr, 40, 0, 5);
System.out.println(i);
}
}
class Demo {
public int getIndex(int[] arr, int a, int start, int end) {
int m = 0;
int s = start;
int e = end;
while (s <= e) {
m = (s + e) / 2;
// 中间值等于目标值,返回中间值的索引
if (arr[m] == a) {
return m;
}
// 如果中间值小于目标值,那就将中间值的索引的下一个索引作为起始索引,在新的
// 在新的一半区域中寻找。
if (arr[m] < a) {
s = m + 1;
}
if (arr[m] > a) {
e = m - 1;
}
}
return m;
}
}