【黑马程序员】StringBuffer,Array,Integer,BigInteger,Date,Calendar,集合——Java复习笔记

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

StringBuffer

(1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了一个字符串缓冲区类:StringBuffer供我们使用。

(2)StringBuffer的构造方法
    A:StringBuffer()
    B:StringBuffer(int size)
    C:StringBuffer(String str)
//不能把字符串的值直接赋值给StringBuffer

(3)StringBuffer的常见功能(ABCD功能的方法返回值都是StringBuffer,E功能返回的是String)

    A:添加功能 append添加  insert插入
        append()方法返回的是本身,不是新对象          
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = sb.append(“hello”);
Sout(sb1+”,”+sb2);//输出hello,hello
        如果sb2也是new的 则输出 ,hello

        insert(index,str)从index位置开始插入 str变成该位置元素 该位置原有元素右移

    B:删除功能 
        deleteCharAt(index) 删除指定位置的字符并返回本身   
        delete(start,end) 删除从指定位置开始指定位置结束的内容并返回本身,删除的内容包括start不包括end

    C:替换功能 replace(start,end,str)

    D:反转功能 reverse()

    E:截取功能(注意这个返回值) 
        substring(start)
        substring(start,end) 截取后返回的是String对象,StringBuffer还是原来的内容(未被截取)

(4)String和StringBuffer相互转换
    String —> StringBuffer
        构造方法new StringBuffer(str) 或者 append()方法,建议构造方法

    StringBuffer —> String
        构造方法new String(sb)  或者 toString()方法,建议toString

(5)面试题  
    A:String,StringBuffer,StringBuilder的区别
        String是内容不可变 另外俩都是内容可变
        StringBuffer:同步的,数据安全,效率低。
        StringBuilder:不同步的,数据不安全,效率高。  
            安不安全都是指的多线程情况下,一般单线程不会有安全问题

    B:StringBuffer和数组的区别?   
        SB不管添加什么类型数据,都是作为字符串放进去的
        数组只能放同一类型的数据,是什么类型就是什么类型

(6)注意的问题:
    String是一种特殊的引用类型,作为形式参数时当做基本数据类型看,形参改变,实参不变
    StringBuffer作为形式参数若直接赋值,则形参变,实参不变。若调用了方法,则实参改变      
(7)练习
判断字符串是否为对称的  两个方法
方法1
    public static boolean isSymmetic(String s ){
        StringBuffer sb = new StringBuffer(s);
        for (int x= 0;x<sb.length()/2;x++){
            if (sb.charAt(x) != sb.charAt(sb.length()-x-1)){
                return false;
            }
        }
        return true;
    }
方法2
    public static boolean isSymmetic2(String s ){
        return new StringBuffer(s).reverse().toString().equals(s);
    }

数组高级以及Arrays工具类

(1)排序
    A:冒泡排序
        相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。同理,其他的元素就可以排好。        
    /**
     * 冒泡排序
     * 比较第一轮后 最大值出现在末尾,下次不用比较倒数1,2数
     * 比较第二轮后 第二大值出现在倒数第二位,下次不用比较倒数2,3数
     * ....
     * 总共比较 arr.length-1轮  每比较完一轮,下轮就少比较一次
     */
    public static int[] maoPao(int[] arr){
        for (int x = 0; x<arr.length -1 ;x++){
            for (int i = 1; i<arr.length-x;i++){
                if (arr[i] < arr[i-1]){
                    arr[i-1] = arr[i-1] ^ arr[i];
                    arr[i] = arr[i-1] ^ arr[i];
                    arr[i-1] = arr[i-1] ^ arr[i];
                }
            }
        }
        return arr;
    }
    B:选择排序
        把0索引的元素,和索引1以后的元素都进行比较,第一次完毕,最小值出现在了0索引。同理,其他的元素就可以排好。      
    /**
     * 选择排序
     * 从0开始 依次和后面的元素比较,小的往前放,一轮后最小值到了首位   比较了arr.length-1次
     * 从1开始 依次和后面的元素比较,小的往前放,一轮后第二小的值到了第二位  比较了arr.length-2次
     * ....
     * 总共比较arr.length-1轮,
     */

    public static int[] xuanZe(int[] arr){

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

            for (int i = x+1; i<arr.length;i++){
                if (arr[x] > arr[i]){     //每一轮都是用固定的位置和其他位置比较
                    arr[x] = (arr[x]+arr[i])-(arr[i]=arr[x]); //交换数据
                }
            }
        }
        return arr;
    }   
