day11;其他常用类(Calendar,Date,正则表达式等)

一:

1: Arrays:针对数组操作的工具类  (提供了一些针对数组排序和二分搜索法)

              public static String toString(int[] a):可以将int类型的数组转换成字符串 ([元素1,元素2,元素3...])
              public static void sort(int[] a)对指定的 int 型数组按数字升序进行排序

              public static int binarySearch(int[] a,int key):二分搜索法: 在int类型的数组中查找key元素的索引

1)  对Arrays中toString(int[] a)和 binarySearch(int[] a,int key)的源码分析:

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


public static String toString(int[] a)
//toString(int[] a)的源码


//以后在实际开发中,只要有引用类型,在对引用类型数据进行操作的时候,对引用类型的对象进行非空判断,
//防止空指针异常(NullPointerException)


public static String toString(int[] a) {
        if (a == null) //对数组进行非空判断
            return "null";
        int iMax = a.length - 1; //arr.length-1   //a--->arr
        if (iMax == -1)
            return "[]";


        StringBuilder b = new StringBuilder();  //创建了一个字符串缓冲区
        b.append('['); //先追加了左中括号:[
        for (int i = 0; ; i++) {
            b.append(a[i]); //给缓冲区中追加数组中的元素
            if (i == iMax)
                return b.append(']').toString(); //返回并且并追加了右中括号:]并且将数据元素转换字符串
            b.append(", "); //如果不是最后一个索引,那么中间追加逗号
            
            //if(i == iMax){
            // return b.append(']').toString();
            //}else{
             // b.append(", ");
            //}
        }
    }
    
    
 public static int binarySearch(int[] a,int key)
 //它的源码:
 public static int binarySearch(int[] a, int key) {//a--->arr key-->577
        return binarySearch0(a, 0, a.length, key);
    }
    
    /**
     a--->arr:指定的int类型的数组
     fromIndex:指定索引开始:0
     toIndex:arr.length 5 
     key:577
    */
     nt[] arr = {13,24,57,69,80} ;
     private static int binarySearch0(int[] a, int fromIndex, int toIndex,
                                     int key) {
        int low = fromIndex;     //最小索引
        int high = toIndex - 1;//  最大索引  4


        while (low <= high) { //如果最小索引小于=最大索引  
            int mid = (low + high) >>> 1;  >>> :无符号右移动(位运算符)    //中间索引:mid = 2 ,3 ,4 
             位^:位异或
             位&:位与
             位|:位或
             << :左移动
             有符合的数据表示法(原码,反码,补码)
             计算机底层运算数据的时候:通过补码进行运算的
            int midVal = a[mid]; // 查找中间索引对应的元素:arr[2] = 57   69  80 


            if (midVal < key) //判断:中间索引对应的元素 < key =577
                low = mid + 1; //low = mid + 1;   mid = (取到最大的mid的值) 4+1 = 5 
            else if (midVal > key)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found.    // return  -(low+1) = -6
    }

2:Calendar类:日历类;Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

    1):public static Calendar getInstance() :通过一个静态功能来创建日历了对象;

    2):Calendar中的两个常用方法:
             public abstract void add(int field,int amount)根据日历的规则,为给定的日历字段添加或减去指定的时间量 (这个方法常用)
             public final void set(int year, int month,int date)设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值

3:System 类: System 类包含一些有用的类字段和方法。它不能被实例化。

     常用的方法:

public static void gc()运行垃圾回收器,实质是执行的finalize()方法

public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码;  一般情况,需要终止

Jvm,那么参数0

public static long currentTimeMillis()返回以毫秒为单位的当前时间

                        public static void arraycopy(Object src,int srcPos, Object dest,int destPos, int length):
                     从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束
                     src:原数组
                     dest:目标数组
                     srcPos :从原数组的哪个位置开始
                     destPos:到目标数组的哪个位置结束
                     length:长度

4: java.util.Date:  类 Date 表示特定的瞬间,精确到毫秒

    1) 构造方法:
public Date()表示分配它的时间(精确到毫秒)。
public Date(long date):创建一个日期对象,指定毫秒值 (需要将long 时间毫秒值转换成Date对象)

  public void setTime(long time):设置毫秒值

    2)方法: public long getTime()   将Date--->long的毫秒值

                  * 重点:Date的日期格式和日期的文本格式:String类型 之间进行转换
 * 
 * Date---->String(格式化)
 * 
 * String-->Date(解析)
 * 
 * 中间的转换:使用中一个中间类:DateFormat,并且DateFormat是一个抽象类,抽象意味着不能实例化,所以应该考虑用它的子类:
 * SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
 * 
 * SimpelDateFormat的构造方法:
 * public SimpleDateFormat(String pattern) :构造一个SimpleDateFormat对象,根据pattern(模式:规则)
 * 
 * SimpleDateFormat sdf = new SimpleDateFormat("xxx年xx月xx日") ;
 * 
 *  日期和时间模式
 *  
 *  年: yyyy
 *  月: MM
 *  日: dd
 * 
 *  时: hh
 *  分: mm
 *  秒: ss
 *

 *实际开发中:牵扯时间的东西,经常Date--String  String--Date

       3):Date和Stirng文本格式进行相互转换的工具类

   import java.text.ParseException;
   import java.text.SimpleDateFormat;
   import java.util.Date;
