参考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 } }
- 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
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
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); } }
- 随机数- 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); }
小例子:产生一个随机的验证码

/** * 产生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); }
- 日期相关类
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);
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); } }
SimpleDateFormat 类的自定义格式化模式
Letter Date or Time Component Presentation Examples 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 Pattern Result "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()); } }
- 正则表达式(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); } } }
*************