Loading

StringBuffer-数组处理类


返回 我的技术栈(Technology Stack)



StringBuffer类


  • StringBuffer类的概述:

    • 线程安全的可变字符序列
  • StringBuffer和String的区别:

    • String是一个不可变的字符序列
    • StringBuffer是一个可变的字符序列
  • StringBuffer的构造方法:

    • public StringBuffer():无参构造方法

      StringBuffer sb = new StringBuffer();
      System.out.println(sb.length()); //容器的字符个数,实际值
      System.out.println(sb.capacity()); //容器的初始容量,理论值

      输出结果:0
      16

    • public StringBuffer(int capacity):指定容量的字符串缓冲区对象

      StringBuffer sb2 = new StringBuffer(10);
      System.out.println(sb2.length()); //容器的字符个数,实际值
      System.out.println(sb2.capacity()); //容器的初始容量,理论值

      输出结果:0
      10

    • public StringBuffer(String str):指定字符串内容的字符串缓冲区对象

      StringBuffer sb3 = new StringBuffer("heima");
      System.out.println(sb3.length()); //容器的字符个数,实际值
      System.out.println(sb3.capacity()); //字符串的length + 初始容量

      输出结果:5
      21


StringBuffer的添加功能


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

    StringBuffer sb = new StringBuffer();
    StringBuffer sb2 = sb.append(true);
    StringBuffer sb3 = sb.append("heima");
    StringBuffer sb4 = sb.append(100);

    System.out.println(sb.toString()); //StringBuffer类中重写了toString方法,显示的是对象中的属性值
    System.out.println(sb2.toString());
    System.out.println(sb3.toString());
    System.out.println(sb4.toString());

    输出结果:trueheima100
    trueheima100
    trueheima100
    trueheima100
    解释:StringBuffer是字符串缓冲区,当new的时候是在堆内存创建了一个对象,底层是一个长度为16的字符数组,
    当调用添加的方法时,不会再重新创建对象,在不断向原缓冲区添加字符

    StringBuffer sb = new StringBuffer();
    System.out.println(sb.toString());

    StringBuffer sb2 = sb.append(true);
    System.out.println(sb2.toString());

    StringBuffer sb3 = sb.append("heima");
    System.out.println(sb3.toString());

    StringBuffer sb4 = sb.append(100);
    System.out.println(sb4.toString());

    输出结果:
    true
    trueheima
    trueheima100

  • public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身

    StringBuffer sb = new StringBuffer("1234");
    sb.insert(3,"heima"); //在指定位置添加元素,如果没有指定位置,就会报错(指定位置要在字符串中)

    System.out.println(sb);

    输出结果:123heima4

StringBuffer的删除功能


  • public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身

    StringBuffer sb = new StringBuffer();
    //sb.deleteCharAt(5); //当缓冲区中没有这个索引上没有元素的时候,运行就会报错
    sb.append("heima");
    sb.deleteCharAt(4); //根据索引删除掉索引位置上对应的字符
    System.out.println(sb);

    输出结果:heim

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

    StringBuffer sb = new StringBuffer();
    sb.append("heima");

    sb.delete(0,2); //删除的时候是包含头,不包含尾
    输出结果:ima

    sb.delete(0,sb.length()); //清空缓冲区

    sb = new StringBuffer(); //不要用这种方式清空缓冲区,原来的会变成垃圾,浪费内存
    System.out.println(sb);

StringBuffer的替换和反转功能


  • StringBuffer的替换功能

    • public StringBuffer replace (int start,int end, String str):从start开始到end用str替换

      StringBuffer sb = new StringBuffer("heima");
      sb.replace(0,3,"bai");
      System.out.println(sb);
      输出结果:baima

  • StringBuffer的反转功能

    • public StringBuffer reverse():字符串反转

      StringBuffer sb = new StringBuffer("我爱总复习");
      sb.reverse();
      System.out.println(sb);
      输出结果:习复总爱我

StringBuffer的截取功能及注意事项


  • StringBuffer的截取功能

    • public String substring(int start):从指定位置截取到末尾

      StringBuffer sb = new StringBuffer("woaiheima");
      String str = sb.substring(4);
      System.out.println(str);
      System.out.println(sb);
      输出结果:heima
      woaiheima

    • public String substring(int start,int end):截取从指定位置开始到结束位置,包括开始位置,不包括结束位置

      StringBuffer sb = new StringBuffer("woaiheima");
      String str3 = sb.substring(4,7);
      System.out.println(str3);
      输出结果:hei

  • 注意事项:返回值类型不再是StringBuffer本身

