day13_API第三天

时间:2020-11-28 05:07:07

1、StringBuffer类(掌握)

1、概念

     字符串缓冲区类

2、机制
     StringBuffer采用的是缓冲区机制。

一开始,首先开辟一些空间,然后,随着数据的增多,还可以继续开辟空间。这些操作针对的是同一个对象。


3、String和StringBuffer区别
     1、String一旦被创建就不能被修改,但是StringBuffer可以被修改
     2、StringBuffer采用的是缓冲区机制,随着数据的增多,还会继续开辟内存空间
4、缓冲区案例
     第五天作业,无限制给数组添加元素

5、构造方法
          

StringBuffer()

初始化一个理论长度为16的空对象

StringBuffer(int capacity)

初始化一个理论长度为指定大小的空对象

StringBuffer sb = new StringBuffer(10);

sb.length()//0

sb.capaticy()//10

StringBuffer(String str)

初始化一个内容为str的对象,理论长度为字符串的长度+ 16

            
6、成员方法

获取长度

public int length()

字符个数,实际长度

Public int capacity()

字符容量,理论长度,这个方法以后不会用到

添加功能

StringBuffer append(数据类型 变量名)

在结尾处添加,返回的是同一个对象

StringBuffer sb = new StringBuffer();

StringBuffer sb2 = sb.append("true");

sb == sb2 //true,所以操作是同一个对象

StringBuffer insert(int index, 数据类型 变量名)

在指定位置添加

StringBuffer sb = new StringBuffer();

StringBuffer sb2 = sb.insert(1,"a");/只与实际长度有关系,实际长度是0,1位置不存在,所以回报下标越界异常

删除功能

StringBuffer deleteCharAt(int index);

删除指定位置处的字符

new StringBuffer("abc").deleteCharAt(0);//删除0位置的元素,删除后StringBuffer变为bc

StringBuffer delete(int start, int end)

删除指定开始位置和结束位置之间的字符

StringBuffer sb = new StringBuffer("abcdefg");

sb.delete(0,3);//删除0-3位置的元素,注意:包括0位置对应的元素,不包括3位置对应的元素,结果为defg

替换功能

StringBuffer replace(int start, int end, String str)

用指定字符串替start位置到end位置的内容,注意包左不包右

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

//把hei替换成bai

sb.replace(0,3,"bai")//包括0位置,不包括3位置,所以区间是0,1,2,修改完毕后,对原来的有影响

截取功能

public String substring(int start)

从索引为start处截取到结尾

public String substring(int start, int end)

从索引为start,截取到end。包左不包右

注意事项:截取完后对原来的对象没有影响,返回值是String

反转功能

public StringBuffer reverse()

将此字符序列用其反转形式取代


字符串和StringBuffer相互转换
字符串->StringBuffer : new StringBuffer(字符串)
StringBuffer->字符串 :toString();


String,StringBuffer,StringBuilder的区别
1、StringBuffer和StringBuilder的区别
    StringBuffer是线程安全的,效率低。StringBuilder是线程不安全的,效率高
    他们两个所持有的方法是一模一样的
2、String和他们两个的区别
    String是不可变的,因为是常量

String作为实际参数传递的时候:形式参数的改变不会对实际参数产生影响


2、数组操作




