Java EE 第五篇 核心类库(二)常用类库

要求:熟悉常用类库的使用,整理常用方法。

一、objects类

示例方法:

  1. equals()

    public static boolean equals(Object a, Object b)
    /**
    返回true如果参数相等,彼此false其他。 因此,如果这两个参数是null , true返回,如果只有一个参数为null , false返回。 否则,通过使用第一个参数的equals方法确定相等性。 
    参数 
    a - 一个对象 
    b - 要与 a进行比较以获得相等性的对象 
    结果 
    true如果参数彼此相等,否则为 false 
    */
    
    //源码
        public static boolean equals(Object a, Object b) {
            return (a == b) || (a != null && a.equals(b));
        }
    
  1. toString()

    1、toString(Object o)
    /**
    返回调用的结果 toString对于非 null参数, "null"为 null的说法。 
    参数 
    o - 一个物体 
    结果 
    调用的结果 toString对于非 null参数, "null"为 null的说法 
    */
    
    //源码
    public static String toString(Object o) {
            return String.valueOf(o);
        }
    
    public static String valueOf(Object obj) {
            return (obj == null) ? "null" : obj.toString();
        }
    
    2、toString(Object o, String nullDefault)
    /**
    如果第一个参数不是 null ,则返回在第一个参数上调用 toString的结果,否则返回第二个参数。 
    参数 
    o - 一个物体 
    nullDefault - 如果第一个参数是 null ,则返回的字符串 
    结果 
    如果它不是 null ,则在第一个参数上调用 toString ,否则调用第二个参数
    */
    public static String toString(Object o, String nullDefault) {
            return (o != null) ? o.toString() : nullDefault;
        }
    
  2. compare()

    public static <T> int compare(T a, T b, Comparator<? super T> c)
    /**如果参数相同则返回0,否则返回c.compare(a, b) 。 因此,如果两个参数都是null则返回0。 
    请注意,如果其中一个参数为null , NullPointerException可能会或可能不会抛出null ,具体取决于订购策略(如果有), Comparator选择具有null值。 
    
    参数类型 
    T - 要比较的对象的类型 
    参数 
    a - 一个物体 
    b - 要与 a进行比较的对象 
    c - 比较前两个参数的 Comparator 
    结果 
    如果参数相同 c.compare(a, b) 0,否则为 c.compare(a, b) 。
    */
        
    //源码
    public static <T> int compare(T a, T b, Comparator<? super T> c) {
            return (a == b) ? 0 :  c.compare(a, b);
        }
    

二、Math类

方法:

  1. abs()

    //源码,求参数的绝对值
    public static int abs(int a) {
            return (a < 0) ? -a : a;
        }
    
  2. min()

    //源码,返回两个参数中的较小值
    public static int min(int a, int b) {
            return (a <= b) ? a : b;
        }
    
  3. max()

    //源码,返回两个参数中的较大值
    public static int max(int a, int b) {
            return (a >= b) ? a : b;
        }
    
  4. round() 四舍五入

  5. floor() 返回小于等于参数的最大整数

  6. ceil() 返回大于等于参数的最小整数

    //源码较为复杂,展示使用过程
    System.out.println(Math.floor(100.5));
    System.out.println(Math.ceil(100.5));
    System.out.println(Math.round(100.5));
    System.out.println(Math.floor(-3.5));
    System.out.println(Math.floor(-3.5));
    System.out.println(Math.ceil(-3.5));
    System.out.println(Math.round(-3.5));
    /**
    100.0
    101.0
    101
    -4.0
    -4.0
    -3.0
    -3
    */
    

三、Arrays