StringBuffer和String的互相转换


  • String ----> StringBuffer

    • 1、通过构造方法

    • 2、通过append()方法

      public static void main(String[] args) {
      StringBuffer sb1 = new StringBuffer("heima"); //通过构造方法将字符转换为StringBuffer对象
      System.out.println(sb1);

      StringBuffer sb2 = new StringBuffer();
      sb2.append("heima"); //通过append方法将字符串转换为StringBuffer对象
      System.out.println(sb2);
      }

      输出结果:heima
      heima

  • StringBuffer ----> String

    • 1、通过构造方法

    • 2、通过toString()方法 (推荐使用)

    • 3、通过subString(0,length);

      public static void main(String[] args) {
      StringBuffer sb = new StringBuffer("heima");

      String s1 = new String(sb); //通过构造将StringBuffer转换为String
      System.out.println(s1);

      String s2 = sb.toString(); //通过toString方法将StringBuffer转换为String
      System.out.println(s2);
      //可以直接写出System.out.println(sb.toString());

      String s3 = sb.substring(0,sb.length()); //通过截取子字符串将StringBuffer转换为String
      System.out.println(s3);

      }

练习


  • 需求:把数组中的数据按照指定格式拼接成一个字符串

    • 如:int [] arr = {1,2,3};

    • 输出:[1,2,3];

      public static void main(String[] args) {
      int [] arr = {1,2,3};
      System.out.println(arrayToString(arr));
      }

      public static String arrayToString(int [] arr) {
      StringBuffer sb = new STringBUffer(); //创建字符串缓冲区对象
      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();
      }

      输出结果:[1,2,3]

  • 字符串反转

    import java.util.Scanner;
    class test {
    public static void main(String [] args) {
    Scanner sc = new Scanner(System.in); //创建键盘录入对象
    String line = sc.nextLine(); //将键盘录入的字符串存储在line中

    StringBuffer sb = new StringBuffer(line); //将字符串转换为StringBuffer对象
    sb.reverse(); //将缓冲区的内容反转

    System.out.println(sb.toString());
    }
    }

    输出结果:abc
    cba

面试题(String、StringBuffer和StringBuilder的区别)


  • StringBuffer和StringBuilder的区别

    • StringBuffer是jdk1.0版本的,是线程安全的(同步),效率低
    • StringBuilder是jdk1.5版本的,是线程不安全的(不同步),效率高
  • String、StringBuffer和StringBuilder的区别

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

String和StringBuffer分别作为参数传递


  • 基本数据类型的值传递,不改变其值

  • 引用数据类型的值传递,改变其值

    public static void main(String[] args) {
    String s = "heima";
    System.out.println(s);
    change(s);
    System.out.println(s);
    }

    public static void change(String s) { //执行完该方法后,s = heimaitcast
    //但是,方法执行完事要弹栈的,对于主方法的S来说,S是没有发生改变的
    s += "itcast";
    }

    输出结果:heima
    heima
    解释:String类虽然是引用类型,但是他当作参数传递时和基本数据类型是一样的

    /**************************************/

    public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();
    sb.append("heima");
    System.out.println(sb);
    change(sb);
    System.out.println(sb);
    }

    public static void change(StringBuffer sb) {
    sb.append("itcast");
    }

    输出结果:heima
    heimaitcast

数组高级冒泡排序代码实现


public static void main(String[] args) {
int[] arr = {24,69,80,57,13};
bubbleSort(arr);
print(arr);
}