查询
普通查找:(原理代码必须掌握,以后会经常见到
遍历数组,拿数组中的每一个元素和要查找的数据比较
如果两者相同,就返回该元素对应的索引

  1. /**
  2. * 获取数组中指定元素的索引
  3. *
  4. * @param arr
  5. * @param value
  6. * @return
  7. */
  8. public static int getIndex(int[] arr, int value) {
  9. int index = -1;
  10. for (int x = 0; x < arr.length; x++) {
  11. if (arr[x] == value) {
  12. index = x;
  13. break;
  14. }
  15. }
  16. return index;
  17. }

折半查找(原理必须掌握,面试用)
前提:数组必须有序  
说说二分法查找思路
1、首先需要有最小索引和最大索引,通过这两个索引求出中间索引
2、拿中间索引上的值 和 要查找的数据比较
3、
如果中间索引上的值比要查找的数据大,最大索引=中间索引-1,
如果中间索引上的值比要查找的数据小 、
最小索引=中间索引+1,
4、以此类推,直到最大索引小于最小索引或者找到就停止


  1. public static intgetIndex(int[] arr, int value) {
  2. intmaxIndex = arr.length - 1;// 定义最大索引
  3. intminIndex = 0;// 定义最小索引
  4. intmidIndex = (maxIndex + minIndex) / 2;// 定义中间索引
  5. while(arr[midIndex] != value) {
  6. if (arr[midIndex] > value) {
  7. maxIndex = midIndex - 1;
  8. } else if (arr[midIndex] < value) {
  9. minIndex = midIndex + 1;
  10. }
  11. // 如果数据不存在。
  12. if (minIndex > maxIndex) {
  13. return -1;
  14. }
  15. // 下一次二分查找开始
  16. midIndex = (maxIndex + minIndex) / 2;
  17. }
  18. returnmidIndex;
  19. }

排序

冒泡排序(原理能说出来,代码背熟)
原理一句话:相邻两个元素两两比较

A: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

B: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
    在这一点,最后的元素应该会是最大的数。

C: 针对所有的元素重复以上的步骤,除了最后一个。

D: 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

  1. public static void bubbleSort(int[] arr) {
  2. // 外循环控制比较的次数
  3. for (int i = 0; i < arr.length - 1; i++) {
  4. // 内循环控制每次比较中,元素两两比较的过程。每次需要比较的数据是逐渐减少的。
  5. for (int j = 0; j < arr.length - 1 - i; j++) {
  6. // 比较相邻元素,如果前面的大,进行交换
  7. if (arr[j] > arr[j + 1]) {
  8. int temp = arr[j];
  9. arr[j] = arr[j + 1];
  10. arr[j + 1] = temp;
  11. }
  12. }
  13. }
  14. }

选择排序(原理能说出来)
首先在未排序序列中找到最小元素,存放到排序序列的起始位置,
然后,再从剩余未排序元素钟继续寻找最小元素,
然后放到排序序列起始位置,一次类推,知道所有元素均排序完毕
  1. public static void selectSort(int[] arr){
  2. for(int i=0; i<arr.length-1; i++){
  3. for(int j=i+1; j<arr.length; j++){
  4. if(arr[i] < arr[j]){
  5. int temp = arr[j];
  6. arr[j] = arr[i];
  7. arr[i] =temp;
  8. }
  9. }
  10. }
  11. }




3、Arrays工具类(掌握)

1、Arrays是针对数组操作的工具类

2、成员方法

public static String toString(数据类型[] 变量名)

把数组拼接成字符串

public static void sort(数据类型[] 变量名)

对数组进行排序

public static int binarySearch(int[] arr,int value)

二分查找




  

4、System类(掌握)

1、系统类,提供了静态的变量和方法供我们使用

2、成员方法

public static void exit(int value)

退出jvm,非0表示异常退出

public static long currentTimeMillis()

返回当前系统时间的毫秒值

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

从指定源数组的指定位置开始复制,复制到目标数组的指定位置,复制length个元素



5、基本类型的包装类(掌握)

1、概述

     基本类型的数据我们只能使用值,不能做更多的操作。为了方便我们操作,java就把每种基本类型进行了包装。提供方法供我们使用

2、基本类型和包装类的对应关系
     

byte

 

short

int

Integer

long

float

double

char

Character

boolean


3、Integer构造方法

Integer(int num)

 

Integer(String s)

S必须是一个由数字字符组成的字符串


4、String和int类型的转换
     1、String --> int    调用Integer类中的parseInt方法(常用)
          public static int parseInt(String s)
            
  1. String str = "123";
  2. int num = Integer.parseInt(str);
  3. System.out.println(num);

     2、int --> String 
          方法一:调用Integer中的toString()
                    public static String toString(itn i);
          方法二:调用String中的valueOf(推荐)
                    public static String valueOf(int i)
  1. int num = 1;
  2. String str = String.valueOf(num);
  3. System.out.println(str);
          方法三:直接和空串连接
                    num +"";

5、JDK5以后的新特性
     1、自动装箱:     基本类型  赋值给 引用类型      Integer integer = 1;
     2、自动拆箱:     引用类型  赋值给 基本类型      int i = new Integer(2);

6、面试题(掌握)

1、byte常量池面试题

          Integer i1 = new Integer(127);

Integer i2 = new Integer(127);

          System.out.println(i1 == i2);  // false

          System.out.println(i1.equals(i2));  // true

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

          Integer i3 = new Integer(128);

          Integer i4 = new Integer(128);

          System.out.println(i3 == i4);  // false

          System.out.println(i3.equals(i4)); // true

          Integer i5 = 128;

          Integer i6 = 128;

          System.out.println(i5 == i6);  // false false,原因自动装箱,调用Integer.valueOf(),回去常量池找有没Integer

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

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

          Integer i7 = 127;

          Integer i8 = 127;

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

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

          结论:byte范围内的值(-128 ~ 127),java提供了一个常量池。直接赋值给Integer,是从常量池里面获取的。


7、API总结(掌握)

day13_API第三天


8、今天必须掌握的内容。以及常见的笔试题和面试题(学完这个就可以放心学习后面的知识了)

1、说说StringBuffer,StringBuilder,String的区别
2、byte常量池面试题
下面这几个数据类型转换大家看着中文把代码说出来就好了,有遗忘的先自己查笔记,找不到可以和同学讨论
3、如何获取当前时间的毫秒值
4、如何将字符串转换成StringBuffer
        String str = "abc";
        StringBuffer sb = new StringBuffer(str);
5、如何将字符串转换成字符数组,字节数组
    "abc".toCharArray();
    "abc".getBytes();
6、如何将字符串转换成int,double
    Integer.parseInt("123");
    Double.parseDouble("4.0");
7、如何将字符串转换成日期对象
8、如何将StringBuffer转换成字符串
       new StringBuffer("abc").toString();
9、如何将数组拼接成字符串
        String str = Arrays.toString(new int[]{1,2,3});
10、如何将日期对象转换成指定格式字符串
11、如何将字节数组,字符数组转换成字符串
        String str = new String(new byte[]{97,98,99});
        String str = new String(new char[]{'a','b','c'});
12、如何将任意类型(包括基本类型、引用类型)转换成字符串
        String str = String.valueOf(任意类型数据);
13、说说冒泡排序和选择排序,折半查找原理,手写冒泡排序算法
14、 代码题:键盘录入"abc",输出"cba"
  1. import java.util.Scanner;
  2. /**
  3. 1、获取键盘录入的String .nextLine()
  4. 2、把字符串转换成StringBuffer。通过StringBuffer(字符串)
  5. 3、调用艾斯比的reverse()方法,反转
  6. 4、将艾斯比转成字符串 调用toString
  7. */
  8. public class Demo {
  9. public static void main(String[] args) {
  10. Scanner scanner = new Scanner(System.in);
  11. // 1、获取键盘录入的String .nextLine()
  12. String line = scanner.nextLine();
  13. // 2、把字符串转换成StringBuffer。通过StringBuffer(字符串)
  14. StringBuffer sb = new StringBuffer(line);
  15. //3、调用艾斯比的reverse()方法,反转
  16. sb.reverse();
  17. //4、将艾斯比转成字符串 调用toString
  18. String string = sb.toString();
  19. System.out.println(string);
  20. }
  21. }