/**
 * 这是Date和Stirng文本格式进行相互转换的工具类
 * @author Administrator
 * @version v1.0
 */
public class DateUtil {
//无参构造私有化
private DateUtil() {
}

/**
* 这是一个将Date的日期格式转换成日期的文本格式
* @param format  模式
* @param d      需要被格式化的Date格式
* @return 返回的就是日期的文本格式
*/
public static String dateToString(String format,Date d) {
/*SimpleDateFormat sdf = new SimpleDateFormat(format) ;
String s = sdf.format(d) ;
return s ;*/

return new SimpleDateFormat(format).format(d) ;
}

/**
* 这一个将字符串文本日期格式转换Date的日期格式的功能
* @param format  模式
* @param s  需要被解析的日期文本格式
* @return 返回的就Date日期格式
* @throws ParseException 解析如果出问题了,就会有这个异常
*/
public static Date stringToDate(String format,String s) throws ParseException {

return new SimpleDateFormat(format).parse(s) ;
}

}

5:Math 类:Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。  

        1) 常用的方法:

 * public static int abs(int a):绝对值

 * public static double ceil(double a):向上取整

 * public static double floor(double a):向下取整

 * public static int max(int a,int b):求最大值

 * public static int min(int a,int b):求最小值

 * public static double pow(double a,double b):a的b次幂

 * public static double random()返回带正号的 double 值,该值大于等于 0.0 且小于 1.0

 * public static int round(float a):四射五入

 * public static double sqrt(double a):一个数的正平方根

 *              JDK5的特性:静态导入(导入方法的级别)

//位^的特点:一个数据被另一个数据位^两次,其值是它本身

//=号左边: a ,b,a
//=右边: a^b
a = a ^ b ; 
b = a ^ b ;//b = a^b ^ b
a = a ^ b ; 
System.out.println("a:"+a+",b:"+b);

6:Random: Random类是一个可以获取随机数的类

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

 *public Random(long seed) :指定long类型的数据进行构造随机数类对象

 *public int nextInt():获取随机数,它的范围是在int类型范围之内

 *public int nextInt(int n):获取随机数,它的范围是在[0,n)之间


7:正则表达式:

     字符

x x字符
\\ 反斜线字符
\t 制表符 
\n 换行符
\r 回车符 


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

预定义字符类:
. 任何字符 如果本身就是. \. qq.com 写正则表达式(\\.) 
\d 数字:[0-9] 写正则表达式 :\\d
\w 单词字符:[a-zA-Z_0-9]:字母大小写,数字字符 \\w


边界匹配器:
^ 行的开头 
$ 行的结尾 
\b 单词边界 尾 (helloword?haha:world)


Greedy 数量词(重点)
X? X,一次或一次也没有 
X* X,零次或多次 
X+ X,一次或多次 
X{n} X字符恰好出现n次
X{n,} X字符至少出现n次
X{n,m} X字符至少出现n次,但不超过m次

 

2): public String replaceAll(String regex,String replacement)  使用给定的 replacement 替换此字符串所有匹                 配给定的正则表达式的子字符串

3):
/**
 *关于模式和匹配器典型调用基本顺序
 *
 * Pattern和Matcher
 *
 */
public class RegexDemo5 {


public static void main(String[] args) {
//1)将正则表达式编译成一个模式对象
// public static Pattern compile(String regex)将给定的正则表达式编译到模式中
Pattern p = Pattern.compile("a*b") ;
//2)通过模式对象,构造一个匹配器对象(Matcher对象)
// Matcher matcher(String input)  :模式对象转换成匹配器对象
Matcher m = p.matcher("aaaaaab") ;
 
//3)匹配器对象有一个方法:machers() ; 直接对当前字符串数据进行校验,返回boolean
//public boolean matches()
boolean flag = m.matches() ;
System.out.println("flag:"+flag);
 
System.out.println("-------------------------");
 
//如果单纯的判断字符串是否符合正则规则,上述代码非常麻烦,
String regex = "a*b" ;
String str = "aaaaab" ;
 
boolean flag2 = str.matches(regex) ;
System.out.println("flag2:"+flag2);
}

}

4): * public String[] split(String regex) :   字符串的分割功能,按照指定的格式进行分割,分割后返回的是一个字符串数组


5):*键盘录入邮箱,校验邮箱

 * 邮箱:
 * qq邮箱
 * 126邮箱
 * 163邮箱
 * 新浪微博邮箱
 * 企业邮箱 
 * 919081924@qq.com
 * zhangsan@163.com
 * xibukaiyuan@westos.com.cn
 *
 */
public class RegexTest {


public static void main(String[] args) {

//创建键盘录入对象
Scanner sc =new Scanner(System.in) ;

//接收数据
System.out.println("请输入一个邮箱:");
String email = sc.nextLine() ;

//定义正则规则
// String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]+){1,4}" ;
String regex = "\\w+@\\w{2,6}(\\.\\w+){1,4}";
boolean flag = email.matches(regex) ;
System.out.println("flag:"+flag);


}

}

6)ObjectArray:对象数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值