(2)查找
    A:基本查找
        针对数组无序的情况。一个一个找

    B:二分查找(折半查找)
        针对数组有序的情况(千万不要先排序再查找。无意义)   
    /**
     * 折半查找(二分查找)
     * 前提:数组有序
     * 核心:每次都找中间的元素进行比较,没找到则下次查找工作量减半
     * 注意:二分查找对无序数组无意义,要用基本查找(一个一个找)
     */

    public static int findMe(int[] arr,int key){
        arr = xuanZe(arr);
        System.out.println("排序后得:");
        System.out.println(Arrays.toString(arr));

        int min = 0 , max = arr.length-1;
        int mid = (min+max)/2;

        while (key != arr[mid]){
//            if (mid == 0 || mid == arr.length-1){     //或者min>max
//                return -1;
//            }
            if (key > arr[mid]) {
                min = mid + 1;
            }else {
                max = mid - 1;
            }
            mid = (min+max)/2;

            if (min>max){
                return -1;
            }
        }
        return mid;
    }
(3)Arrays工具类
    要掌握的方法
        把数组转成字符串:toString
        排序: sort    //底层方法是快速排序
        二分查找:binarySearch

(4)Arrays工具类的源码解析
    开发原则:只要是对象,就要判断该对象是否为null,内容是否为空

    二分查找源码:
int low = fromIndex;    //0
int high = toIndex - 1;     //arr.length-1
while (low <= high) {
    int mid = (low + high) >>> 1; //无符号右移1位即mid/2
    int midVal = a[mid];
    if (midVal < key)
        low = mid + 1;
     else if (midVal > key)
         high = mid - 1;
     else
         return mid;     // key found
}
return -(low + 1);   // key not found.
(5)练习
对字符串中的字符进行排序
    /**
     * 对字符串中的字符进行排序 选择排序冒泡排序都可以
     * @param arr
     * @return
     *  字符串转数组:toCharArray方法
     *  数组转字符串:String的构造方法 or String的valueOf方法 or Array工具类的toString方法
     */
    public static String xuanZe(char[] arr){

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

            for (int i = x+1; i<arr.length;i++){
                if (arr[x] > arr[i]){     //每一轮都是用固定的位置和其他位置比较
                    arr[x] = (char)((arr[x]+arr[i])-(arr[i]=arr[x])); //交换数据
                }
            }
        }
        return String.valueOf(arr);
    }

Integer类

(1)为了让基本类型的数据进行更多的操作,Java就为每种基本类型提供了对应的包装类类型
    byte        Byte
    short       Short
    int         Integer
    long        Long
    float       Float
    double      Double
    char        Character
    boolean     Boolean

