Java中常用的类

参考JDK1.8 API 文档:链接: https://pan.baidu.com/s/1bp2dyQP2jmWYcDIF2u5nRA 提取码: 7pid

  • System、Math、BigDecimal
import java.math.BigDecimal;
import java.math.BigInteger;

public class MathDemo {
    public static void main(String[] args) {
        double d = Math.abs(-9.9);
        System.out.println(d);
        d = Math.sin(Math.PI);
        System.out.println(d);

        // 浮点数的运算有精度问题,解决:BigDecimal类
        System.out.println(0.09 + 0.01);// 0.09999999999999999
        System.out.println(1.0 - 0.33);// 0.6699999999999999
        System.out.println(0.0023 * 100);// 0.22999999999999998
        System.out.println(12.3 / 100);// 0.12300000000000001
        BigDecimal d1 = new BigDecimal("0.09");// 注意使用String类似构造,若使用double等构造仍然不精确
        BigDecimal d2 = new BigDecimal("0.01");
        System.out.println(d1.add(d2));// 0.10
        d1 = new BigDecimal("1.0");
        d2 = new BigDecimal("0.33");
        System.out.println(d1.subtract(d2));// 0.67
        d1 = new BigDecimal("0.0023");
        d2 = new BigDecimal("100");
        System.out.println(d1.multiply(d2));// 0.2300
        d1 = new BigDecimal("12.3");
        d2 = new BigDecimal("100");
        System.out.println(d1.divide(d2));// 0.123

        // BigInteger 用于解决超出long最大值的运算的
        long num = Long.MAX_VALUE;
        System.out.println(num);// 9223372036854775807
        System.out.println(num + 1);// -9223372036854775808
        System.out.println(BigInteger.valueOf(num).add(BigInteger.valueOf(1)));// 9223372036854775808

        // static double random() 返回值为 double值为正号,大于等于 0.0 ,小于 1.0 。 [0,1)
        // 打印 [0, 100)的随机数
        for (int i = 0; i < 10; ++i) {
            int randomNum = (int) (Math.random() * 100);
            System.out.println(randomNum);
        }
        System.out.println("-------------------------------");
        // static long round(double a) 返回参数中最接近的 long ,其中 long四舍五入为正无穷大。 
        long n = Math.round(4.5);
        System.out.println(n);//5
    }
}
View Code
  •  String(java.lang.String)是不可改变字符串(指向的内容不可改变)

① String str1 = "abc"; 与  ② String str2 = new String("abc"); 的区别:
对于①,是在方法区的常量池中创建String对象(若已存在,则不创建了),故最多创建一个String对象,最少0个。
对于②,是在堆内创建一个String对象,然会指向常量池中的"abc",若常量池中无"abc",则创建,若常量池中已存在,则不创建。故最多创建2个String对象,最少1个。

 

 

常见的比较,“==”比较的是内存地址,“equals”比较的是字符串的内容。

    static String Foo() {
        return "AB";
    }

    public static void main(String[] args) {
        String str1 = "ABCD";
        String str2 = "A" + "B" + "C" + "D";
        String str3 = "AB" + "CD";
        String str4 = new String("ABCD");
        String tmp = "AB";
        String str5 = tmp + "CD";
        String str6 = Foo() + "CD";
        System.out.println(str1 == str2);// true
        System.out.println(str1 == str3);// true
        System.out.println(str1 == str4);// false
        System.out.println(str1 == str5);// false 若tmp是final的,则为 true
        System.out.println(str1 == str6);// false    
    }
//解释: 编译时,就确定的,为true;运行时确定的,为false
// 1. 使用 "" 直接赋值的,是编译期就存在常量池中的 , str1
// 2. 多个 "" 的直接量相加,编译器会优化,例如,str2、str3 优化为 "ABCD"
// 3. 使用 new 的,是运行时在堆内存中创建对象。使用new一定会在堆中分配内存空间。
// 4. 使用变量(无final修饰的)或方法返回的String,加 "CD" 直接量,只能在运行时才能确定。str5、str6
View Code

 String类的常用方法

        // String 的创建转换
        char[] cs = {'A','l','l','e','n'};
        String str = new String(cs);
        char[] cs2 = str.toCharArray();
        byte[] bs = {65,66,67};
        str = new String(bs);//"ABC"
        byte[] bs2 = str.getBytes();
        
        // String 获取字符串信息
        str = "abcAbcEDF";
        System.out.println(str.charAt(0));
        System.out.println(str.indexOf("Ab"));//3 第一次出现Ab的索引
        System.out.println(str.lastIndexOf("b"));//4 最后一次出现b的索引
        
        // String 比较
        System.out.println("abv".equals("abv"));//true
        System.out.println("abv".equalsIgnoreCase("abV"));//true
        System.out.println("leno".contentEquals("leno"));//true  contentEquals 相当于 equals
        System.out.println("leno".contentEquals("leno"));//true
        
        // String 大小写转换
        System.out.println("abc".toUpperCase());
        System.out.println("abc".toLowerCase());
        
        // String 获取子字符串
        System.out.println("abcdefg".substring(3));//"defg"
        System.out.println("abcdefg".substring(3,5));//"de"
        
        // 分割字符串,以“”为整体作为分隔符,前向的
        //String[] temp = "abcdefg".split("a");// "","bcdefg"
        String[] temp = "abcdefg".split("fg");// "abcde"
        
        //字符串以什么开头或结尾
        System.out.println("hello.txt".startsWith("hello"));//true
        System.out.println("hello.txt".startsWith(""));//true
        System.out.println("hello.txt".startsWith("hello.txt"));//true
        System.out.println("hello.txt".endsWith(".txt"));//true
        System.out.println("hello.txt".endsWith(""));//true
        System.out.println("hello.txt".endsWith("hello.txt"));//true
