07 Object类,Scanner,Arrays类,String类,StringBuffer类,包装类

Object类的概述:
* A:Object类概述
    * 类层次结构的根类
    * 所有类都直接或者间接的继承自该类
* B:构造方法
    * public Object()
    * 子类的构造方法默认访问的是父类的无参构造方法

Object类的hashCode()方法

    * public int hashCode()
    * a:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
    * b:不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同

public class Demo_HashCode {
    public static void main(String[] args) {
        Object object1 = new Object();
        int hashCode = object1.hashCode();
        
        System.out.println(hashCode);
    }
}
View Code

Object类的getClass()方法
    * public final Class getClass()
    * a:返回此 Object 的运行时类。
    * b:可以通过Class类中的一个方法,获取对象的真实类的全名称。    
        * public String getName()

public class Demo_GetClass {

    public static void main(String[] args) {
        Person person = new Person();
        
        Class class1 = person.getClass();  // 获取该对象的字节码文件
        String name = class1.getName();  // 获取名称
        System.out.println(name); // com.fly.bean.Person

    }

}
View Code

Object类的toString()方法
    * public String toString()
    * a:返回该对象的字符串表示。
*
        
        public Stirng toString() {
            return name + "," + age;
        }
    * b:它的值等于:
        * getClass().getName() + "@" + Integer.toHexString(hashCode())
    * c:由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。

public class Demo_ToString {
    public static void main(String[] args) {
        /**
         *   public String toString() {
                return getClass().getName() + "@" + Integer.toHexString(hashCode

());
             }
         */
        Person person = new Person("张三",18);
//        String string = person.toString();
//        System.out.println(string); // com.fly.bean.Person@15db9742
        
        System.out.println(person.toString());
        System.out.println(person); // 如果直接打印对象的引用,会默认调用toString方

法
    }
}
View Code


Object类的equals()方法
    * a:指示其他某个对象是否与此对象“相等”。
    * b:默认情况下比较的是对象的引用是否相同。
    * c:由于比较对象的引用没有意义,一般建议重写该方法。

public class Demo_Equals {
    public static void main(String[] args) {
        /*
           public boolean equals(Object obj) {
                return (this == obj);
           }
        Object中的equals方法是比较对象的地址值
        开发中通常比较的是对象的属性值,相同属性是同一个对象
         * */
        Person person1 = new Person("张三",10);
        Person person2 = new Person("李四",11);
        Person person3 = new Person("李四",11);
        
        boolean b = person1.equals(person2);  // 比较两个对象是否相等
        System.out.println(b); //false
        
        System.out.println(person2.equals(person3)); //true // 重写之后比较的是对象

的属性值
    }
}
View Code


==号和equals方法的区别
    ==是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是

值,引用数据类型比较的是地址值
    equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,如果没有重

写Object类中的equals方法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是

对象中的属性
Scanner:

import java.util.Scanner;

public class Demo1_Scanner {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        int i = scanner.nextInt();
//        System.out.println(i);  //输入不是int类型 会抛出 InputMismatchException
        if (scanner.hasNextInt()) {
            int i = scanner.nextInt();
            System.out.println(i);
        }else {
            System.out.println("你输入的类型有误");
        }
    }

}
import java.util.Scanner;

public class Demo2_Scanner {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        System.out.println(string);  // 以\r\n作为结束标志
    }
}
public class Demo1_String {

    public static void main(String[] args) {
        String string = "abc"; // 字符串字面值"abc"也可以看成是一个字符串对象
        string = "def"; // 字符串是常量,一旦被赋值,就不能被改变
                        // 此时的"abc" 已经变为垃圾值
        System.out.println(string);
        
            // 常见的构造方法
        String string2 = new String(); // 空构造
        System.out.println(string2);
        
        byte[] bytes = {97,98,99};
        String string3 = new String(bytes); // 把字节数组转成字符串
        System.out.println(string3); // abc
        
        String string4 = new String(bytes, 1, 2); // 把字节数组的一部分转成字符串,
                                                

                              // String(byte[] bytes,int

index,int length)
        System.out.println(string4); // bc
        
        char[] value = {'a','b','c'};
        String string5 = new String(value); // 把字符数组转成字符串
        System.out.println(string5);  // abc

    }

}


