一、正则表达式:(使用过程中需要查正则表达式的符号码表)
知识点:正则表达式(使用过程中需要读懂符号)
含义:符合正则规范的表达式
理解:正则表达式其实就是个字符串
案例1:把一个字符串中带电话号码替换成130****1111 * * 小结:利用正则表达式去替换字符串
public static void main(String[] args) { String str = "小红13012341111 小绿15112342222"; String regex = "(1\\d{2})(\\d{4})(\\d{4})"; str = str.replaceAll(regex, "$1****$3"); System.out.println(str);//小红130****1111 小绿151****2222 }
案例2:验证QQ邮箱 * * 小结:利用正则表达式去验证字符串
String str = "1445584980@qq.com"; String regex = "\\d{5,10}@qq.com"; boolean matches = str.matches(regex); System.out.println(matches);
* 案例3:分割路径 * * 小结:利用正则表达式去分割字符串
String str = "路径"; String regex = ":?\\\\";// :\\ 或 \\ String[] split = str.split(regex); for (String s : split) { System.out.println(s);
案例4:爬数据 * * 小结:利用正则表达式去爬数据
package com.ady.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test04 { public static void main(String[] args) { String str = "<img src='hhy/aaa.jpg'/><div><div/> <input type='image' src='submit.gif' /><img src='bbb.jpg'/>"; //正则表达式字符串 String regex = "<img\\s*\\bsrc\\b\\s*=\\s*('|\")?([^'\"\n\r\f>]+(\\.jpg)\\b)('|\")?/>"; //正则表达式对象 Pattern pattern = Pattern.compile(regex); //利用正则表达式对象解析字符串,返回解析对象 Matcher matcher = pattern.matcher(str); //查询结果 while(matcher.find()){ String group = matcher.group(2);//找到结果中的第2组(第2个小括号里的内容) System.out.println(group);//打印组 } } }
二、日期时间类
知识点:日期时间类 Date(java.util.Date) -- 日期类 SimpleDateFormat ------ 格式化日期类
Calendar -------------- 日历类
Date(java.sql) -- 数据库支持的日期类
LocalDate ------- JDK1.8 日期类
LocalTime ------- JDK1.8 时间类
LocalDateTime --- JDK1.8 日期时间类
知识点:SimpleDateFormat格式化日期类
经验:SimpleDateFormat和Date联合使用
package com.ady.datetime_class; import java.util.Date; public class Test01 { static void main(String[] args) { Date date = new Date(); //星期 月份 日期 时:分:秒 时区 年份 //Thu Mar 14 10:33:53 CST 2024 System.out.println(date); } //@Deprecated过时的注解 @Deprecated public static void method(){} }
知识点:SimpleDateFormat格式化日期类
经验:SimpleDateFormat和Date联合使用
package com.ady.datetime_class; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test02 { public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //将Date对象转换为格式对应的字符串 String datetime = sdf.format(new Date()); System.out.println(datetime);//2024年03月14日 10:40:55 //格式对应的字符串 转 Date对象 Date date = sdf.parse("2024年03月14日 10:61:55"); System.out.println(date); } }
三、Calendar --- 日历类
知识点:Calendar -- 日历类 注意:Calendar获取单个日期信息
package com.qf.datetime_class; import java.util.Calendar; public class Test03 { /** * 知识点:Calendar -- 日历类 * * 注意:Calendar获取单个日期信息 */ public static void main(String[] args) { //获取系统的日历对象 Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; int day = c.get(Calendar.DAY_OF_MONTH); int hour = c.get(Calendar.HOUR); int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); System.out.println(year); System.out.println(month); System.out.println(day); System.out.println(hour); System.out.println(minute); System.out.println(second); } }
四、Math - 数学类
知识点:Math - 数学类
理解:
1.Math类提供了基本数学运算和几何函数的方法
2.Math是final类
3.Math类中所有的属性和方法都是静态的
Math类常用方法:
方法 | 描述 | 返回值类型 |
---|---|---|
Math.pow(); | 求次方 | double |
Math.sqrt(); | 求平方根 | double |
Math.abs(); | 求绝对值 | | int | |
Math.ceil(); | 向上取整(天花板) | double |
Math.floor(); | 向下取整(地板 | double |
Math.round(); | 四舍五入 | int(取模) |
Math.max(); | 最大值 | 根据实例判断 |
Math.min(); | 最小值 | 根据实例判断 |
Math.random(); | 随机值 | 生成随机数(根据实例判断范围,一般是int类型 ) |
package com.ady.math_class; public class Test01 { public static void main(String[] args) { System.out.println("求次方:" + Math.pow(2, 3));//8.0 System.out.println("求平方根:" + Math.sqrt(9));//3.0 System.out.println("求绝对值:" + Math.abs(-100));//100 System.out.println("向上取整(天花板):" + Math.ceil(1.1));//2.0 System.out.println("向下取整(地板):" + Math.floor(1.9));//1.0 System.out.println("四舍五入:" + Math.round(1.5));//2 System.out.println("最大值:" + Math.max(10, 20));//20 System.out.println("最小值:" + Math.min(10, 20));//10 System.out.println("随机值:" + Math.random());//0(包含)~1(排他) //需求:随机出1~100的数字 int num = (int)(Math.random()*100) + 1; System.out.println("随机值:" + num); } }
package com.qf.math_class; public class Test02 { /** * 知识点:Math - 数学类 */ public static void main(String[] args) { System.out.println(Integer.MAX_VALUE);//2147483647 -> 2的31次方-1 System.out.println(Integer.MIN_VALUE);//-2147483648 -> -2的31次方 //面试题:Math.abs()是否会返回负数 //会,当输入的数大于int数据类型的范围,超出范围就会返回负数 System.out.println(Math.abs(-2147483648)); System.out.println(Math.abs(2147483647 + 1)); System.out.println(2147483647 + 1); } }
五、静态导入
静态导入:
将Math类中所有的静态属性和方法导入到本类里,这些静态属性和方法成为本类自己的属性和方法 import static java.lang.Math.*;
package com.ady.math_class; //静态导入:将Math类中所有的静态属性和方法导入到本类里,这些静态属性和方法成为本类自己的属性和方法 import static java.lang.Math.*; public class Test03 { public static void main(String[] args) { System.out.println("求次方:" + pow(2, 3));//8.0 System.out.println("求平方根:" + sqrt(9));//3.0 //注意:静态导入就就近原则,先查看本来自己是否有该方法,如果有就直接调用,如果没有就找静态导入类中方法 System.out.println("求绝对值:" + abs(-100));//-123456 } public static int abs(int i){ return -123456; } }
六、random随机类
random随机生成: 当种子树固定,随机数就固定:
降为随机
package com.day14.xw; import java.util.Random; public class Test01 { public static void main(String[] args) { Random ran = new Random(); System.out.println("随机生成int类型取值范围的数"+ran.nextInt()); System.out.println("随机生成long类型取值范围的数"+ran.nextLong()); System.out.println("随机生成float类型取值范围的数"+ran.nextFloat()); System.out.println("随机生成double类型取值范围的数"+ran.nextDouble()); } }
package com.day14.xw; import java.util.Random; /* Random随机生成的底层 * */ public class Test02 { public static void main(String[] args) { Random ran = new Random(); System.out.println(ran.nextInt()); System.out.println(ran.nextInt(10));//这个由于种子数固定为10 所以它生成随机数就是在0-10范围内 MyRandom myRandom = new MyRandom(); System.out.println(myRandom.nextInt()); System.out.println(myRandom.nextInt(10)); } } package com.day14.xw; public class MyRandom { //私有化种子 private long seed; public MyRandom(){ this(seedUniuifiler()^System.nanoTime()); } private static long seedUniuifiler(){ for(;;){ //获取毫秒数e long current = System.currentTimeMillis(); long next = current*18783497276652981L; if(next%7 == 0|| next%12 == 0|| next%17==0){ return next; } } } public MyRandom(long seed){ this.seed = seed; } public int nextInt(){ //将种子数强转成int型 return(int)seed; } public int nextInt(int i ){ int num = Math.abs((int)seed); return num%i; } }
七、Runtime 运行时类
知识点:Runtime -- 运行时类
理解:该类的对象代表虚拟机
运行时类方法:
方法名 描述 run.availableProcessors() 获取系统操作数 run.maxMemory() 获取系统最大内存数(byte) run.freeMemory() 获取系统闲置数(byte)
package com.day14.xw1; /*Runtime 运行时类 * */ public class Test01 { public static void main(String[] args) { //运行时类的对象 Runtime run = Runtime.getRuntime(); System.out.println("获取系统操作数:"+run.availableProcessors()); System.out.println("获取系统最大内存数(byte):"+run.maxMemory()); System.out.println("获取系统闲置数(byte):"+run.freeMemory()); } }
1.效率优化:代码效率 -- 消耗时长、消耗内存
package com.day14.xw1; public class Test02 { public static void main(String[] args) { Runtime run = Runtime.getRuntime(); long startMomey = run.freeMemory(); long endTime =System.currentTimeMillis(); String str = "莉莉"; for (int i = 0; i < 50000; i++) { // str += "小可爱,皇冠给你带"; // } // long endTime = System.currentTimeMillis(); // long endMemory = run.freeMemory(); // System.out.println("消耗时长:" + (endTime-startTime));//6411 // System.out.println("消耗内存:" + (startMemory - endMemory));//-564308912 Runtime run1 = Runtime.getRuntime(); long startMemory = run1.freeMemory(); long startTime = System.currentTimeMillis(); StringBuilder sb = new StringBuilder(900000);//减少底层容器的伸缩性(减少底层容器的扩容次数) sb.append("莉莉"); for (int i1 = 0; i1 < 100000; i1++) { sb.append("小可爱,皇冠给你带"); } long endTime1 = System.currentTimeMillis(); long endMemory = run1.freeMemory(); System.out.println("消耗时长:" + (endTime1-startTime));//0 System.out.println("消耗内存:" + (startMemory - endMemory));//5400040 } } }
八、System类
类名 | 描述 |
---|---|
InputStream in | 系统标准的输入流(方向:控制台->程序) |
PrintStream out | 系统标准的输出流(方向:程序->控制台) |
PrintStream err | 系统标准的错误输出流(方向:程序->控制台) |
/** * 知识点:System系统类 -- 属性 */
package com.ady.system_class; import java.io.InputStream; import java.io.PrintStream; import java.util.Scanner; public class Test01 { public static void main(String[] args) { //系统标准的输入流(方向:控制台->程序) InputStream in = System.in; Scanner scan = new Scanner(in); String str = scan.next(); //系统标准的输出流(方向:程序->控制台) // PrintStream out = System.out; // out.println(str); //系统标准的错误输出流(方向:程序->控制台) PrintStream err = System.err; err.println(str); } }
深入:
/**
知识点:研究System提供的out和err
注意:out和err是两个线程里的代码,多线程之前需要争抢cpu资源,谁抢到了谁就运行 */
package com.ady.system_class; public class Test02 { public static void main(String[] args) { System.out.println("小明"); System.err.println("小红"); System.out.println("小强"); //这个结果会有多种情况 } }
/**
知识点:System的方法 */
package com.ady.system_class; import java.util.Arrays; import java.util.Properties; public class Test03 { public static void main(String[] args) { System.out.println("获取毫秒值:" + System.currentTimeMillis()); System.out.println("获取纳秒值:" + System.nanoTime()); //获取系统配置文件对象 Properties properties = System.getProperties(); System.out.println(properties); //通过key获取对应的value String value = System.getProperty("os.name"); System.out.println(value); String[] arr = {"a","b","c","d","e","f","g"}; String[] newArr = new String[3]; //拷贝数组(源数组,起始下标,目标数组,起始下标,拷贝长度) System.arraycopy(arr, 2, newArr, 0, 3); System.out.println(Arrays.toString(newArr));//[c, d, e] //删除数组 System.arraycopy(arr, 3, arr, 2, 4); System.out.println(Arrays.toString(arr)); //关闭虚拟机 System.exit(0);//0表示正常关闭 } }
重点:
//拷贝数组(源数组,起始下标,目标数组,起始下标,拷贝长度) System.arraycopy(arr, 2, newArr, 0, 3);
九、大数值的运算类
/**
知识点:大数值的运算类 -- BigInteger
注意:构造方法里存放字符串!!!! */
类名 | 描述 | 类型 |
---|---|---|
BigDecimal | 高精度的十进制数值(任意精度的数值) | double |
BigInteger | 任意精度的整数 | int |
大数值运算类方法:
方法名 | 描述 |
---|---|
对象名.add | 加法 |
对象名.subtract | 减法 |
对象名.multiply | 乘法 |
对象名.divide | 除法 |
package com.ady.big; import java.math.BigInteger; public class Test01 { public static void main(String[] args) { BigInteger big1 = new BigInteger("200000000000"); BigInteger big2 = new BigInteger("200000000000"); BigInteger add = big1.add(big2); System.out.println("加法:" + add); BigInteger subtract = big1.subtract(big2); System.out.println("减法:" + subtract); BigInteger multiply = big1.multiply(big2); System.out.println("乘法:" + multiply); BigInteger divide = big1.divide(big2); System.out.println("除法:" + divide); } }
package com.ady.big; import java.math.BigDecimal; public class Test02 { /** * 知识点:大数值的运算类 -- BigDecimal * * 注意:构造方法里存放字符串!!!! */ public static void main(String[] args) { BigDecimal big1 = new BigDecimal("0.5"); BigDecimal big2 = new BigDecimal("0.4"); BigDecimal add = big1.add(big2); System.out.println("加法:" + add); BigDecimal subtract = big1.subtract(big2); System.out.println("减法:" + subtract); BigDecimal multiply = big1.multiply(big2); System.out.println("乘法:" + multiply); BigDecimal divide = big1.divide(big2); System.out.println("除法:" + divide); } }
package com.ady.big; import java.math.BigDecimal; public class Test03 { /** * 知识点:大数值的运算类 -- BigDecimal * * 注意:构造方法里存放字符串!!!! */ public static void main(String[] args) { BigDecimal big1 = new BigDecimal("10"); BigDecimal big2 = new BigDecimal("3"); BigDecimal divide = big1.divide(big2, 2, BigDecimal.ROUND_HALF_UP); System.out.println("除法:" + divide); } }