方法:

  1. binarySearch(int[] original, int key)

    public static int binarySearch(int[] a, int key)
    /**
    使用二进制搜索算法在指定的int数组中搜索指定的值。 在进行此调用之前,必须对数组进行排序(如sort(int[])方法)。 如果未排序,则结果未定义。 如果数组包含具有指定值的多个元素,则无法保证找到哪个元素。 
    参数 
    a - 要搜索的数组 
    key - 要搜索的值 
    结果 
    搜索键的索引,如果它包含在数组中; 否则, (-(insertion point) - 1) 。 插入点定义为键将插入到数组中的点:第一个元素的索引大于键,或者如果数组中的所有元素都小于指定键, a.length 。 请注意,当且仅当找到密钥时,这才能保证返回值> = 0。 
    */
        
    //源码
    public static int binarySearch(int[] a, int key) {
            return binarySearch0(a, 0, a.length, key);
        }
    
    private static int binarySearch0(int[] a, int fromIndex, int toIndex,
                                         int key) {
            int low = fromIndex;
            int high = toIndex - 1;
    
            while (low <= high) {
                int mid = (low + high) >>> 1;
                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.
        }
    
    
  2. sort()

    public static void sort(int[] a)
    /**将指定的数组按升序排序。 
    实施说明:排序算法是Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch的双枢轴快速算法。 该算法在许多数据集上提供O(n log(n))性能,导致其他快速排序降级为二次性能,并且通常比传统(单枢轴)Quicksort实现更快。 
    
    参数 
    a - 要排序的数组 
    */
    
  3. toString()

    public static String toString(int[] a)
    /**
    返回指定数组内容的字符串表示形式。 字符串表示由数组元素的列表组成,用方括号括起来( "[]" )。 相邻元素由字符", " (逗号后跟空格)分隔。 元素将转换为字符串,如String.valueOf(int) 。 返回"null"如果a为null 。 
    参数 
    a - 要返回其字符串表示形式的数组 
    结果 
    字符串表示形式 a 
    */
    
    //源码
    public static String toString(int[] a) {
            if (a == null)
                return "null";
            int iMax = a.length - 1;
            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(", ");
            }
        }
    
  4. copyOf()

    public static int[] copyOf(int[] original, int newLength)//使用零复制指定的数组,截断或填充(如有必要),以使副本具有指定的长度。 对于在原始数组和副本中都有效的所有索引,这两个数组将包含相同的值。 对于在副本中有效但不在原件中有效的任何索引,副本将包含0 。 当且仅当指定的长度大于原始数组的长度时,这些索引才会存在。 
    /**参数 
    original - 要复制的数组 
    newLength - 要返回的副本的长度 
    结果 
    原始数组的副本,用零截断或填充以获得指定的长度 
    异常 
    NegativeArraySizeException - 如果 newLength是负数 
    NullPointerException - 如果 original为空 
        
    //源码
    public static int[] copyOf(int[] original, int newLength) {
            int[] copy = new int[newLength];
            System.arraycopy(original, 0, copy, 0,
                             Math.min(original.length, newLength));
            return copy;
        }
    
    应用:
    public static void main(String[] args) {
            int[] arr = {8,1,2,3,4,5,6,7};
            System.out.println(arr.toString());//非Arrays静态方法
            Arrays.sort(arr);
            System.out.println(Arrays.toString(arr));
            System.out.println(Arrays.binarySearch(arr,6));
            arr = Arrays.copyOf(arr,10);
            System.out.println(arr.length);
        }
    /**
    [I@7c30a502
    [1, 2, 3, 4, 5, 6, 7, 8]
    5
    10
    */
    

四、BigDecimal

解决double类型数据运算的精度丢失问题

方法:分别对应加减乘除,构造方法接收一个字符串参数表示小数

  1. add()
  2. substract()
  3. multiply()
  4. divide()
应用:
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");
System.out.println(b1.add(b2));
System.out.println(b1.multiply(b2));
System.out.println(b1.divide(b2));
System.out.println(b1.subtract(b2));

//获取值
b1 = b1.add(b2);
double res = b1.doubleValue();//转为double结果
System.out.println(res);

/**
0.3
0.02
0.5
-0.1
0.3
*/

五、Date

可以表示毫秒,并解释为年月日小时等,由于不适于国际化,故国际化的工作使用Calendar类完成。解释为年月日、格式化解析字符串的功能使用DateFormat类完成,故Date真正使用的场景仅在于获取毫秒值,表示特定的时刻。

方法

  1. getTime()

    /**
    public long getTime()
    返回自此 Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。 
    结果 
    自1970年1月1日00:00:00 GMT以来的毫秒数。
    */
    
  2. 构造方法Date()

    //获取当前的时间,返回毫秒值
    public Date()分配一个 Date对象并对其进行初始化,使其表示分配的时间,测量 Date到毫秒。 
    

    构造方法Date(long date)

    /**public Date(long date)分配 Date对象并将其初始化以表示自标准基准时间(称为“纪元”)以来的指定毫秒数,即1970年1月1日00:00:00 GMT。 
    参数 
    date - 格林威治标准时间1970年1月1日00:00:00之后的毫秒数 
    */
    
  3. setTime()

    /**
    public void setTime(long time)
    将此 Date对象设置为表示格林威治标准时间1970年1月1日00:00:00之后的 time毫秒的时间点。 
    参数 
    time - 毫秒数。 
    */
    
    应用:
    Date date = new Date();
    System.out.println(date);
    
    long time = date.getTime() - (1*60*60*1000);
    Date date2 = new Date(time);
    System.out.println(date2);
    
    //Wed Oct 07 10:53:13 CST 2020
    //Wed Oct 07 09:53:13 CST 2020
    

