Java基础13---StringBuffer、Arrays、包装类

时间:2021-09-07 11:45:46

一、StringBuffer类和StringBuilder类

1. StringBuffer类是线程安全的可变字符序列

2. StringBuffer和String的区别

  • String是一个不可变的字符序列
  • StringBuffer是一个可变的字符序列

3.构造方法和方法

StringBuffer的构造方法:

  • public StringBuffer():无参构造方法
  • public StringBuffer(int capacity):指定容量的字符串缓冲区对象
  • public StringBuffer(String str):指定字符串内容的字符串缓冲区对象

StringBuffer的方法:

  • public int capacity():返回当前容量。
  • public int length():返回长度(字符数)。默认为16

示例:构造方法和长度方法的使用

package com.geekds.stringbuffer;

public class StringBufferStructure {

/**
* StringBuffer的构造方法
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer();
System.out.println(sb.length());//sb.length()指的是容器里的字符个数,实际值
System.out.println(sb.capacity());//容器初始容量,理论值

StringBuffer s2b = new StringBuffer(100);
System.out.println(s2b.length());
System.out.println(s2b.capacity());

StringBuffer s3b = new StringBuffer("geekds");
System.out.println(s3b.length());//字符 实际个数
System.out.println(s3b.capacity());//字符串的length() + 初始容量 (即:6 + 16)
}

}

4. StringBuffer的添加功能

  • public StringBuffer append(String str):

    • 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
  • public StringBuffer insert(int offset,String str):

    • 在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身

StringBuffer的删除功能

  • public StringBuffer deleteCharAt(int index):
    • 删除指定位置的字符,并返回本身
  • public StringBuffer delete(int start,int end):
    • 删除从指定位置开始指定位置结束的内容,并返回本身

代码演示:

package com.geekds.stringbuffer;

public class MethodAppendInsert {
public static void main(String[] args) {
//增加
methodAppend();
//插入
methodInsert();
//删除字符
StringBuffer sb = new StringBuffer();
/*sb.deleteCharAt(0); //当缓冲区这个索引上没有元素的时候会报索引越界异常StringIndexOutOfBoundsException
System.out.println(sb);*/

sb.append("geekds");
sb.deleteCharAt(3);//删除指定索引对应的字符
System.out.println(sb);

sb.delete(0,3);//包含头,不包含尾
System.out.println(sb);

sb.delete(0,sb.length());//清空缓冲区
System.out.println(sb);
}

private static void methodInsert() {
//在指定位置添加索引
/*如果没有指定位置的索引,就会报索引越界异常
* StringBuffer sb = new StringBuffer();
sb.insert(2, "dongshuai");
System.out.println(sb);*/

StringBuffer sb = new StringBuffer("chuchu");
sb.insert(2, "ds");
System.out.println(sb);
}

private static void methodAppend() {
//append()方法
/*
* 5个引用指向同一个对象
StringBuffer sb = new StringBuffer();
StringBuffer sb1 = sb.append(18812300);
StringBuffer sb2 = sb.append('@');
StringBuffer sb3 = sb.append("geekds");
StringBuffer sb4 = sb.append('.');
StringBuffer sb5 = sb.append("com");
System.out.println(sb);
System.out.println(sb1);
System.out.println(sb2);
System.out.println(sb3);
System.out.println(sb4);
System.out.println(sb5);*/


StringBuffer sb = new StringBuffer();
System.out.println(sb);
StringBuffer sb1 = sb.append(18812300);
System.out.println(sb1);
StringBuffer sb2 = sb.append('@');
System.out.println(sb2);
StringBuffer sb3 = sb.append("geekds");
System.out.println(sb3);
StringBuffer sb4 = sb.append('.');
System.out.println(sb4);
StringBuffer sb5 = sb.append("com");

System.out.println(sb5);
}
}

