2018.9.25学习笔记(StringBuffer,StringBuilder,冒泡,选择,二分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Haidaiya/article/details/82845002

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;
	}

}

猜你喜欢

转载自blog.csdn.net/Haidaiya/article/details/82845002