String类的常见面试题:

* 1.判断定义为String类型的s1和s2是否相等
    * String s1 = "abc";
    * String s2 = "abc";
    * System.out.println(s1 == s2);     // true                
    * System.out.println(s1.equals(s2)); // true        
* 2.下面这句话在内存中创建了几个对象?  2个,一个在常量池,一个在堆内存中
    * String s1 = new String("abc");            
* 3.判断定义为String类型的s1和s2是否相等
    * String s1 = new String("abc");            
    * String s2 = "abc";
    * System.out.println(s1 == s2);    //false    ,地址不相同
    * System.out.println(s1.equals(s2)); //true
* 4.判断定义为String类型的s1和s2是否相等
    * String s1 = "a" + "b" + "c";
    * String s2 = "abc";
    * System.out.println(s1 == s2);    // true,java的常量优化机制    
    * System.out.println(s1.equals(s2));// true
* 5.判断定义为String类型的s1和s2是否相等
    * String s1 = "ab";
    * String s2 = "abc";   // 常量池
    * String s3 = s1 + "c"; // 指向堆内存的toString中
    * System.out.println(s3 == s2); //false
    * System.out.println(s3.equals(s2)); // true


String类的判断功能:

    * boolean equals(Object obj):比较字符串的内容是否相同,区分大小写
    * boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
    * boolean contains(String str):判断大字符串中是否包含小字符串
    * boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
    * boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾
    * boolean isEmpty():判断字符串是否为空。


"" 与null:

        /*
         *  ""是字符串常量,同时时一个String类的对象
         *  null是空常量,不能调用任何方法,否则或出现空指针异常,可以给任意的引用

数据类型赋值
         * */
        String string = "";
        String string2 = null;
        
        System.out.println(string.isEmpty()); // true
    //    System.out.println(string2.isEmpty()); // NullPointerException

String类的获取功能:

/*String类的获取功能
    * int length():获取字符串的长度。
    * char charAt(int index):获取指定索引位置的字符
    * int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
    * int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
    * int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现

处的索引。
    * int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一

次出现处的索引。
    * lastIndexOf
    * String substring(int start):从指定位置开始截取字符串,默认到末尾。
    * String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。顾头

不顾尾*/

public class Demo2_StringMethod {

    public static void main(String[] args) {
        // 获取字符串的长度
        String string = "fly";
        System.out.println(string.length()); //3
        String string2 = "飞?";
        System.out.println(string2.length()); // 2
        // 获取指定索引位置的字符
        char c = string2.charAt(0);
        System.out.println(c); ////返回指定字符在此字符串中第一次出现处的索引,找不到返回-1
        int i = string.indexOf('l');
        System.out.println(i); // 1
        
    }

}

String的转换功能:
    * byte[] getBytes():把字符串转换为字节数组。
    * char[] toCharArray():把字符串转换为字符数组。
    * static String valueOf(char[] chs):把字符数组转成字符串。
    * static String valueOf(int i):把int类型的数据转成字符串。
        * 注意:String类的valueOf方法可以把任意类型的数据转成字符串

    * String toLowerCase():把字符串转成小写。(了解)
    * String toUpperCase():把字符串转成大写。
    * String concat(String str):把字符串拼接。
    // gbk码表,一个中文代表两个字节,第一个字节肯定是负数

String类的其他功能
* A:String的替换功能   找不到不替换
    * String replace(char old,char new)
    * String replace(String old,String new)
* B:String的去除字符串两空格及案例演示
    * String trim()
* C:String的按字典顺序比较两个字符串
    * int compareTo(String str) 比较的是Unicode码表
    * int compareToIgnoreCase(String str) 不区分大小写
    


import java.util.Scanner;

public class Test2 {

    public static void main(String[] args) {
        /*
         * 输入的字符串反转
         * */
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String string = scanner.nextLine();
        
        String s = "";
        char[] c = string.toCharArray(); // 将字符串转换为字符数组
        for (int i = c.length-1; i >= 0; i--) {
            s =s + c[i];
        }
        System.out.println(s);
    }

}
public class Demo1_StringBuffer {