5. StringBuffer的替换和反转功能

  • StringBuffer的替换功能
    • public StringBuffer replace(int start,int end,String str):
      • 从start开始到end用str替换
  • StringBuffer的反转功能
    • public StringBuffer reverse():
      • 字符串反转

代码演示:

package com.geekds.stringbuffer;

public class Replace_Reverse {

/**
* @param args
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
//StringBuffer的替换和反转功能
StringBuffer sb = new StringBuffer("geekds");
sb.replace(1,3,"eeeee");
System.out.println(sb);

StringBuffer sb2 = new StringBuffer("雨滋春树碧连天,天连碧树春滋雨");
sb2.reverse();
System.out.println(sb2);
}

}

键盘录入反转示例:

package com.geekds.test;

import java.util.Scanner;

public class ReverseTest {

/**
* @param args
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String s = reverseString(line);
System.out.println(s);
}
//反转字符串的方法
public static String reverseString(String s) {
StringBuffer sb = new StringBuffer(s);

sb.reverse();
return sb.toString();
}

}

5. StringBuffer的截取功能及注意事项

  • StringBuffer的截取功能
    • public String substring(int start):
      • 从指定位置截取到末尾
    • public String substring(int start,int end):
      • 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
  • 注意事项
    • 注意:返回值类型不再是StringBuffer本身

示例:

package com.geekds.stringbuffer;

public class MethodSubstring {

/**
* @param args
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
//截取功能
StringBuffer sb = new StringBuffer("上海自来水来自海上");
String s = sb.substring(2);
System.out.println(s);

String s2 = sb.substring(2,7);//包含头不包含尾
System.out.println(s2);
}

}

6. StringBuffer和String的相互转换

1)String – StringBuffer

  • 通过构造方法
  • 通过append()方法

2)StringBuffer – String

*通过构造方法
*通过toString()方法
*通过subString(0,length);

示例:

package com.geekds.stringbuffer;

public class StringBuffer_String {

/**
*
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
string_to_StringBuffer();
stringBuffer_to_String();
}

private static void stringBuffer_to_String() {
//StringBuffer到String的转换
StringBuffer sb = new StringBuffer("geekds");
//通过String的构造方法
String s1 = new String(sb);
System.out.println(s1);
//通过toString()方法,通常用这个
String s2 = sb.toString();
System.out.println(s2);
//通过substring()方法
String s3 = sb.substring(0,sb.length());
System.out.println(s3);
}

private static void string_to_StringBuffer() {
//String到StringBuffer的转换,通过构造方法
StringBuffer sb = new StringBuffer("geekds.com");
System.out.println(sb);
//String到StringBuffer的转换,通过append()方法
StringBuffer sb2 = new StringBuffer();
sb2.append("geekds.com");
System.out.println(sb2);
}

}

测试:把数组转成字符串

把数组中的数据按照指定个格式拼接成一个字符串
举例:
int[] arr = {1,2,3};
输出结果:
“[1, 2, 3]”

package com.geekds.test;

public class SplitJoint_StringBuilder {

/**
* 拼接字符串,即将数组转换为字符串
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1993,1994,1995,1996};
String s = array2String(arr);
System.out.println(s);
}

public static String array2String(int[] arr) {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) { //遍历数组
if(i == arr.length - 1) {
sb.append(arr[i]).append("]");
}else {
sb.append(arr[i]).append(", ");
}
}

return sb.toString();
}
}

6. StringBuffer和StringBuilder的区别

面试题

  • String,StringBuffer,StringBuilder的区别
  • StringBuffer和StringBuilder的区别

  • StringBuffer是jdk1.0版本的,是线程安全的,效率低

  • StringBuilder是jdk1.5版本的,是线程不安全的,效率高

  • String和StringBuffer,StringBuilder的区别

  • String是一个不可变的字符序列
  • StringBuffer,StringBuilder是可变的字符序列

7. String和StringBuffer分别作为参数传递

  • 形式参数问题
    • String作为参数传递
    • StringBuffer作为参数传递

代码演示:

package com.geekds.stringbuffer;

public class StringBuffer_String_Parameter {

/**
* String和StringBuffer分别作为参数传递
* 基本数据类型的值传递,不改变其值
* 引用数据类型的值传递,改变其值
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "geekds";
System.out.println(s);
change(s);//String类虽然是引用数据类型,但是他当作参数传递时,和基本数据类型是一样的。方法一弹栈,里面的s就消失了
System.out.println(s);

StringBuffer sb = new StringBuffer();
sb.append("geekds");
System.out.println(sb);
change(sb);//此处为引用数据类型的值传递,两个引用指向的是同一个对象
System.out.println(sb);
}

private static void change(StringBuffer sb) {
// TODO Auto-generated method stub
sb.append(".com");
}

public static void change(String s) {
// TODO Auto-generated method stub
s += ".com";
}

}

二、冒泡排序、选择排序、二分查找

1. 数组高级冒泡排序原理

       相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。

2. 数组高级选择排序原理

       从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处。

下面是冒泡排序和选择排序的代码演示:

package com.geekds.sort;

public class Bubble_Select_Sort {

/**
* 冒泡排序:轻的上浮,沉的下降
* 两个相邻位置比较,如果前面的元素比后面的大,就换位置
*
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {124,1543,5461,32,64654,233,234325};
bubbleSort(arr);
//selectSort(arr);
print(arr);
}

public static void bubbleSort(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]) {
/*int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;*/

swap(arr, j, j + 1);
}
}
}
}