六、DateFormat类

对Date进行格式化工作

  • DateFormat是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化和分析日期或时间。日期/时间格式化子类(例如[SimpleDateFormat](SimpleDateFormat.html) )允许格式化(即,日期→文本),解析(文本“日期”)和规范化。日期表示为Date`对象或自1970年1月1日00:00:00 GMT以来的毫秒数。

    DateFormat提供了许多类方法,用于根据默认或给定的区域设置和多种格式样式获取默认日期/时间格式化程序。 格式化风格包括FULLLONGMEDIUMSHORT 。 在方法描述中提供了更多细节和使用这些样式的示例。

    DateFormat可帮助您格式化和解析任何区域设置的日期。 您的代码可以完全独立于几个月,一周中的日期,甚至是日历格式的区域设置约定:月球与太阳能。

DateFormat是一个抽象类,不能直接使用,需要使用子类SimpleDateFormat。

应用:

  1. 将Date对象转化为指定的字符串

    SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm ss");
    String text = format.format(new Date());
    System.out.println(text);
    
  2. 将字符串转为Date(获得毫秒时间戳,可以进行运算,计算时间差,或换算小时、天数等)

    Date date = format.parse("2020年12月12日 12:12 40");
            System.out.println((new Date().getTime() - date.getTime())/1000/60/60/24);
    //-66
    

七、Calendar类

可以对Date对象转换时区,抽象类,但是可以使用getInstance方法来返回子类对象。

//常用方法 set、get、add getTime()
Calendar cl = Calendar.getInstance();//默认获得的是当前日期
int year = cl.get(Calendar.YEAR);
System.out.println(year);
int month = cl.get(Calendar.MONTH);
System.out.println(month + 1);//日历0-11
int day = cl.get(Calendar.DAY_OF_MONTH);
System.out.println(day);

//修改日期
cl.set(Calendar.MONTH,10);
System.out.println(cl.get(Calendar.MONTH) + 1);

//日期加减
cl.add(Calendar.YEAR,1);
cl.add(Calendar.MONTH,3);
cl.add(Calendar.MONTH,-3);

//getTime():获取日历时间表示的Date对象
System.out.println(cl.getTime());

//getActualAcrualMaxium():获取参数字段的最大值
System.out.println(cl.getActualMaximum(Calendar.DAY_OF_WEEK));
System.out.println(cl.getActualMaximum(Calendar.DAY_OF_MONTH));

/**
2020
10
7
11
Sun Nov 07 12:20:27 CST 2021
7
30
*/

八、String类

  1. 类内使用数组存放字符串中的各个字符,数组确定长度之后无法改变,所以String是不可变类型。
  2. 由于String对象是不可变的,所以可以共享,两次创建相同的字符串,实际上仅在(字符串常量池)堆区分配一块内存,两个变量指向同一个地址。但是通过new方式创建的同内容字符串,地址还是不一样的。区别=和new构造的区别。
  3. 字符串常量池之前在方法区,之后JDK1.7之后,被拿到了堆区中,运行时常量池还在方法区,也就是永久代(不会被GC回收,只有关闭JVM才会被回收),永久代移到堆内存中之后,自JDK1.8起,方法区的实现改为元空间。永久代中存储的都是加载一次的,所有定义方法的信息,属于共享区间,供多个线程共享(静态变量、常量、类信息、运行时常量池)。堆内存中也分为新生代、老年代、永久代。
  4. String有final修饰,不能被继承,方法也不能被重写。
  5. 大量字符串拼接,多次拼接的场景下,不要使用加号,会导致在内存中出现大量垃圾,由于处于永久代中,不会被GC回收,要使用StringBuffer类和StringBuilder中提供的append方法进行尾部拼接。StringBuffer类是线程安全的和StringBuilder是线程不安全的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345