    public static void main(String[] args) {
        /*
         * StringBuffer的构造方法的使用
         * */
        StringBuffer sb =  new StringBuffer();
        System.err.println(sb.length()); //0  容器的字符个数,实际值
        System.out.println(sb.capacity()); //16 容器的初始容量,理论值
        
        StringBuffer sb2 = new StringBuffer(10);
        System.out.println(sb2.length()); // 0
        System.out.println(sb2.capacity()); //10
        
        StringBuffer sb3 = new StringBuffer("fly");
        System.out.println(sb3.length()); //3
        System.out.println(sb3.capacity()); //19  16+3
    }




public class Demo2_StringBuffer {

    public static void main(String[] args) {
        StringBuffer sBuffer = new StringBuffer();// StringBuffer是字符串缓冲区,

new在堆内存创建一个对象
        StringBuffer sb = sBuffer.append(true);  // 不会创建对象,在不断向原缓冲区

添加字符
        StringBuffer sb2 = sBuffer.append("fly");
        StringBuffer sb3 = sBuffer.append(123);
        
        System.out.println(sb); // truefly123  StringBuffer类重写了toString方法
        System.out.println(sb2); // truefly123
        System.out.println(sb3); // truefly123
    }

}
public class Demo3_StringBuffer {
    public static void main(String[] args) {
//        sbDelete(); // 删除功能
/*        StringBuffer sbBuffer = new StringBuffer("hello");
        sbBuffer.replace(0, sbBuffer.length(), "hi");
        System.out.println(sbBuffer); //hi
        
        sbBuffer.reverse(); // 反转
        System.out.println(sbBuffer); //ih
*/        
        StringBuffer sBuffer2 = new StringBuffer("hello world");
//        String str = sBuffer2.substring(6);   // 截取
//        System.out.println(str);  // world
        
        String str2 = sBuffer2.substring(0, 5);
        System.out.println(str2); // hello
        
        
    }

    private static void sbDelete() {
        StringBuffer  sBuffer = new StringBuffer();
//        sBuffer.deleteCharAt(5);
//        System.out.println(sBuffer); // StringIndexOutOfBoundsException 删除不存在

的
        sBuffer.append("fly");
//        sBuffer.deleteCharAt(2);
//        System.out.println(sBuffer); // fl
        
        sBuffer.delete(0, sBuffer.length()); // 清空缓冲区
        System.out.println(sBuffer);
    }
}
public class Demo4_StringBuffer {

    public static void main(String[] args) {
        // String转为StringBuffer
        StringBuffer sBuffer = new StringBuffer("fly");
        System.out.println(sBuffer);
        
        StringBuffer sBuffer2 = new StringBuffer();
        sBuffer2.append("fly");
        System.out.println(sBuffer2);
        // StringBuffer转为String
        StringBuffer builder = new StringBuffer("fly");
        String string = new String(builder);
        System.out.println(string);
        
        String string2 = builder.toString();
        System.out.println(string2);
        
        String string3 = builder.substring(0, builder.length());
        System.out.println(string3);
    }

}


StringBuffer与StringBuilder
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无

需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了

一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,

因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

public class Demo5_StringBuffer {

    public static void main(String[] args) {
        String string = "hello";
        System.out.println(string); // hello
        change(string);
        System.out.println(string); // hello
        
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("hello");
        System.out.println(stringBuffer); //hello
        change(stringBuffer);
        System.out.println(stringBuffer); //helloworld
    }

    private static void change(StringBuffer stringBuffer) {
        stringBuffer.append("world");
    }

    private static void change(String string) {
        string += "world"; // String类虽然是引用数据类型,但当作参数传递时和基本数

据类型是一样的
    }

}

排序:

public class Demo1_Array {

    public static void main(String[] args) {
        int[] arr = {23,69,70,57,15};
        
//        bubbleSort(arr);
        selectSort(arr);
        stringPrint(arr);
    }
    // 冒泡排序
    public static void bubbleSort(int[] 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 temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
    //选择排序
    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }
    
    public static void stringPrint(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

}


二分查找:

public class Demo2_Array {

