Java学习第十五天---StringBuffer、StringBulider、数组排序(冒泡排序、选择排序、快速排序、插入排序、希尔排序)、Arrays、基本数据类型包装类

Java学习第十五天—StringBuffer、StringBulider、数组排序(冒泡排序、选择排序、快速排序、直接插入排序、希尔排序)、Arrays、基本数据类型包装类

StringBuffer

1.StringBuffer简述:
	我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。
	而StringBuffer就可以解决这个问题
	线程安全的可变字符序列
	StringBuffer和String的区别:
      StringBuffer  长度可变的字符序列
      String 长度不可变的字符序列  String s="abc"
      StringBuffer()  构造一个其中不带字符的字符串缓冲区  初始容量是16
      StringBuffer  其实可以看做是一个字符容器  可以不断的向这个容器中添加数据
2.StringBuffer的构造方法
	public StringBuffer():				无参构造方法
	public StringBuffer() {
        super(16);
    }
	public StringBuffer(int capacity):	指定容量的字符串缓冲区对象
	public StringBuffer(int capacity) {
        super(capacity);
    }
 	public StringBuffer(String str):		指定字符串内容的字符串缓冲区对象
 	第三个构造方法在计算capacity时与前两个不同,源码如下:
    public StringBuffer(String str) {
        super(str.length() + 16);//字符串长度加上默认容积
        append(str);
    }
3.StringBuffer的方法:
    public int capacity():返回当前容量。	理论值
    public int length():返回长度(字符数)。 实际值
4.StringBuffer的添加功能
	public StringBuffer append(String str):			可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
	public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
案例演示:
public class MyTest2 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        //获取容量
        int capacity = sb.capacity();
        System.out.println(capacity);
        //获取长度
        int length = sb.length();
        System.out.println(length);

        //往字符串缓冲区中添加内容 如果超过了默认的容量,会自动扩充
        StringBuffer sb2= sb.append("abcasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf");

        int length1 = sb.length();
        System.out.println(length1);
        System.out.println("=====================");

         /*  StringBuffer( int capacity)
        构造一个不带字符,但具有指定初始容量的字符串缓冲区。*/
        StringBuffer sb3 = new StringBuffer(100);
        System.out.println(sb3.capacity());
        sb3.append("abcdef");
        System.out.println(sb3.length());
    }
}
案例演示2:
public class MyTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        //往容器中追加内容,返回的还是缓冲区对象本身
        /*StringBuffer sb2 = sb.append("abc");
        System.out.println(sb==sb2);*/
        StringBuffer sb3 = sb.append("abc").append("bbb").append("cccc").append("ddd").append("eeee");
        System.out.println(sb==sb3);

        //取出容器中的内容  容器中的内容会以字符串的形式返回
        //StringBuffer重写了toString()方法,把容器中的内容拼接好以字符串的形式返回。
        String string = sb.toString();
        System.out.println(string);
    }
}
案例演示3:
public class MyTest3 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("aaa");
        sb.append("bbb");
        System.out.println(sb);
        //可以在指定位置插入任何数据,返回的还是字符串缓冲区本身
        sb.insert(0,"cccc");
        System.out.println(sb);
        //在索引3的前面插入数据
        sb.insert(3,"eeee");
        System.out.println(sb);
    }
}
5.StringBuffer的删除功能:
	public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
	public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
