stringBuffer、StringBuilder、排序、Arrays、Jdk1.5新特性,java基础知识十三

1.StringBuffer类的概述

* A:StringBuffer类概述

  * 通过JDK提供的API,查看StringBuffer类的说明

  * 1.线程安全的可变字符序列。

  * 2.可将字符串缓冲区安全地用于多个线程。

  * 3.StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

  * 4.每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

* B:简述安全问题

  * 线程安全效率低

* C:StringBuffer和String的区别

  * String是一个不可变的字符序列。

  * StringBuffer是一个可变的字符序列。

2.StringBuffer类的构造方法

* A:StringBuffer的构造方法:

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

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

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

* B:StringBuffer的方法:

  * public int capacity():返回当前容量。 理论值(16不掌握)

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

3.StringBuffer的添加功能和删除功能

* A:StringBuffer的添加功能

  * public StringBuffer append(String str):

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

  * public StringBuffer insert(int offset,String str):

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

* B:StringBuffer的删除功能

  * public StringBuffer deleteCharAt(int index):

    * 删除指定位置的字符,并返回本身

  * public StringBuffer delete(int start,int end):

    * 删除从指定位置开始指定位置结束的内容,并返回本身,包含头不包含尾。

4.StringBuffer的替换和反转功能

* A:StringBuffer的替换功能

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

  * 从start开始到end用str替换

* B:StringBuffer的反转功能

  * public StringBuffer reverse():

  * 将字符串反转

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

* A:StringBuffer的截取功能

  * public String substring(int start):

    * 从指定位置截取到末尾

  * public String substring(int start,int end):

    * 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置

* B:注意事项

  * 注意:返回值类型不再是StringBuffer本身,而是String。

6.StringBuffer和String的相互转换

* A:String --> StringBuffer

  * a:通过构造方法

    * 1.StringBuffer sb = new StringBuffer("myworld");//创建对象,一创建就调用构造方法。

  * b:通过append()方法

    * 2.StringBuffer sb = new StringBuffer();

     * sb.append("myworld");

* B:StringBuffer --> String

  * a:通过构造方法

    * 1. StringBuffer sb = new StringBuffer("wwwwh");

    * String s = new String(sb);

  * b:通过toString()方法

    * 2. StringBuffer sb = new StringBuffer("wwwwh");

    * String s = sb.toString();

  * c:通过subString(0,length);

    * 3. StringBuffer sb = new StringBuffer("wwwwh");

    * String s = sb.substring(0,sb.length());

7.把数组转成字符串

* 需求:把数组中的数据按照指定个格式拼接成一个字符串
            举例:
                int[] arr = {1,2,3};    
            输出结果:
                "[1, 2, 3]"
            用StringBuffer的功能实现
            public static void main(String[] args) {
                int[] arr = {1,2,3};
                StringBuffer sb = new StringBuffer("[");
                for (int i = 0; i < arr.length; i++) {
                    if(i == 2){
                        sb.append(arr[i] + "]");
                    }else {
                        sb.append(arr[i] + ",");
                    }
                }
                System.out.println(sb);
            }

8.字符串反转

需求:把字符串反转
            举例:键盘录入"abc"        
            输出结果:"cba"
        用StringBuffer的功能实现    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请从键盘输入一个字符串:");
            String str = sc.nextLine();
            StringBuffer sb = new StringBuffer(str);//利用构造把字符串对象转化成StringBuffer对象
            str = sb.reverse().toString();//利用StringBuffer类中的反转功能,然后再转化成字符串
            System.out.println(str);
        }

9.StringBuffer和StringBuilder的区别

* A:StringBuilder的概述

  * 通过查看API了解一下StringBuilder类

  * 1.一个可变的字符序列。

* B:面试题

  * String,StringBuffer,StringBuilder的区别?

  * StringBuffer和StringBuilder的区别。

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

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

  * String和StringBuffer,StringBuilder的区别?

    * String是一个不可变的字符序列。

    * StringBuffer,StringBuilder是可变的字符序列。

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

* String作为参数传递

  * String不会改变原有对象的值,一旦初始化就不能被改变

* StringBuffer作为参数传递

  * StringBuffer会改变原有对象的值。

11.数组高级冒泡排序原理案例

需求:
            数组元素:{24, 69, 80, 57, 13}
                请对数组元素进行排序。
            
            冒泡排序
                相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处
        public static void main(String[] args) {
            int[] arr = {24,69,80,57,13};
            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;
                    }
                }
            }
            for (int i : arr) {
                System.out.println(i);
            }
        }

数组高级选择排序原理

* 需求:
        * 数组元素:{24, 69, 80, 57, 13}
        * 请对数组元素进行排序。
        
        * 选择排序
            * 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
        public static void main(String[] args) {
            int[] arr = {66,55,44,33,22,11};
            for (int i = 0; i < arr.length - 1; i++) {
                for (int j = i + 1; j < arr.length; j++) {  //j = i+1 的作用是:当获取到最小值后,就该从下一位进    行比较
                    if(arr[i] > arr[j]){
                        int temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
            for (int i : arr) {
                System.out.println(i);
            }
        }    

12.Arrays类的概述和方法使用

* A:Arrays类概述

  * 1.此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。

  * 2.除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException。

  * 针对数组进行操作的工具类。

  * 提供了排序,查找等功能。

* B:成员方法

  * public static String toString(int[] a) //返回指定数组内容的字符串表示形式。

  * public static void sort(int[] a) //对int数组按数字升序进行排序

  * public static int binarySearch(int[] a,int key) //使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。

13.基本类型包装类的概述

* A:为什么会有基本类型包装类
    * 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。
* B:常用操作
    * 常用的操作之一:用于基本数据类型与字符串之间的转换。
* C:基本类型和包装类的对应
* 
        byte             Byte
        short            Short
        int                Integer
        long            Long
        float            Float
        double            Double
        char            Character
        boolean            Boolean

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

* A:Integer类概述

  * 通过JDK提供的API,查看Integer类的说明

  * 1.Integer 类在对象中包装了一个基本类型 int 的值。

  * 2.该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,

  * 3.还提供了处理 int 类型时非常有用的其他一些常量和方法

* B:构造方法

  * 1.public Integer(int value) //构造一个新分配的 Integer 对象,它表示指定的 int 值。

  * 2.public Integer(String s) //构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。

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

* A:int -- String
    * 1:和""(空字符串)进行拼接
        * int num = 100;
        * String s = num + ""; 
    * 2:public static String valueOf(int i)  //String 类中的ValueOf()方法,可将任意类型的数据,转换成字符串
        * int num = 100;
        * String s = String.valueOf(num); 
    * 3:int -- Integer -- String(Integer类的toString方法())
        * Integer i = new Integer(100); 
        * String s = i.ToString();
    * 4:public static String toString(int i)(Integer类的静态方法)
        * String s = Integer.ToString(100);
* B:String -- int
    * 1:String -- Integer -- int
        * public static int parseInt(String s)
        * String s = "100";
        * int i = Integer.parseInt(s);

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

* A:JDK5的新特性

  * 自动装箱:把基本类型转换为包装类类型

  * 自动拆箱:把包装类类型转换为基本类型

* B:案例演示

  * JDK5的新特性

    * 1.自动装箱和拆箱

    * 2.泛型

    * 3.增强for循环

    * 4.静态导入(导入的是方法)

    * 5.可变参数(其实就是一个大小可变的数组)

    * 6.互斥锁

  * Integer ii = 100;//自动装箱

  * ii += 200;//自动拆箱。

* C:注意事项

  * 在使用时,Integer x = null;代码就会出现NullPointerException。

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