    public static void main(String[] args) {
        // 二分查找
        // 前提必须是有序的
        int[] arr = {11,22,33,44,55,66,77};
        System.out.println(getIndex(arr, 55)); //4
        System.out.println(getIndex(arr, 88)); //-1
    }
    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) {
                max = mid - 1;
            }else if(arr[mid] < value) {
                min = mid + 1;
            }
            mid = (min + max) / 2;
            if(min > max) {
                return -1;
            }
        }
        return mid;
    }

}


Arrays类的使用:

import java.util.Arrays;

public class Demo3_Arrays {
    // Arrays类的使用
    public static void main(String[] args) {
        int[] arr = {33,22,55,11,44};
        // 数组转字符串
        System.out.println(Arrays.toString(arr)); //[33, 22, 55, 11, 44]
        
        // 排序
        // 底层用的快速排序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr)); // [11, 22, 33, 44, 55]
        
        int[] arr2 = {11,22,33,44,55,66,77};
        // 二分查找
        // 有序的,不能有相同的
        System.out.println(Arrays.binarySearch(arr2, 22)); //1
        System.out.println(Arrays.binarySearch(arr2, 77)); //6
        System.out.println(Arrays.binarySearch(arr2, 12)); //-2
        System.out.println(Arrays.binarySearch(arr2, 99)); //-8 找不到返回  应在的

位置负数后-1
    }
}
/*基本类型和包装类的对应:
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean*/

public class Demo1_Integer {

    public static void main(String[] args) {
        // 进制
        System.out.println(Integer.toBinaryString(60)); // 111100
        System.out.println(Integer.toOctalString(60)); // 74
        System.out.println(Integer.toHexString(60)); //3c
        //int 类型能够表示的最大值,最小值
        System.out.println(Integer.MAX_VALUE); // 2147483647
        System.out.println(Integer.MIN_VALUE); // -2147483648
        //数字
        Integer integer = new Integer(100);
        System.out.println(integer); //100
        //数字字符串
        Integer integer2 = new Integer("100");
        System.out.println(integer2); //100
        
        // int--String
        int i = 100;
        String string = i + "";  // 方式1   //推荐
        String string2 = String.valueOf(i);  // 方式2     //推荐
        Integer integer3 = new Integer(i);  // 方式3
        String string3 = integer3.toString();
        String string4 = Integer.toString(i); // 方式4
        
        // String--int
        String string5 = "200";
        Integer integer4 = Integer.parseInt(string5); // 方式1   //推荐
        Integer integer5 = new Integer(string5); // 方式2
        int i5 = integer5.intValue();
        
        // parseXX方法
        // Character没有,字符串到字符的转换通过toCharArray()就可以把字符串转换为字

符数组
        
        
    }

}
public class Demo4_JDK5 {

    /**
     * * A:JDK5的新特性
            * 自动装箱:把基本类型转换为包装类类型
            * 自动拆箱:把包装类类型转换为基本类型
        * B:案例演示
            * JDK5的新特性自动装箱和拆箱
            
            * Integer ii = 100;
            * ii += 200;
        * C:注意事项
            * 在使用时,Integer  x = null;代码就会出现NullPointerException。
            * 建议先判断是否为null,然后再使用。
     */
    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 i3 = null;
//        int a = i3 + 100;                        //底层用i3

调用intValue,但是i3是null,null调用方法就会出现
//        System.out.println(a);                    //空指针异常

java.lang.NullPointerException
    }

}
public class Demo5_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 = 127;
        Integer i6 = 127;
        System.out.println(i5 == i6);                //true
        System.out.println(i5.equals(i6));            //true
        System.out.println("-----------");
    
        Integer i7 = 128;
        Integer i8 = 128;
        System.out.println(i7 == i8);               // false
        System.out.println(i7.equals(i8));            //true
        
        /*
         * -128到127是byte的取值范围,如果在这个取值范围内,自动装箱就不会新创建对象,

而是从常量池中获取
         * 如果超过了byte取值范围就会再新创建对象
         *
         * public static Integer valueOf(int i) {
                assert IntegerCache.high >= 127;  // 断言
                if (i >= IntegerCache.low && i <= IntegerCache.high)            

//i>= -128 && i <= 127
                    return IntegerCache.cache[i + (-IntegerCache.low)];
                return new Integer(i);
            }
         */
    }

}

猜你喜欢

转载自www.cnblogs.com/fly-book/p/9849208.html
今日推荐