public static void bubbleSort(int[] arr) {
for(int i = 0; i < arr.length - 1 ; i++) { // 外循环只需比较arr.length-1 次就可以了
for(int j = 0; j < arr.length - 1 - i; j ++) { // -1为了防止索引越界,-i为了提高效率
if(arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}

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

输出结果:13 24 57 69 80

数组高级选择排序


public static void main(String[] args) {
int[] arr = {24,69,80,57,13};
selectSort(arr);
print(arr);
}

public static void selectSort(int[] arr) {
for(int i = 0; i < arr.length - 1 ; i++) { // 外循环只需比较arr.length-1 次就可以了
for(int j = i + 1; j < arr.length; j ++) { // -1为了防止索引越界,-i为了提高效率
if(arr[i] > arr[j]) {
int temp = arr[j];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}

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

输出结果:13 24 57 69 80

数组高级二分查找


public static void main(String[] args) {
int[] arr = {11,22,33,44,55,66,77};
System.out.println(getIndex(arr,22));
System.out.println(getIndex(arr,66));
System.out.println(getIndex(arr,88));
}

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

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

mid = (min + max)/2; // 无论最大还是最小改变,中间索引都会随之改变

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

}

}

输出结果:1
5
-1

Arrays类的概述和方法使用


import java.util.Arrays;
public class Demo_Arrays {
public static void main(String[] args) {
int[] arr = {33,22,11,44,66,55};
System.out.println(Arrays.toString(arr)); //数组转字符串

Arrays.sort(arr); //排序
System.out.println(Arrays.toString(arr));

int[] arr2 = {11,22,33,44,55,66};
System.out.println(Arrays.binarySearch(arr2,22));
System.out.println(Arrays.binarySearch(arr2,66));
System.out.println(Arrays.binarySearch(arr2,88)); //-(插入点的值)-1
}
}

输出结果:[33,22,11,44,66,55]
[11,22,33,44,55,66]
1
5
-2

基本类型包装类的概述


  • 基本类型和包装类的对应

    byte Byte
    short Short
    int Integer
    long Long
    float Float
    double Double
    char Character
    boolean Boolean

    public static void main(String[] args) {
    System.out.println(Integer.toBinaryString(60)); //把60转成二进制
    System.out.println(Integer.toOctalString(60)); //把60转成八进制
    System.out.println(Integer.toHexString(60)); //把60转成十六进制
    }

    输出结果:111100
    74
    3c

Integer类的概述和构造方法


  • 构造方法
    • public Integer(int value)

    • public Integer(String s)

      Integer i1 = new Integer(100);
      System.out.println(i1);
      输出结果:100

      Integer i2 = new Integer("100");
      System.out.println(i2);
      输出结果:100

      Integer i3 = new Integer("abc"); //运行报错! 因为abc不是数字字符串,所以转换会报错
      System.out.println(i3);
      输出结果:报错!数字格式异常

String与int的相互转换


  • int ----> String

    • 1、和""进行拼接 (推荐使用)

      int i = 100;
      String s1 = i + "";
      System.out.println(s1);
      输出结果:100 (这是一个数字字符串)

    • 2、public static String valueOf(int i)(推荐使用)

      int i = 100;
      String s2 = String.valueOf(i);
      System.out.println(s1);
      输出结果:100 (这是一个数字字符串)

    • 3、int -- Integer -- String(Integer类的toString()方法)

      int i = 100;
      Integer i2 = new Integer(i);
      String s3 = i2.toString();
      System.out.println(s3);
      输出结果:100 (这是一个数字字符串)

    • 4、public static String toString(int i)(Integer类的静态方法)

      int i = 100;
      String s4 = Integer.toString(i);
      System.out.println(s4);
      输出结果:100 (这是一个数字字符串)

  • String ----> int

    • public static String toString(String s)(推荐使用)

      String i = "200";
      int i1 = Integer.parseInt(i);
      System.out.println(i1);
      输出结果:200 (这是一个int型数据)

      /******************************************************/

      注意:基本数据类型包装类有八种,其中七钟都有parseXxx的方法,
      可以将这七钟的字符串表现形式转换成基本数据类型

      String s1 = "true";
      boolean b = Boolean.parseBoolean(s1);
      System.out.println(b);
      输出结果:true

      String s2 = "abc";
      char c = Character.parsechar(s2);
      //运行报错!char的包装类Character中没有pareseXxx的方法
      字符串到字符的转换通过toCharArray()就可以把字符串转换成字符数组

    • String -- Integer -- int

      String s = "200";
      Integer i3 = new Integer(s);
      int i4 = i3.intValue();
      System.out.println(i4);
      输出结果:200 (这是一个int型数据)

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


public static void main(String[] args) {

/*以前的写法
int x = 100;
Integer i1 = new Integer(x);//装箱

int y = i1.intValue();//拆箱
*/

Integer i2 = 100;//将基本数据类型包装成对象,自动装箱
int z = i2 + 200;//将对象装换为基本数据类型,自动拆箱
System.out.println(z);
}
输出结果:300


Integer面试题


public static void main(String[] args) {
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("-----------------");

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

System.out.println("-----------------");

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

System.out.println("-----------------");

Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true
System.out.println(a.equals(b)); //true

System.out.println("-----------------");

Integer a1 = 128;
Integer b1 = 128;
System.out.println(a1 == b1); //false
System.out.println(a1.equals(b1)); //true

System.out.println("-----------------");

}

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


posted @ 2021-03-27 23:37  言非  阅读(163)  评论(0)    收藏  举报