(2)Integer的构造方法
Integer i = new Integer(100);
Integer i = new Integer(“100”); //这里的字符串必须是由数字字符组成
(3)String和int的相互转换
    A:String -- int 两种方法
        1 Integer.parseInt("100”); //重点推荐此种,记住
        2 new Integer(“100”).intValue();

    B:int -- String 四种方法
        1 String.valueOf(100);  //推荐此种方法 可把任意类型转成字符串
        2 String s = “” + 100;
        3 String s = newInteger(100).toString();
        4 String s = Integer.toString(100);

(4)其他的功能
    int范围 Integer.MAX_VALUE     MIN_VALUE

    进制转换 Integer.toBinaryString   toHexString  toOctalString 这三个方法都是十进制转其他进制,返回值都是字符串
        十进制到N进制 Integer.toString(int s,N);    2 <= N <= 36  返回值为String   
        N进制到十进制 Integer.parseInt(“1024”,N)  //要转换的数要作为字符串传进去

(5)JDK5的新特性
    自动装箱    把基本类型—>包装类类型
    自动拆箱    包装类类型—>基本类型

    把下面的这个代码理解即可:
        Integer i = 100; // JDK5以后可以这么写。原来应该是Integer i = new Integer(100);
        i += 200;  //i转int类 加完后再转回Integer
    注意:若Integer x = null;则会出现空指针异常。 所以用之前先判断是否为空

(6)面试题
Integer i = 127;
Integer i3 = 128;
Integer i2=127;
Integer i4 = 128;

i==i2;//true 
i3==i4;//false
    这样赋值,实际上编译器会编译成调用valueOf方法赋值,通过查看源码得知,对-128~127之间的数据做了数据缓冲池,如果数据在该范围内,则赋值时不创建新空间,直接从缓冲池内获取数据;若不在该范围内则new Integer()

Character

(1)Character构造方法只有一个    
    Character ch = new Character('a');

(2)要掌握的方法:(都是静态,直接通过类名调用)
    A:判断给定的字符是否是大写 isUpperCase
    B:判断给定的字符是否是小写 isLowerCase
    C:判断给定的字符是否是数字字符 isDigit
    D:把给定的字符转成大写    toUpperCase
    E:把给定的字符转成小写    toLowerCase

正则表达式

(1)就是符合一定规则的字符串

(2)常见规则
    A:字符
        x 字符 x。举例:'a'表示字符a
        \\ 反斜线字符。
        \n 新行(换行)符 ('\u000A') 
        \r 回车符 ('\u000D')

    B:字符类
        [abc] a、b 或 c(三选一) 
        [^abc] 任何字符,除了 a、b 或 c(否定) 
        [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) 
        [0-9] 0到9的字符都包括 

    C:预定义字符类
        . 任何字符。我的就是.字符本身,怎么表示呢? \.
        \d 数字:[0-9]
        \w 单词字符:[a-zA-Z_0-9]
            在正则表达式里面组成单词的东西必须有这些东西组成

    D:边界匹配器
        ^ 行的开头 
        $ 行的结尾 
        \b 单词边界
            就是不是单词字符的地方。
            举例:hello world?haha;xixi    

    E:Greedy 数量词 
        X? 一次或零次
        X* 零次或多次
        X+ 一次或多次
        X{n} 恰好 n 次 
        X{n,} 至少 n 次 
        X{n,m} 至少 n 次,但是不超过 m 次 

(3)常见功能:
    A:判断功能
        String类的public boolean matches(String regex)

    B:分割功能
        String类的public String[] split(String regex)

    C:替换功能
        String类的public String replaceAll(String regex,String replacement)

    D:获取功能
        Pattern和Matcher
Pattern p = Pattern.compile(“a*b”);//将匹配规则编译到Pattern对象中
Matcher m = p.matcher("aaaaab”);//通过Pattern对象得到匹配器对象并将被匹配数据传入匹配器中
boolean b =m.matches();//true   可用链式编程简化 但还是不如直接用matches方法简单
        find():查找存不存在
        group():获取刚才查找过的数据,调group前必须先调find,不然会报错    

(4)练习
    1. 分割字符串并排序然后转回字符串
        /**
         * 分割功能split案例
         * 分割字符串并排序然后转回字符串
         *
         * 分割-转int数组-排序
         */
        String s = "18 25 103 32 95 39";
        String regex = " ";//空格分割
        //split方法得到每个数字的字符串数组
        String[] ss = s.split(regex);

        //创建int数组
        int[] arr = new int[ss.length];
        //遍历String数组 并转为int放入int数组
        int i =0;
        for (String x:ss){
            System.out.print(x+" ");
            arr[i] = Integer.parseInt(x);
            i++;
        }
        //排序
        Arrays.sort(arr);
        //换行
        System.out.println();
        ///转回字符串输出
        StringBuilder sb = new StringBuilder();
        for (int x=0;x<arr.length;x++){
            if (x == arr.length-1){
                sb.append(arr[x]);
            }else {
                sb.append(arr[x]+" ");
            }
        }
        System.out.println(sb.toString());
    2. 替换功能replaceAll
        String s = "hello3149world841java09";
//        String regex = "\\d+"; //相邻数字全替换为一个星
        String regex = "\\d"; //每个数字替换一个星
        s = s.replaceAll(regex,"*");
        System.out.println(s);
    3. 获取功能
        //find
        String s = "da kjk ijqro dsaj iq rqjfa ;qieru ais dq a iiq r sad d sd ewq tr";
        String regex = "\\b\\w{3}\\b"; //要加入单词边界,这样才匹配的整个单词
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(s);

//        boolean flag = m.find(); //find方法查找有没有满足条件的子串
//        String ss = m.group();  //group获取查找到的值  调用group前必须先调find 不然会报错
//        System.out.println(ss);

        while(m.find()){    //找到就打印
            System.out.println(m.group());
        }

Math

常见方法
    A:绝对值 abs  返回值int
    B:向上取整 ceil  返回值double
    C:向下取整 floor 返回值double
    D:两个数据中的大值 max min
    E:a的b次幂 pow(a,b)  返回值double
    F:随机数 random    [0.0~1.0)
    G:四舍五入 round 返回值int
    H:正平方根 sqrt  返回值double  

练习:设计一个方法 获取任意范围的随机数
    public static int getRandom(int start,int end){
        return  (int)(Math.random()*(end-start+1)+start); //end-start+1得到范围总数 乘random得到随机数 然后再+start然随机数取值从最小值开始
    }

Random类

(1)用于产生随机数的类

(2)构造方法:
    A:Random() 默认种子,是当前时间的毫秒值,每次产生的随机数不同
    B:Random(long seed) 指定种子,每次种子相同,随机数就相同
    给定种子后,每次得到的随机数都一样

(3)成员方法:
    A:int nextInt() 返回int范围内的随机数
    B:int nextInt(int n) 返回[0,n)范围内的随机数

System

(1)系统类,提供了一些有用的字段和方法

(2)成员方法
    A:运行垃圾回收器 gc
    执行System.gc前,系统会自动调用finalize方法清除对象占有的资源,子类重写finalize方法,通过super.finalize方式可以实现从下到上的finalize方法调用,即先释放自己的资源,再去释放父类的资源

    B:退出jvm 
    exit(int) 终止当前正在运行的Java虚拟机,参数用作状态码,非0表示异常终止。一般要退出给0就行 

    C:获取当前时间的毫秒值 
    currentTimeMillis 一般应用在计算运行时间,程序运行前后各获取一次,相减得程序运行时间。

    D:数组复制(这个方法名特殊,全小写) 
    arraycopy(Object src,int srcPos,Object dest,int destPos,int length) 从数组中复制一个数组,从指定位置开始到指定位置结束
        --src 原数组; 
        --srcPos 原数组中的起始位置;
        --dest 目标数组; 
        --destPos 目标数据中的起始位置; 
        --length 要复制的数组元素的数量
        复制后目标数组的长度不会变,新数据会覆盖旧数据。
int[] arr = {11,22,33,44,55};
int[] arr2={6,7,8,9,10};
System.arrcopy(arr,1,arr2,2,2);
//打印出来arr数组不变,arr2变成{6,7,22,33,10}

BigInteger

(1)针对大整数的运算

(2)构造方法 
    BigInteger(String s)

(3)成员方法
    A:加 add
    B:减 subtract
    C:乘 mutiply
    D:除 divide
    E:商和余数 divideAndRemainder  返回的是商和余数的数组

BigDecimal

(1)浮点数据做运算,会丢失精度。所以,针对浮点数据的操作建议采用BigDecimal。(金融相关的项目)

(2)构造方法 
    BigDecimal(String s)

(3)成员方法:
    A:加减乘除同BigInteger

    B:自己保留小数几位 divide(BigDecimal bd除数,int scale商的小数有几位,int roundingMode商要应用的舍入模式)

Date/DateFormat(掌握)

 原始时间1970年1月1日0点

(1)Date是日期类,可以精确到毫秒。
    A:构造方法
        Date() 根据默认毫秒值创建日期对象
        Date(long time) 根据给定的毫秒值time创建日期对象

    B:成员方法
        getTime() 获取时间 以毫秒为单位
        setTime(long time) 设置时间

    C:日期和毫秒值的相互转换 
        日期转毫秒值  new Date().getTime();   
        毫秒值转日期  setTime(time)或new Date(time);

(2)DateFormat针对日期进行格式化和针对字符串进行解析的类,但是是抽象类,所以使用其子类SimpleDateFormat
    A:SimpleDateFormat(String pattern) 给定模式
        yyyy-MM-dd HH:mm:ss  其他表示方式查看API

    B:日期和字符串的转换
        a:Date --> String(格式化)
            format()    
        b:String --> Date(解析)
            parse()
(3)练习:写一个程序计算你来到这个世界多少天
import java.text.ParseException;
import java.util.Scanner;

/**
 * Created by mo on 15/11/8.
 * 你来到这个世界多少天
 *
 * 出生年月日转为Date
 * getTime
 * 获取当前时间毫秒值
 * 相减再除以每天的毫秒值
 */

public class DateTest {
    public static void main(String[] args) throws ParseException {
        System.out.println(MyDays());
    }

    public static long MyDays() throws ParseException {

        System.out.println("请输入出生年月日,格式为:yyyy-MM-dd");
        Scanner sc = new Scanner(System.in);
        String birthday = sc.nextLine();

        long birth = DateUtil.stringToDate(birthday,"yyyy-MM-dd").getTime();
        long today = System.currentTimeMillis();
        return (today-birth)/86400000;
    }

    /**
     * 字符串转日期对象
     * @param date
     * @param parsePattern 被转换的日期格式
     * @return Date对象
     * @throws ParseException
     */
    public static Date stringToDate(String date,String parsePattern) throws ParseException{
        return new SimpleDateFormat(parsePattern).parse(date);
    }
}

Calendar类

(1)日历类
    装了所有的日历字段值,通过统一的方法根据传入不同的日历字段可以获取值。

(2)如何得到一个日历对象呢?
    Calendar rightNow = Calendar.getInstance(); //获取当前日历时间

    getInstance本质返回的是子类对象,Calendar是抽象类

(3)成员方法
    A:根据日历字段得到对应的值 
    int year = Calendar.getInstance().get(Calendar.YEAR); //month,date同理.month从0开始,即0表示1月

    B:根据日历字段和一个正负数确定是添加还是减去对应日历字段的值 add(Calendar.DATE,-5) //日期-5天。add方法无返回值,执行add方法后再重新获取值

    C:设置日历对象的年月日 set(int year,int month,int date)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值