案例演示:
  public class MyTest1 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("好好学习,天天向上,大家五一快乐");
        //根据索引删除容器中的一个字符,返回的还是容器本身
        sb.deleteCharAt(0).deleteCharAt(0).deleteCharAt(0).deleteCharAt(0);
        System.out.println(sb);
        System.out.println("=====================");
        StringBuffer sb2 = new StringBuffer("好好学习,天天向上,大家五一快乐");
        //根据起始索引和终止索引删除一段内容,返回的还是容器本身
        sb2.delete(0,2);
        System.out.println(sb2);
    }
}
6.字符串的替代和反转功能
 public StringBuffer replace(int start,int end,String str):	从start开始到end用str替换
 public StringBuffer reverse():							字符串反转
 案例:
 public class MyTest2 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("红尘来呀来去呀去,都是一场梦");
        //根据起始索引和终止索引,替换一段内容。返回的还是容器本身
        sb.replace(0,8,"皮皮虾我们走");
        System.out.println(sb);//皮皮虾我们走,都是一场梦

        sb.reverse();
        System.out.println(sb);//梦场一是都,走们我虾皮皮
    }
}
7.字符串角标查找:
  从头查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
      int indexOf (String str)  
  从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
   int indexOf (String str,int fromIndex)	
   从后往前找
   int lastIndexOf (String str)
   int lastIndexOf (String str,int fromIndex) 
案例演示:
   public class MyTest4 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("尘红来呀来去呀去,都是一场梦");
        int index = sb.indexOf("来");
        System.out.println(index);//2
    }
}
8.StringBuffer的截取功能
    public String substring(int start):			从指定位置截取到末尾
	public String substring(int start,int end):	截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
	注意:返回值类型不再是StringBuffer本身,而是String类型
案例演示:
public class MyTest3 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("红尘来呀来去呀去,都是一场梦");
        //截取容器中的一段内容,返回的是截取到的字符串
        String s = sb.substring(3);
        System.out.println(s);//呀来去呀去,都是一场梦
        System.out.println("================================");
        //根据起始索引和终止索引,截取一段内容,以String类型返回。不会影响容器中的内容
        String s1 = sb.substring(0, 8);
        System.out.println(s1);//红尘来呀来去呀去
    }
}
9.StringBuffer和String类型的相互转换
 A:String -- StringBuffer
	a:通过构造方法
	b:通过append()方法
 B:StringBuffer -- String
	a: 使用substring方法
	b:通过构造方法
	c:通过toString()方法
案例:
public class MyTest {
    public static void main(String[] args) {
        //StringBuffer类型和String类型的相互转换

        // StringBuffer------>String
        StringBuffer sb = new StringBuffer("abcdef");
        sb.append("12345678");

        //方式1:使用toString()方法
        String string = sb.toString();
        System.out.println(string);

        //方式2:subString(0)
        String s = sb.substring(0);
        System.out.println(s);

        //方式3:可以采用String类中的构造方法
            /*  String(StringBuffer buffer)
        分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。*/
        String s1 = new String(sb);
        System.out.println(s1);

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

        // Stirng----->StringBuffer
        String str="abc";
        //方式1:采用StringBuffer的构造方法
        StringBuffer stringBuffer = new StringBuffer(str);
        System.out.println(stringBuffer);

        //方式2:使用append() insert()方法
        StringBuffer buffer = new StringBuffer();
        buffer.append("");
        buffer.insert(0,str);
        System.out.println(buffer);
    }
}

案例1分析:
 需求:把数组中的数据按照指定个格式拼接成一个字符串
 举例:int[] arr = {1,2,3};	
 输出结果:"[1, 2, 3]"
 public class MyTest1 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3,4,5};
        StringBuffer sb = new StringBuffer("[");
        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1){
                sb.append(arr[i]).append("]");
            }else{
                sb.append(arr[i]).append(",");
            }
        }
        String string = sb.toString();
        System.out.println(string);
    }
}
案例2分析:
 需求:把字符串反转
 举例:键盘录入"abc"		
 输出结果:"cba"
 public class MyTest2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一段字符串");
        String s = sc.nextLine();
     
        String string = new StringBuffer(s).reverse().toString();
        System.out.println(string);
    }
}

StringBuffer和StringBuilder的区别

1.StringBuffer和StringBuilder的区别:
   StringBuffer和StringBuilder的区别
     他们两个的API是相同的。
     区别是:线程安全方面的区别
     StringBuffer是线程安全的,效率低
     StringBuilder 线程不安全的,效率高。多线程环境下,可能会存在线程安全问题

   StringBuilder 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,
        但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,
        用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,
        建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