public static void selectSort(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]) {
/*int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;*/

swap(arr, i ,j);
}
}
}
}

public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + ",");
}
}

/*
* 换位操作
* 1,返回值类型:void
* 2,参数列表:int[] arr, int i, int j
*/

//如果只在本类中用,就把他定义成私有的
private static void swap(int[] arr,int i,int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}

3. 数组高级二分查找原理

前提:数组元素有序

示例:

package com.geekds.sort;

public class Binary_Search {

/**
* @param args
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {12,34,56,78,90,100};
System.out.println(halfSearch(arr,78));
System.out.println(halfSearch(arr,12));
System.out.println(halfSearch(arr,101));
}
/*
* 二分查找
* 返回值类型:int
* 参数列表:int[] arr, int value
*/

public static int halfSearch(int[] arr, int value) {
int min = 0;
int max = arr.length - 1;
int mid = (min + max) >>> 1;

while(arr[mid] != value){ //当中间值不等于要找的值,就开始循环查找
if(arr[mid] < value) { //当中间值小于要找的值
min = mid + 1; //最小的索引改变
}else if (arr[mid] > value) {//当中间值大于要找的值
max = mid - 1; //最大的索引改变
}
mid = (max + min) >>>1;//无论最大还是最小索引改变,中间索引都会随之改变

if(min > max) { //如果最小索引大于了最大索引,就没有查找的可能性
return -1;
}
}
return mid;
}

}

三、Arrays类的概述和方法使用

1. Arrays类概述

  • 针对数组进行操作的工具类。
  • 提供了排序,查找等功能。

2.成员方法

  • public static String toString(int[] a)
  • public static void sort(int[] a)
  • public static int binarySearch(int[] a,int key)

示例:

package com.geekdsarrays;

import java.util.Arrays;

