zoukankan      html  css  js  c++  java
  • 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

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

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    用C#生成足够随机的互不相同的随机数
    CRM
    Asp.net2.0部署时TreeView控件无法正常显示没有图片的问题
    javascript解析json
    jQuery插件倒计时。
    ASP.NET MVC + jQuery + Newtonsoft.Json 快乐的AJAX
    .NET中DataSet转化Json工具类
    jQuery load html
    jQuery 使用注意点技巧1
    WEB页面多语言支持解决方案
  • 原文地址:https://www.cnblogs.com/htj10/p/12367374.html
Copyright © 2011-2022 走看看