zoukankan      html  css  js  c++  java
  • javaSE第十三天

    第十三天    76

    1. StringBuffer(掌握)    76

    (1)说明:    77

    (2)StringBuffer的构造方法    77

    (3)StringBuffer的常见功能    77

    (4)StringBuffer的练习(做一遍)    78

    (5)面试题    82

    (6)注意的问题:    83

    2. 数组高级以及Arrays(掌握)    83

    (1)排序    83

    A:冒泡排序    83

    B:选择排序    83

    (2)查找    84

    A:基本查找    84

    B:二分查找(折半查找)    85

    (3)Arrays工具类    86

    3. Integer(掌握)    88

    (1)说明:    88

    (2)Integer的构造方法    89

    (3)String和int的相互转换    89

    (4)其他的功能(了解)    89

    (5)JDK5的新特性    89

    (6)面试题    90

    4. Character(了解)    90

    (1)Character构造方法    90

    (3)案例:    91

     

    第十三天

    1. StringBuffer(掌握)
        (1)说明:

    用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,

    为了解决这个问题,Java就提供了

         一个字符串缓冲区类。StringBuffer供我们使用。

    为线程安全的可变字符序列

        (2)StringBuffer的构造方法

            A: public StringBuffer() :无参构造方法(默认容量16个字符)

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

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

    (理论容量 = 字符串长度 + 默认容量16个字符)

        (3)StringBuffer的常见功能

            A:添加功能

    public StringBuffer append(String str) :

    可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身

    public StringBuffer insert(int offset, String str) :

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

            B:删除功能

    public StringBuffer deleteCharAt(int index):

    删除指定位置的字符(只删除一个字符),并返回缓冲区本身

    public StringBuffer delete(int start, int end)

    删除从指定位置开始到到指定结束位置的内容,并返回缓冲区本身

            C:替换功能

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

    start 开始到endstr 进行替换

            D:反转功能

                public StringBuffer reverse():字符串反转

            E:截取功能(注意这个返回值)

    注意:截取的子串返回给一个新串,原串没有被改变

                public String substring(int start)

    public String substring(int start, int end)

    F:其他方法:

    public int capacity() : 返回当前容量。理论值

    public int length(): 返回长度(字符数)。实际值

        (4)StringBuffer的练习(做一遍)

            A:String和StringBuffer相互转换?

                String -- > StringBuffer

                    方式1:通过构造方法

    方式2:通过append方法

                StringBuffer --> String

                    方式1:通过构造方法

    方式2:通过 toString() 方法

    /*

    * 为什么我们要讲解类之间的转换:

    * A -- B的转换

    * 我们把A转换为B,其实是为了使用B的功能。

    * B -- A的转换

    * 我们可能要的结果是A类型,所以还得转回来。

    *

    * StringStringBuffer的相互转换?

    */

    public class MainDemo {

        public static void main(String[] args) {

            // String --- StringBuffer

            String s = "hello";

            // 注意:不能把字符串的值直接赋值给StringBuffer

            // StringBuffer sb = "hello";

            // StringBuffer sb = s;

            // 方式1:通过构造方法

            StringBuffer sb = new StringBuffer(s);

            // 方式2:通过append()方法

            StringBuffer sb2 = new StringBuffer();

            sb2.append(s);

            System.out.println("sb:" + sb);

            System.out.println("sb2:" + sb2);

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

     

            // StringBuffer --- String

            StringBuffer buffer = new StringBuffer("java");

            // String(StringBuffer buffer)

            // 方式1:通过构造方法

            String str = new String(buffer);

            // 方式2:通过toString()方法

            String str2 = buffer.toString();

            System.out.println("str:" + str);

            System.out.println("str2:" + str2);

        }

    }

     

            B:字符串的拼接

                

    /*

    * 需求:把数组拼接成一个字符串

    */

    public class MainDemo {

        public static void main(String[] args) {

            // 定义一个数组

            int[] arr = { 44, 33, 55, 11, 22 };

     

            // 定义功能

            // 方式1:用String做拼接的方式

            String s1 = arrayToString(arr);

            System.out.println("s1:" + s1);

     

            // 方式2:StringBuffer做拼接的方式

            String s2 = arrayToString2(arr);

            System.out.println("s2:" + s2);

        }

     

        // StringBuffer做拼接的方式

        public static String arrayToString2(int[] arr) {

            StringBuffer sb = new StringBuffer();

     

            sb.append("[");

            for (int x = 0; x < arr.length; x++) {

                if (x == arr.length - 1) {

                    sb.append(arr[x]);

                } else {

                    sb.append(arr[x]).append(", ");

                }

            }

            sb.append("]");

     

            return sb.toString();

        }

     

        // String做拼接的方式

        public static String arrayToString(int[] arr) {

            String s = "";

     

            s += "[";

            for (int x = 0; x < arr.length; x++) {

                if (x == arr.length - 1) {

                    s += arr[x];

                } else {

                    s += arr[x];

                    s += ", ";

                }

            }

            s += "]";

     

            return s;

        }

    }

     

            C:把字符串反转

    package cn.itcast01;

     

    import java.util.Scanner;

    /*

    * 需求:把字符串反转

    */

    public class MainDemo {

        public static void main(String[] args) {

            // 键盘录入数据

            Scanner sc = new Scanner(System.in);

            System.out.println("请输入数据:");

            String s = sc.nextLine();

     

            // 方式1:用String做拼接

            String s1 = myReverse(s);

            System.out.println("s1:" + s1);

            // 方式2:用StringBufferreverse()功能

            String s2 = myReverse2(s);

            System.out.println("s2:" + s2);

        }

     

        // StringBufferreverse()功能

        public static String myReverse2(String s) {

            // StringBuffer sb = new StringBuffer();

            // sb.append(s);

     

            // StringBuffer sb = new StringBuffer(s);

            // sb.reverse();

            // return sb.toString();

     

            // 简易版

            return new StringBuffer(s).reverse().toString();

        }

     

        // String做拼接

        public static String myReverse(String s) {

            String result = "";

     

            char[] chs = s.toCharArray();

            for (int x = chs.length - 1; x >= 0; x--) {

                // char ch = chs[x];

                // result += ch;

                result += chs[x];

            }

     

            return result;

        }

    }

     

            D:判断一个字符串是否对称

    import java.util.Scanner;

    /*

    * 需求:判断一个字符串是否是对称字符串

    * 例如"abc"不是对称字符串,"aba""abba""aaa""mnanm"是对称字符串

    *

    * 分析:

    *         判断一个字符串是否是对称的字符串,我只需要把

    *             第一个和最后一个比较

    *             第二个和倒数第二个比较

    *             ...

    *         比较的次数是长度除以2

    */

    public class MainDemo {

        public static void main(String[] args) {

            // 创建键盘录入对象

            Scanner sc = new Scanner(System.in);

            System.out.println("请输入一个字符串:");

            String s = sc.nextLine();

     

            // 一个一个的比较

            boolean b = isSame(s);

            System.out.println("b:" + b);

     

            // 用字符串缓冲区的反转功能

            boolean b2 = isSame2(s);

            System.out.println("b2:" + b2);

        }

     

        // 用字符串缓冲区的反转功能

        public static boolean isSame2(String s) {

            return new StringBuffer(s).reverse().toString().equals(s);

        }

     

        // public static boolean isSame(String s) {

        // // 把字符串转成字符数组

        // char[] chs = s.toCharArray();

        //

        // for (int start = 0, end = chs.length - 1; start <= end; start++, end--) {

        // if (chs[start] != chs[end]) {

        // return false;

        // }

        // }

        //

        // return true;

        // }

     

        // 一个一个的比较

        public static boolean isSame(String s) {

            boolean flag = true;

     

            // 把字符串转成字符数组

            char[] chs = s.toCharArray();

     

            for (int start = 0, end = chs.length - 1; start <= end; start++, end--) {

                if (chs[start] != chs[end]) {

                    flag = false;

                    break;

                }

            }

     

            return flag;

        }

    }

     

        (5)面试题

            小细节:

                StringBuffer:同步的,线程安全的、数据安全,效率低。

                StringBuilder:不同步的,数据不安全,效率高。

            A:String,StringBuffer,StringBuilder的区别?

    答:

    1. String:长度和内容不可变

    2. StringBuffer 和 StringBuilder 都是长度和内容可变的

    3.String Buffer 是同步的,数据安全,效率低,;而StringBuilder是不同步的,数据不                 安全,效率搞

            B:StringBuffer和数组的区别?

    答:

    二者都可以看着是一个容器,都可以装其他的数据

    但是呢,StringBuffer 的数据最终是一个字符串数据,

    而数据可以放置多种数据,但必须都是同一种数据类型

        (6)注意的问题:

            1. String作为形式参数,效果和基本类型作为形式参数传递是一样的

    形式参数的改变不影响实际参数

    1. StringBuffer作为形式参数。赋值不改变实际值,但是调用其方法进行的值更改,则

      会改变实际值

        

    2. 数组高级以及Arrays(掌握)
        (1)排序

            A:冒泡排序

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

    同理,其他的元素就可以排好。

                注意:第一次比较完之后,下一次比较的时候,就会减少一个元素的比较

                

    public static void bubbleSort(int[] arr) {

            for (int x = 0; x < arr.length - 1; x++) {

                for (int y = 0; y < arr.length - 1 - x; y++) {

                    if (arr[y] > arr[y + 1]) {

                        int temp = arr[y];

                        arr[y] = arr[y + 1];

                        arr[y + 1] = temp;

                    }

                }

            }

        }

     

                

            B:选择排序

                把0索引的元素,和索引1以后的元素都进行比较,第一次完毕,

    最小值出现在了0索引。同理,其他的元素就可以排好。

                

                

    public static void selectSort(int[] arr) {

            for (int x = 0; x < arr.length - 1; x++) {

                for (int y = x + 1; y < arr.length; y++) {

                    if (arr[y] < arr[x]) {

                        int temp = arr[x];

                        arr[x] = arr[y];

                        arr[y] = temp;

                    }

                }

            }

        }

     

        (2)查找

            A:基本查找

                使用场景:针对数组无序的情况(从头找到尾)

                

                

    public static int getIndex(int[] arr, int value) {

            int index = -1;

     

            for (int x = 0; x < arr.length; x++) {

                if (arr[x] == value) {

                    index = x;

                    break;

                }

            }

            return index;

        }

     

            B:二分查找(折半查找)

                应用场景:针对数组有序的情况

                注意事项:针对无序的数组,进行先排序,后查找,是有问题的?

    答:因为数组本身是无序的,所以这种情况下不能使用二分查找

    所以你先排序了,但是你排序的时候已经改变了该数组最初是的元素索引

                

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

            // 定义最小索引

            int min = 0;

            // 定义最大索引

            int max = arr.length - 1;

            // 计算中间索引

            int mid = (min + max) / 2;

            // 拿中间索引的值和被查找的值进行比较

            while (arr[mid] != value) {

                // 如果中间索引的值 比 被查找的值大了

                // 则最大索引 = 原中间索引 - 1

                if (arr[mid] > value) {

                    max = mid - 1;

                    // 如果中间索引的值 比 被查找的值小了

                    // 则最小索引 = 中间索引 + 1

                } else if (arr[mid] < value) {

                    min = mid + 1;

                }

                // 加入判断(如果没有该值的处理)

                if (min > max) {

                    return -1;

                }

     

                mid = (min + max) / 2;

            }

     

            return mid;

        }

     

        (3)Arrays工具类

            A:是针对数组进行操作的工具类。包括排序和查找等功能。

            B:要掌握的方法(自己补齐方法)

                1:public static String toString(int[] a) : 把数组转成字符串

                2:public static void sort(int[] a) : 对数组进行排序

    3:public static int binarySearch(int[] a, int key):二分查找,返回查找值的索引    

    1. Arrays工具类的源码解析

      Public static String toString(int[] a) 的源码分析

      public static int binarySearch(int[] a, int key)源码分析

       

      public static String toString(int[] a)源码分析

      public static void sort(int[] a) 底层是快速排序,知道就可以了。有空看,有问题再问我

      public static int binarySearch(int[] a,int key)

      开发原则:

          只要是对象,我们就要判断该对象是否为null

       

      int[] arr = { 24, 69, 80, 57, 13 };

      System.out.println("排序前:" + Arrays.toString(arr));

      // 这是源码

          public static String toString(int[] a) {

              // a -- arr -- { 24, 69, 80, 57, 13 }

       

              if (a == null)

                  return "null"; // 说明数组对象不存在

              int iMax = a.length - 1; // iMax=4;

              if (iMax == -1)

                  return "[]"; // 说明数组存在,但是没有元素。

       

              StringBuilder b = new StringBuilder();

              b.append('['); // "["

              for (int i = 0;; i++) {

                  b.append(a[i]); // "[24, 69, 80, 57, 13"

                  if (i == iMax)

                      // "[24, 69, 80, 57, 13]"

                      return b.append(']').toString();

                  b.append(", "); // "[24, 69, 80, 57, "

              }

          }

      public static int binarySearch(int[] a, int key)源码分析

       

      int[] arr = {13, 24, 57, 69, 80};

      System.out.println("binarySearch:" + Arrays.binarySearch(arr, 577));

       

      // 源码

          public static int binarySearch(int[] a, int key) {

              // a -- arr -- {13, 24, 57, 69, 80}

              // key -- 577

              return binarySearch0(a, 0, a.length, key);

          }

      private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {

              // a -- arr -- {13, 24, 57, 69, 80}

              // fromIndex -- 0

              // toIndex -- 5

              // key -- 577

       

              int low = fromIndex; // low=0

              int high = toIndex - 1; // high=4

       

              while (low <= high) {

                  int mid = (low + high) >>> 1; // mid=2,mid=3,mid=4

                  int midVal = a[mid]; // midVal=57,midVal=69,midVal=80

       

                  if (midVal < key)

                      low = mid + 1; // low=3,low=4,low=5

                  else if (midVal > key)

                      high = mid - 1;

                  else

                      return mid; // key found

              }

              return -(low + 1); // key not found.

          }

       

          (5)把字符串中的字符进行排序

              举例:

                  "edacbgf"

                  得到结果

                  "abcdefg"

       

      3. Integer(掌握)

          (1)说明:

      为了让基本类型的数据进行更多的操作,Java就为每种基本类型提供了对应的包装类类型

              byte         Byte

              short        Short

              int            Integer

              long        Long

              float        Float

              double        Double

              char        Character

              boolean        Boolean

          (2)Integer的构造方法

              A: Integer i = new Integer(100);

              B: Integer i = new Integer("100");

                  注意:这里的字符串必须是由数字字符组成

          (3)Stringint的相互转换

              A:String --> int

                  Integer.parseInt("100");

              B:int --> String

                  String.valueOf(100);

          (4)其他的功能(了解)

              一、进制转换

      1:public static String toBinaryString(int i) :二进制

      2:public static String toOctalString(int i) :八进制

      3:public static String toHexString(int i) : 十六进制

      1. 进制数的范围:

        范围:2 - 36

        因为:只有 0 -9 a - z 36个数字和字母

        三、十进制 到 其他进制

        1: public static String toString(int i, int radix):

        参数说明:i :表示10进制值

        Radix:表示进制

        例如:Integer.toString(100, 8);    表示把 10进制的100 转成 8进制

      Integer.toString(100, 16); 表示把 10进制的100 转成16进制

      1. 其他进制 到 十进制

        1:public static int parseInt(String s, int radix)

        例如: Integer.parseInt("100", 2); 表示把二进制的100转成10进制

        Integer.parseInt("67", 8); 表示把8进制的67转成10进制

          (5)JDK5的新特性

              自动装箱    基本类型--包装类型

              自动拆箱    包装类型--基本类型

      注意一个小问题:

      在使用,Integer x = null; 代码会出现 NullPointException异常

      建议:先判断是否为 null, 然后再使用

              

              把下面的这个代码理解即可:

                  

      Integer i = 100;

              i += 200;

              // 通过反编译后的代码

              // Integer ii = Integer.valueOf(100); //自动装箱

              // ii = Integer.valueOf(ii.intValue() + 200); //自动拆箱,再自动装箱

              // System.out.println((new StringBuilder("ii:")).append(ii).toString());

       

          (6)面试题

              结论:对Integer类型的数据直接赋值的时候,如果在-128 127 之间的,

      会直接从缓冲池里面获取数据,否则重新创建一个Integer对象并返回

      /*

               * 看程序写结果

               *

               * 注意:Integer的数据直接赋值,如果在-128127之间,会直接从缓冲池里获取数据

               */

              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

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

       

              Integer i5 = 128;

              Integer i6 = 128;

              System.out.println(i5 == i6);//false

              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));//false

       

              // 通过查看源码,我们就知道了,针对-128127之间的数据,做了一个数据缓冲池,如果数据是该范围内的,每次并不创建新的空间

              // Integer ii = Integer.valueOf(127);

       

      4. Character(了解)

          (1)Character构造方法    

              Character ch = new Character('a');

          (2)要掌握的方法:(自己补齐)

              A:判断给定的字符是否是大写字符    

                  public static boolean isUpperCase(char ch)

              B:判断给定的字符是否是小写字符

                  public static boolean isLowerCase(char ch)

              C:判断给定的字符是否是数字字符

                  public static boolean isDigit(char ch)

              D:把给定的字符转成大写字符

                  public static char toUpperCase(char ch)

              E:把给定的字符转成小写字符

                  public static char toLowerCase(char ch)

          (3)案例:

              统计字符串中大写,小写及数字字符出现的次数

              

      import java.util.Scanner;

      /*

      * 统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。

      (不考虑其他字符)

      *

      * 分析:

      *         A:定义三个统计变量。

      *             int bigCont=0;

      *             int smalCount=0;

      *             int numberCount=0;

      *         B:键盘录入一个字符串。

      *         C:把字符串转换为字符数组。

      *         D:遍历字符数组获取到每一个字符

      *         E:判断该字符是

      *             大写    bigCount++;

      *             小写    smalCount++;

      *             数字    numberCount++;

      *         F:输出结果即可

      */

      public class MainDemo {

          public static void main(String[] args) {

              // 定义三个统计变量。

              int bigCount = 0;

              int smallCount = 0;

              int numberCount = 0;

       

              // 键盘录入一个字符串。

              Scanner sc = new Scanner(System.in);

              System.out.println("请输入一个字符串:");

              String line = sc.nextLine();

       

              // 把字符串转换为字符数组。

              char[] chs = line.toCharArray();

       

              // 历字符数组获取到每一个字符

              for (int x = 0; x < chs.length; x++) {

                  char ch = chs[x];

       

                  // 判断该字符

                  if (Character.isUpperCase(ch)) {

                      bigCount++;

                  } else if (Character.isLowerCase(ch)) {

                      smallCount++;

                  } else if (Character.isDigit(ch)) {

                      numberCount++;

                  }

              }

       

              // 输出结果即可

              System.out.println("大写字母:" + bigCount + "");

              System.out.println("小写字母:" + smallCount + "");

              System.out.println("数字字符:" + numberCount + "");

          }

      }

       

       

  • 相关阅读:
    「从零单排canal 03」 canal源码分析大纲
    「从零单排canal 02」canal集群版 + admin控制台 最新搭建姿势(基于1.1.4版本)
    「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)
    实时数据订阅与分发系统概述
    使用phoenix踩的坑与设计思考
    「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践
    「从零单排HBase 11」HBase二级索引解决方案
    「从零单排HBase 10」HBase集群多租户实践
    「从零单排HBase 09」HBase的那些数据结构和算法
    Netty源码分析之自定义编解码器
  • 原文地址:https://www.cnblogs.com/Prozhu/p/5874518.html
Copyright © 2011-2022 走看看