View Code

 String、StringBuffer、StringBuilder 拼接字符串的耗时测试:

public class StringDemo2 {

    public static void main(String[] args) {
        // 比较 String、StringBuffer、StringBuilder 拼接3000次字符串 的耗时
        test1();//1806
        test2();//2
        test3();//1
        //结论:拼接字符串,尽量用StringBuffer、StringBuilder
    }

    // String
    private static void test1() {
        String str1 = "";
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 30000; i++) {
            str1 += i;
        }
        long end = System.currentTimeMillis();// 
        System.out.println(end - begin);

    }

    // StringBuffer
    private static void test2() {
        StringBuffer str1 = new StringBuffer("");
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 30000; i++) {
            str1.append(i);
        }
        long end = System.currentTimeMillis();// 
        System.out.println(end - begin);

    }

    // StringBuilder
    private static void test3() {
        StringBuilder str1 = new StringBuilder("");
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 30000; i++) {
            str1.append(i);
        }
        long end = System.currentTimeMillis();// 
        System.out.println(end - begin);
    }
}
View Code

 

  •  随机数- Random、ThreadLocalRandom、UUID类

Random 是随机数类。ThreadLocalRandom 类java7新增的,是Random的子类,其主要是多线程安全。因其构造器的权限外部不可访问,故使用current()获取当前线程的ThreadLocalRandom实例。 UUID是一个128bit的数字,主要用16进制表示,算法的核心是结合 机器的显卡、当地时间、一个随机数,来生成UUID。是随机的唯一的字符串。

        Random random = new Random();//默认使用当前系统时间作为种子
        // 产生整数在[5,100)的伪随机数
        // 1. random.nextInt(n) 产生[0,n) 之间的随机数
        for (int i = 0; i < 10; i++) {
            int n = 5 + random.nextInt(95);
            //System.out.println(n);
        }
        // 2. random.nextDouble() 产生 [0,1)之间的随机数
        for (int i = 0; i < 10; ++i) {
            int n = 5 + (int)(random.nextDouble()*95);
            System.out.println(n);
        }
        */
        
        // ThreadLocalRandom 类java7新增的,是Random的子类,其主要是多线程安全。因其构造器的权限外部不可访问,故使用current()获取当前线程的ThreadLocalRandom实例
        for (int i = 0; i < 10; i++) {
            int n = ThreadLocalRandom.current().nextInt(5, 100);//[5,100)的随机数
            System.out.println(n);
        }
        
        // UUID是一个128bit的数字,主要用16进制表示,算法的核心是结合 机器的显卡、当地时间、一个随机数,来生成UUID。是随机的唯一的字符串
        for (int i = 0; i < 10; i++) {
            String str = UUID.randomUUID().toString();//[5,100)的随机数
            System.out.println(str);
        }
View Code

 小例子:产生一个随机的验证码

    /**
     * 产生4个随机验证码
     * @return
     */
    private static String generateVerifyCode() {
        final int SIZE = 4;
        final String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        char[] verifyCode = new char[SIZE];
        for(int i=0; i<SIZE; ++i)
        {
            verifyCode[i] = str.charAt(random.nextInt(str.length()));
        }
        return new String(verifyCode);
    }
View Code

 

  •  日期相关类

Date类: 此处指 java.util.Dte 类,不是 java.sql.Date
             类Date表示特定的瞬间,精确到毫秒。
DateFormat类
SimpleDateFormat类
Calendar类
java8中重新为日期定义了新的API
Date类中的大量方法都已经过时了,过时不代表不存在,依然可以使用,只不过不建议使用,官方建议技们使用 Calendar类。

 java.util.Date类

        Date date = new Date();//获取当前系统时间
        date = new Date(System.currentTimeMillis());//获取当前系统时间
        date = new Date(1999-1900,12-1,29);//1999-12-29 0:00:00
        date = new Date("1999/12/29");//ok 内部调用了 Date.parse(),这句等价于 new Date(Date.parse("1999/12/29"))
        //date = new Date("1999-01-09");//error: java.lang.IllegalArgumentException
        date = new Date("01 Dec 1999");//ok
        date = new Date("Sat, 12 Aug 1995 13:30:00 GMT");//ok
        date = new Date("12 Aug 1995 13:30:00");//ok
        
        //Date-->long
        long l = date.getTime();
        //long --> Date
        date = new Date(l);
        
        System.out.println(date.toLocaleString());
        System.out.println(date.toString());
        System.out.println(date);