StringBuffer和String分别作为参数传递

1.形式参数问题
	String作为参数传递 String虽然是引用类型,但是它是一个常量,所以在做传递的时候,完全可以将其看成基本数据类型数据进行传递,String类型输入值传递
	StringBuffer作为参数传递 则是作为引用类型传递
案例:
public class MyTest {
    public static void main(String[] args) {
        //引用类型,作为参数传递,属于引用传递,传递的是地址值,形参的改变会影响实参。(String例外,String属于值传递)
        //但是String字符串比较特殊,虽说是String引用类型。但是他作为参数传递,属于值传递。
        String str="abc";
        test(str);
        System.out.println(str);//abc
        System.out.println("=======================");
        //引用类型,作为参数传递,属于引用传递,传递的是地址值,形参的改变会影响实参。
        StringBuffer sb = new StringBuffer("好好学习");
        test(sb);
        System.out.println(sb.toString());//好好学习,天天向上
    }

    private static void test(StringBuffer sb) {
        sb.append(",天天向上");
        System.out.println(sb);
    }

    private static void test(String str) {
        str+="我爱你";
        System.out.println(str);//abc我爱你
    }
}

数组排序之冒泡排序

1.冒泡排序原理:
   数组中的元素两两比较,大的往后放,经过一轮比较后,最大的元素,就出现在了最后面。