public class Arrays_Test {

/**
* Arrays类的toString()方法,sort()方法,binarySearch()方法
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {234,432,234,6432,345,234,235,3452345};

System.out.println(Arrays.toString(arr));

Arrays.sort(arr);
System.out.println(Arrays.toString(arr));

System.out.println(Arrays.binarySearch(arr, 234));//元素有重复的,不确定找的是哪一个
System.out.println(Arrays.binarySearch(arr, 6432));
System.out.println(Arrays.binarySearch(arr, 3455));//找不到元素时,返回的值是负的插入点减一
}

}

四、基本类型包装类的概述

      将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。
      常用的操作之一:用于基本数据类型与字符串之间的转换。

package com.geekds.wrap_class;

public class Package_Class {

/**
* 将基本数据类型封装成包装类的好处在于可以再类中定义更多的功能方法操作该数据
* 常用的操作:用于基本数据类型和字符串之间的转换
* 8中基本数据类型:byte,short,int,long,float,double,char,boolean
* 对应的包装类:Byte,Short,Integer,Long,Float,Double,Character,Boolean
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 1993;
System.out.println(Integer.toBinaryString(i));
System.out.println(Integer.toHexString(i));
System.out.println(Integer.toOctalString(i));
System.out.println(Integer.toString(i));

}

}

1. Integer类的概述和构造方法

  • Integer 类在对象中包装了一个基本类型 int 的值,
  • 该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,
  • 还提供了处理 int 类型时非常有用的其他一些常量和方法

构造方法

  • public Integer(int value)
  • public Integer(String s)
package com.geekds.wrap_class;

public class Integer_Test {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
//Integer的构造方法可以传int型或都是数字的string型
Integer i = new Integer("2342ksdf");//数字格式异常,这里面不是纯数字字符串,所以转换出错
System.out.println(i);
}
}

2. String和int类型的相互转换

详情看代码:

package com.geekds.wrap_class;

public class Int_String {

/**
* int和String互转
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
int__String();//int和String互转的方法

//8中基本数据类型只有Character没有parseXxx方法
//字符串到字符的转换用toCharArray()即可。
//String s = "geekds";
//char c = Character.parseXXX
}

private static void int__String() {
int i = 2016;
//int转成String型,推荐用方式1和方式2
//方式1,用字符串拼接
String s1 = i + "";
System.out.println(s1);
//调用String的valueOf方法
String s2 = String.valueOf(i);
System.out.println(s2);
//方式3,用Integer的toString方法
String s3 = Integer.toString(i);
System.out.println(s3);

//String转int,推荐用方式2
//方式1
String s4 = "2017";
Integer i2 = new Integer(s4);
int i3 = i2.intValue();//将Integer转换为int
System.out.println(i3);

//方式2,使用Integer的parseInt()方法
int i4 = Integer.parseInt(s4);
System.out.println(i4);
}

}

3. JDK5的新特性自动装箱和拆箱

  • 自动装箱:把基本类型转换为包装类类型
  • 自动拆箱:把包装类类型转换为基本类型
package com.geekds.wrap_class;

public class JDK5_int_Integer {

/**
* 自动装箱:把基本数据类型转换为包装类类型
* 自动拆箱:反之
*/

public static void main(String[] args) {
// TODO Auto-generated method stub

int i = 3003;
Integer i1 = new Integer(i);//装箱

int i2 = i1.intValue(); //拆箱

Integer i3 = 3006; //自动装箱,把基本数据类型转换为对象
int i4 = i3 + 6003; //自动拆箱,把对象i3转换为基本数据类型后,再与6003相加

//Integer i5 = null; 底层用i5调用的intValue()方法,现在i5为null,null调用方法会出现空指针异常
//int i6 = i5 + 7007;
//System.out.println(i6);

}

}

下面是Integer的面试题

package com.geekds.wrap_class;

public class Integer_InterviewQuestion {

/**
* -128到127是byte的取值范围,如果在这个取值范围内,自动装箱就不会新创建对象,而是从常量池中获取
如果超过了byte取值范围就会再新创建对象
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
Integer i1 = new Integer(97);
Integer i2 = new Integer(97);
System.out.println(i1 == i2); //false
System.out.println(i1.equals(i2)); //true

Integer i3 = new Integer(197);
Integer i4 = new Integer(197);
System.out.println(i3 == i4); //false
System.out.println(i3.equals(i4)); //true

Integer i5 = 127;
Integer i6 = 127;
System.out.println(i5 == i6); //true
System.out.println(i5.equals(i6)); //true

Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8);
System.out.println(i7.equals(i8)); //true




}

}