View Code

 DateFormat / SimpleDateFormat 将日期时间格式化为String,将String解析为Date

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo {
    public static void main(String[] args) throws ParseException {
        
        // DateFormat 类:用于格式化日期时间  String <--> Date
        Date date = new Date();
        DateFormat df = DateFormat.getInstance();// date time 都是 SHORT风格
        String str = df.format(date);//"20-2-27 下午4:01"
        Date d = df.parse(str);//解析String -> Date
        
        df = DateFormat.getDateInstance();//只获取日期
        str = df.format(date);//"2020-2-27"
        d = df.parse(str);//解析String -> Date
        
        df = DateFormat.getDateTimeInstance();//包括日期和时间
        str = df.format(date);//"2020-2-27 16:08:56"
        d = df.parse(str);//解析String -> Date
        
        df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);//包括长日期和长时间
        str = df.format(date);//"2020年2月27日 下午04时12分13秒"
        d = df.parse(str);//解析String -> Date
        
        df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);//包括短日期和短时间
        str = df.format(date);//"20-2-27 下午4:13"
        d = df.parse(str);//解析String -> Date
        
        //------------------------------------------
        
        // SimpleDateFormat 是 DateFormat的子类,可以自定义日期和时间的格式
        SimpleDateFormat sdf = new SimpleDateFormat();
        str = sdf.format(date);//"20-2-27 下午4:16"
        d = sdf.parse(str);//解析String -> Date
        
        sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        str = sdf.format(date);//"2020/02/27 16:19:09"
        d = sdf.parse(str);//解析String -> Date
        
        System.out.println(str);
        System.out.println(d);
    }
}
View Code

  SimpleDateFormat 类的自定义格式化模式

LetterDate or Time ComponentPresentationExamples
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M Month in year (context sensitive) Month July; Jul; 07
L Month in year (standalone form) Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day name in week Text Tuesday; Tue
u Day number of week (1 = Monday, ..., 7 = Sunday) Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00

模式字母通常重复,因为它们的数字确定了准确的表示:

例如:
以下示例显示如何在美国地区中解释日期和时间模式。 给定的日期和时间是2001-07-04 12:08:56当地时间在美国太平洋时间时区。

Date and Time PatternResult
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u" 2001-W27-3

 Calendar类

import java.util.Calendar;

public class CalendarDemo {
    public static void main(String[] args) {
        // 由于Date类中的有些方法过时了,但还能用,官方建议使用Calendar类(比Date强大)
        Calendar cal = Calendar.getInstance();//获取当前日期和时间
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1;//注意:0~11表示1~12月,故+1
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int hour = cal.get(Calendar.HOUR_OF_DAY);
        int minute = cal.get(Calendar.MINUTE);
        int second = cal.get(Calendar.SECOND);
        int milliSecond = cal.get(Calendar.MILLISECOND);
        String str = String.format("%d-%02d-%02d %02d:%02d:%02d.%d", 
                year, month, day, hour, minute, second, milliSecond);
        System.out.println(str);
        System.out.println("-----------------------");
        // Calendar <--> Date
        java.util.Date date = cal.getTime();
        cal.setTime(date);
        // void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。 
        cal.add(Calendar.DAY_OF_MONTH, 100);//100天后的日期
        System.out.println(cal.getTime().toLocaleString());
    }
}
View Code

 

 

  •  正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)

参考:

正则表达式 百度百科

正则表达式

public String[] split(String regex)           调用了 split(regex, 0)

public String[] split(String regex, int limit) 

若limit > 0,模式最多匹配 limit -1 次;若limit <0,则模式使用无数次。若 limit=0,则模式使用无数次,并且尾随的空字符串将被丢弃。

 

 例子:

public class RegexDemo {
    public static void main(String[] args) {
        String str = "123";
        boolean b = str.matches("\\d*");//\d表示一个0-9的数字,等价于[0-9]。*表示匹配前面的子表达式任意次,等价于{0,}
        System.out.println(b);//true

        str = "1I5love8you999";
        String[] ss = str.split("9");//"1I5love8you"
        ss = str.split("\\d");//"","I","love","you"
        ss = str.split("[0-9,I]");//"","","","love","you"
        
        //使用 split(String regex, int limit)
        ss = str.split("9",-1);//"1I5love8you","","",""
        ss = str.split("\\d",-1);//"","I","love","you","","",""
        ss = str.split("\\d",3);//最多匹配2次,即String[]的length最大为3。结果:"","I","love8you999"
        ss = str.split("\\d",0);//等价于 ss = str.split("\\d");  "","I","love","you"
        
        for (String string : ss) {
            System.out.println(string);
        }
    }
}
View Code

 

 

 

*************

posted @ 2020-02-26 15:46  htj10  阅读(164)  评论(0编辑  收藏  举报
TOP