2.冒泡排序源代码:
  public class MyTest1 {
    public static void main(String[] args) {
    
        //冒泡排序:数组中的元素两两比较,大的往后放,经过一轮比较后,最大的元素,就出现在了最后面。
        int[] arr = {24, 69, 80, 57, 13, 20, 30, 1, 0, -1};
        // tuiDao(arr);

        //外层循环控制轮次
        /*for (int j = 0; j <arr.length-1; j++) {
            //里层循环进行两两比较
            for (int i = 0; i < arr.length - 1-j; i++) {
                if (arr[i] > arr[i + 1]) {
                    //值交换
                    int t = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = t;
                }
            }
        }
        System.out.println(Arrays.toString(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 t = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = t;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }

        private static void tuiDao(int[] arr){
            //第一轮:比较了四次
            for (int i = 0; i < arr.length - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    //值交换
                    int t = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = t;
                }
            }

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

            //第二轮:比较三次
            for (int i = 0; i < arr.length - 1 - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    //值交换
                    int t = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = t;
                }
            }
            System.out.println(Arrays.toString(arr));

            //第三轮:比较了2次
            for (int i = 0; i < arr.length - 1 - 1 - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    //值交换
                    int t = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = t;
                }
            }
            System.out.println(Arrays.toString(arr));

            //第四轮:比较了1次
            for (int i = 0; i < arr.length - 1 - 1 - 1 - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    //值交换
                    int t = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = t;
                }
            }
            System.out.println(Arrays.toString(arr));
        }
    }

数组排序之选择排序

1.选择排序原理:从0索引处的元素开始,依次跟他后面的元素挨个比较,小的往前放,经过一轮比较后,最小的元素就出现在最前面
案例:
public class MyTest2 {
    public static void main(String[] args) {
        //选择排序:从0索引处的元素开始,依次跟他后面的元素挨个比较,小的往前放,经过一轮比较后,最小的元素就出现在最前面
        int[] arr = {24, 69, 80, 57, 13};
        tuiDao(arr);
        System.out.println("===============");
        for(int index=0;index<arr.length-1;index++){
            for(int i=0+index;i<arr.length;i++){
                if(arr[index]>arr[i]){
                    int temp=arr[index];
                    arr[index]=arr[i];
                    arr[i]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));

    }

    private static void tuiDao(int[] arr) {
        //第一轮:从角标为0开始
        int index=0;
        for(int i=0+index;i<arr.length;i++){
            if(arr[index]>arr[i]){
                int temp=arr[index];
                arr[index]=arr[i];
                arr[i]=temp;
            }
        }
        System.out.println(Arrays.toString(arr));

        //第二轮:从角标为1开始
        index=1;
        for(int i=0+index;i<arr.length;i++){
            if(arr[index]>arr[i]){
                int temp=arr[index];
                arr[index]=arr[i];
                arr[i]=temp;
            }
        }
        System.out.println(Arrays.toString(arr));

        //第三轮:从角标为2开始
        index=2;
        for(int i=0+index;i<arr.length;i++){
            if(arr[index]>arr[i]){
                int temp=arr[index];
                arr[index]=arr[i];
                arr[i]=temp;
            }
        }
        System.out.println(Arrays.toString(arr));

        //第四轮:从角标为3开始
        index=3;
        for(int i=0+index;i<arr.length;i++){
            if(arr[index]>arr[i]){
                int temp=arr[index];
                arr[index]=arr[i];
                arr[i]=temp;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

数组排序之直接插入排序

1.直接插入排序原理:每次拿后面的一个元素,插入到之前的一个有序序列当中,使之仍保持有序.
案例:
public class MyTest3 {
    public static void main(String[] args) {
        //直接插入排序
        //每次拿后面的一个元素,插入到之前的一个有序序列当中,使之任保持有序.
    
        int[] arr = {10, 3, 20, 0, 1,-1,200,50,30,20,15};
        for(int i=0;i<arr.length;i++){
            int j=i;
            while(j>0 && arr[j]<arr[j-1]){
                int temp=arr[j];
                arr[j]=arr[j-1];
                arr[j-1]=temp;
                j--;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

数组排序之快速排序

案例:
public class ArrayUtils {
    //快速排序的方法
    public static void quickSort(int[] arr,int start,int end){
        if(start<end){
            //递归
            //获取基准数的索引,左右两区的界限
            int index=getIndex(arr,start,end);
            //对左区,进行递归
            quickSort(arr,start,index-1);
            //对右区,进行递归
            quickSort(arr,index+1,end);
        }
    }

    /*
    挖坑填数
   1. 将基准数挖出形成第一个坑。
    2.由后向前找比他小的数,找到后挖出此数填到前一个坑中。
    3.由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中。
    4.再重复执行2,3两步骤。
*/

    private static int getIndex(int[] arr, int start, int end) {
       int i=start;
       int j=end;
       //找一个数作为基准数
        int x=arr[i];
        //4.  重复2,3步骤
        while(i<j){
            //2.由后向前找比他小的数 找到后挖出此数填到第一个坑中
            while(i<j&&arr[j]>=x){
                j--;
            }
            //找到之后,挖坑填数
            if(i<j){
                arr[i]=arr[j];
                i++;//下一次要从前往后找,顺便让i递增一次
            }
            //3.由前向后找比他大或者和他相等的数,找到后也挖出次数填到前一个坑中
            while(i<j&&arr[i]<=x){
                i++;
            }
            //找到之后,挖坑填数
            if(i<j){
                arr[j]=arr[i];
                j--;//下次要从后往前找,那么就顺便让j递减一下
            }
        }
        //让基准数填到最后一个坑中
        arr[i]=x;

        return i;//i==j   返回基准数所在的位置
    }
}
public class MyTest {
    public static void main(String[] args) {
        int[] arr = {20, 30, 2, 3, 5, 6, 8, 1, 0, 10, -1, 20, 100, 50, 30, 9, 8};
        ArrayUtils.quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
}
  

数组排序值希尔排序

1.希尔排序原理:是对插入排序的一种优化 核心思想是合理选取增量 经过一轮排序之后,会让序列大致有序
  然后不断缩小增量 进行插入排序 直到增量为1  整个排序结束
  直接插入排序 其实是增量为1 的希尔排序
案例:
public class MyTest {
    public static void main(String[] args) {
        //希尔排序:是对插入排序的一种优化 核心思想是合理选取增量 经过一轮排序之后,会让序列大致有序
        //然后不断缩小增量 进行插入排序 直到增量为1  整个排序结束
        //直接插入排序 其实是增量为1 的希尔排序
        int[] arr={46,55,13,42,17,94,5,70,9,5,6,89,50,50,255};
        shellSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    private static void shellSort(int[] arr) {
       for(int h=arr.length/2;h>0;h/=2){
            for(int i=h;i<arr.length;i++){
                for(int j=i;j>h-1;j-=h){
                    if(arr[j]<arr[j-1]){
                        int temp=arr[j];
                        arr[j]=arr[j-1];
                        arr[j-1]=temp;
                    }
                }
            }
        }
        //克努特序列
        //int h=1;
        //h=h*3+1;
        //根据克努特序列选取第一次的增量
       /* int jiange=1;
        while(jiange<=arr.length/3){
            jiange=jiange*3+1;
        }
        for(int h=jiange;h>0;h/=2){
            for(int i=h;i<arr.length;i++){
                for(int j=i;j>h-1;j-=h){
                    if(arr[j]<arr[j-1]){
                        int temp=arr[j];
                        arr[j]=arr[j-1];
                        arr[j-1]=temp;
                    }
                }
            }
        }*/
    }
}

二分法查找

1.二分查找:前提数组元素必须有序   
  二分查找的思想:每一次都查中间的那个元素,比较大小就能减少一半的元素。
案例:
 public class MyTest2 {
    public static void main(String[] args) {
        //二分查找:前提是数组元素有序
        int[] arr = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
        //C:二分查找的思想:每一次都查中间的那个元素,比较大小就能减少一半的元素。
        int index=getIndex(arr,20);
        System.out.println("索引是:"+index);
    }

    private static int getIndex(int[] arr, int ele) {
        //定义最小索引
        int minIndex=0;
        //定义最大索引
        int maxIndex=arr.length-1;
        //计算中间索引
        int centerIndex=(minIndex+maxIndex)/2;

        while (minIndex <= maxIndex) {
            //如果我们要找的元素,正好等于中间索引所对应的元素,那就直接返回中间索引
            if (ele == arr[centerIndex]) {
                return centerIndex;
                //如果我们找的元素小于中间索引所对应的元素,我们就移动最大索引
            } else if (ele < arr[centerIndex]) {
                maxIndex = centerIndex - 1;
                //如果我们要找的元素大于中间索引所对应的元素,我们就移动最小索引
            } else if (ele > arr[centerIndex]) {
                minIndex = centerIndex + 1;
            }
            //再次计算中间索引
            centerIndex = (minIndex + maxIndex) / 2;
        }
        return -1;
    }
}

Arrays

1.Arrays类概述:针对数组进行操作的工具类。提供了排序,查找等功能。
2.成员方法:
 	public static String toString(int[] a)
	public static void sort(int[] a)
	public static int binarySearch(int[] a,int key) 二分查找
	static boolean equals(int[] a, int[] a2) 比较两个数组中的元素,是否一样
    static int[] copyOf(int[] original, int newLength)  复制旧数组中的元素到一个新的数组中,新的数组长度是newLength 从0开始复制旧数组
    static int[] copyOfRange(int[] original, int from, int to) 复制旧数组中的指定范围间的几个元素到新数组中
 案例1:
 public class MyTest2 {
    public static void main(String[] args) {
        //排序数组
        //public static void sort ( int[] a)
        int[] arr = {6,9,20, 30, 50, 2, 6, 0, 1, 4};
        Arrays.sort(arr);//升序排列  从小到大
        System.out.println(Arrays.toString(arr));
        //指定一段范围内的元素来进行排序
       /* Arrays.sort(arr,5,arr.length-1);
        System.out.println(Arrays.toString(arr));*/
        System.out.println("======================");
        Integer[] arr2 = {6, 9, 20, 30, 50, 2, 6, 0, 1, 4};
        Arrays.sort(arr2, new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {
                //a-b是升序  b-a是降序
                return b-a;
            }
        });
        System.out.println(Arrays.toString(arr2));
    }
}
案例2:
public class MyTest2 {
    public static void main(String[] args) {
        //排序数组
        //public static void sort ( int[] a)
        int[] arr = {6,9,20, 30, 50, 2, 6, 0, 1, 4};
        Arrays.sort(arr);//升序排列  从小到大
        System.out.println(Arrays.toString(arr));
        //指定一段范围内的元素来进行排序
       /* Arrays.sort(arr,5,arr.length-1);
        System.out.println(Arrays.toString(arr));*/
        System.out.println("======================");
        Integer[] arr2 = {6, 9, 20, 30, 50, 2, 6, 0, 1, 4};
        Arrays.sort(arr2, new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {
                //a-b是升序  b-a是降序
                return b-a;
            }
        });
        System.out.println(Arrays.toString(arr2));
    }
}
案例3:
public class MyTest4 {
    public static void main(String[] args) {
        int[] arr = {20, 25, 30, 70, 80, 90, 90, 100};
        int[] arr2 = {20, 25, 30, 70, 80, 90, 90,1000};
        //判断两个数组中的元素是否一样
        boolean b = Arrays.equals(arr, arr2);
        System.out.println(b);

          /*   public static boolean equals ( int[] a, int[] a2){
            if (a == a2)
                return true;
            if (a == null || a2 == null)
                return false;

            int length = a.length;
            if (a2.length != length)
                return false;

            for (int i = 0; i < length; i++)
                if (a[i] != a2[i])
                    return false;

            return true;
        }*/      
    }
}
案例4:
public class MyTest5 {
    public static void main(String[] args) {
          /*  static int[] copyOf ( int[] original, int newLength)
        复制旧数组中的元素到一个新的数组中,新的数组长度是newLength 从0开始复制旧数组*/
        int[] arr = {20, 25, 30, 70, 80, 90, 90, 100};
        //复制旧数组中的几个元素到新数组中
        int[] ints = Arrays.copyOf(arr, arr.length-3);
        System.out.println(Arrays.toString(ints));//[20, 25, 30, 70, 80]

        System.out.println("=========================");
        /*  static int[] copyOfRange ( int[] original, int from, int to)复制旧数组中的指定范围间的几个元素到新数组中*/
        // 2 起始索引  6 终止索引
        int[] ints1 = Arrays.copyOfRange(arr, 2, 6);
        System.out.println(Arrays.toString(ints1));//[30, 70, 80, 90]
    }
}

Integer类

1.基本类型包装类:为了对基本数据类型进行更多的操作,更方便的操作,java就针对每一种基本数据类型提供了对应的类类型.
  常用的操作之一:用于基本数据类型与字符串之间的转换。
  基本类型和包装类的对应:
              基本类型---------------包装类型(引用类型)
         *    byte                  Byte
         *    short                 Short
         *    int                   Integer
         *    long                  Long
         *    float                 Float
         *    double                Double
         *    char                  Character
         *    boolean                Boolean
2.Integer类的概述和构造方法
  Integer类的概述:Integer 类在对象中包装了一个基本类型 int 的值,
	该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,
	还提供了处理 int 类型时非常有用的其他一些常量和方法
  Integer类的构造方法:
    public Integer(int value)
	public Integer(String s)  //要个一个字面上是数字的字符串,如果不是就会报错
案例:
public class MyTest2 {
    public static void main(String[] args) {
        //Integer
     /* Integer( int value)
        构造一个新分配的 Integer 对象,它表示指定的 int 值。
        Integer(String s)
        构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。*/

        //把一个基本类型构造成其对应的包装类
        int num=100;
        Integer integer = new Integer(num);
        System.out.println(integer);

        // NumberFormatException: 数字格式化异常
        String str="153698";
        //可以传字符串类型,但是这个字符串,字面上要是一个有效数字,会自动转换
        //如果说,你传入的这个字符串。字面上不是一个有效的数字,就会报异常。
        Integer integer1 = new Integer(str);
        System.out.println(integer1);

    }
}
3.String和int类型的相互转换
  A:int -- String
	a:和""进行拼接
	b:public static String valueOf(int i)  String类中的静态方法 valueOf
	直接用String类调用 String.valueOf(num)
	c:int -- Integer -- String
	d:public static String toString(int i)
 B:String -- int
	a:String -- Integer -- intValue();
	b:public static int parseInt(String s)
案例:
  public class MyTest {
    public static void main(String[] args) {
        //String类型的数字 h和int类型的相互转化
        //int-->String
        int num=100;

        //方式1:拼接空串
        String s=num+"";
        System.out.println(s);//"100"
        
        //方式2:String类中的静态方法 valueOf
        String s1 = String.valueOf(num);
        System.out.println(s1);

        //方式3:
        Integer integer = new Integer(num);
        String string = integer.toString();
        System.out.println(string);

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

        //String-->int
        //方式1:
        String ss="100";
        Integer integer1 = new Integer(ss);
        int i = integer1.intValue();
        System.out.println(i);

        //方式2:Integer中的静态方法
        //NumberFormatException 你传入给parseInt()方法的参数,字面上不是一个有效的数字,会报异常。
        int i1 = Integer.parseInt("5000");
        System.out.println(i1);
    }
}
4.JDK5的新特性自动装箱和自动拆箱
    自动装箱:把基本类型转换为包装类类型
	自动拆箱:把包装类类型转换为基本类型
	
	Integer ii = 100;//自动装箱
	ii += 200;//自动拆箱 自动装箱
注:在使用时,Integer  x = null;代码就会出现NullPointerException。
	建议先判断是否为null,然后再使用。
案例:
public class MyTest1 {
    public static void main(String[] args) {
        //自动拆装箱:JDK1.5之后,引入的一个新特性
        //自动拆箱:将一个包装类型自动转换成他所对应的基本类型。
        //自动装箱:将一个基本数据类型自动转换成他所对应的包装类型。
        int num=100;
        Integer integer = new Integer(num);
        //自动装箱
        Integer integer1=num;
        Integer integer2=200;

        //自动拆箱
        Integer a = new Integer(2000);
        // 将引用类型a 自动拆箱成基本类型 3000
        int r=a+2;
        System.out.println(r);
    }
}

面试题:
 public class MyTest1 {
    public static void main(String[] args) {
        Integer i1 = new Integer(127);
        Integer i2 = new Integer(127);

        System.out.println(i1 == i2); //false
        //Integer这个类,重写了父类Object的equals()方法,比较的是两个值是否相同
        System.out.println(i1.equals(i2)); //true 127==127
        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 128==128
        System.out.println("-----------");
        //自动装箱
        Integer i5 = 128; //new Integer(128)
        Integer i6 = 128; //new Integer(128)
        System.out.println(i5 == i6); //false
        System.out.println(i5.equals(i6)); //true 128==128
        System.out.println("-----------");
        //自动装箱
        Integer i7 = 127;
        Integer i8 = 127;
        System.out.println(i7 == i8); //true
        System.out.println(i7.equals(i8)); //127==127 true
    }
}
 自动装箱 在内部会调用 Integer.valueOf(128) 装箱
 在Integer类里面有一个静态的内部类IntegerCache他有一个静态代码块,当Integer类一加载,静态的的内部类IntegerCache也加载,IntegerCache他里面的静态代码块也得加载。静态代码块里面会有一个Integer cache[];这个数组
  这个数组里面,放的就是一些提前创建好的Interge对象。
  当我们采用 Integer i7 = 127;这种方式定义一个Integer对象时,如果值在 -128到127 之前,他会从cache[]数组中返回一个对象给你
  所以,在自动装箱时,当装入的数值在-128~+127之间时,所对应的的Integer对象的地址值相同,当超过这个范围时,会新new一个对象,此时,地址值就不再相同了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值