JDK5 新特征、正则笔记
------- android培训、java培训、期待与您交流! ---------
JDK5特性
1静态导入
适用范围:仅对于一个类的静态成员变量或者静态方法起作用。
注意事项:如果静态导入的成员与本类的成员同名,那么优先调用本类的成员。(就近原则)
格式:import static 包名.类名.静态成员
例如:import static java.util.Collections.sort;
2增强for循环
增强for循环只能用在数组、或实现Iterable接口的集合类上
格式:
for(变量类型 变量 :需迭代的数组或集合){} |
增强for循环需注意细节: 1.增强for循环再遍历集合的过程中也不能使用集合对象改变集合的元素个数。因为增强for循环内部还是使用了迭代器的。 2.增强for 循环与普通迭代器遍历的区别在于:增强for循环只能用于遍历元素,不能增删集合中的元素,而普通迭代器方式可以 3.增强for 循环与普通for循环区别:增强for 循环的使用一定要有遍历的目标对象,而普通的可以没有。 4.增强for循环用于Map对象,遍历Map的时候不能直接遍历,因为Map接口没有实现Iterable接口。 |
HashMap<String, String> map = new HashMap<String, String>(); map.put("001","狗娃"); map.put("002","狗剩"); map.put("003","狗蛋"); Set<Map.Entry<String, String>> entryes = map.entrySet();(第4) for(Map.Entry<String, String> item : entryes){ System.out.print(item+","); } |
3可变参数
格式
for( 数据类型... ) |
可变参数的细节 声明: 在一个方法中,最多只能有一个可变参数。 可变参数只能放在参数列表的最后面。 调用: 当使用可变参数时,可以传0或多个参数。 当使用可变参数时,也可以传一个数组进去,就表示多个参数。 使用: 在方法内部使用时,就是在使用一个数组。 当调用时没有传参数时(传了0个),这时在方法内部的参数数组是有值的(不为null),但长度为0. |
public class Demo4 {
public static void main(String[] args) { //int[] arr = {12,3,5,1}; //System.out.println(arr); // [I@1db05b2 add(1,2,12); }
public static void add(int a,int... arr){ int sum = 0; for(int item : arr){ sum += item; } System.out.println("总和:"+ sum); } } |
4自动装箱/拆箱
自动装箱:指开发人员可以把一个基本数据类型直接赋给对应的包装类。
自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型。
基本数据类型(四型八种) | 包装数据类型 |
byte | Byte |
short | Short |
int | Int |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
5枚举类
注意事项:
1.枚举值默认的修饰符为 public static final.
2.枚举值的数据类型就是枚举值所属的枚举类的类型.
3.枚举值实际上指向了枚举类的对象.
4.枚举类是存在构造函数的,而且使用了private修饰的.
5.枚举类是可以定义成员变量和成员函数的.
6.枚举类的枚举值必须位于该类的第一个语句.
7.枚举类是可以定义抽象方法的,如果一个枚举类出现了抽象方法,那么写枚举值的时候就必须实现枚举类的方法.
枚举类也可以实现接口(序列化)、或继承抽象类。
JDK5中扩展了swith语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型(enum)。
//季节枚举类 enum Season{ SPRING,SUMMER,AUTUMN,WINTER; }
enum Direction{ UP,DOWN; }
public class Demo8 { public static void main(String[] args) { Season season = Season.WINTER; switch(season){ //如果写上了枚举类的类名,担心你传入其他的枚举类型。 case SPRING: System.out.println("春天.."); break; case SUMMER: System.out.println("夏天.."); break; case AUTUMN: System.out.println("秋天.."); break; case WINTER: System.out.println("冬天.."); break; } } } |
路径:
路径分割符:在Windows中分隔符为'\',在Unix/Linux中分隔符为'/'。
路劲问题:
绝对路径:绝对路径就是路径的信息是以一个盘符开头的路径。(资源的一个完整路径信息)相对路径:相对路径就是资源文件相对于当前程序所在的路径。 . 当前路径 .. 上一级目录 |
正则
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] */ |
注意: 一个预定义字符只能匹配一个字符,只有加上了数量词之后才可以匹配多个字符。
System.out.println(".是匹配任意字符:"+ ("#".matches("."))); //任意字符 System.out.println("\\d是匹配数字:"+ ("a".matches("\\d"))); System.out.println("\\D是匹配非数字:"+ ("^".matches("\\D"))); System.out.println("\\s是匹配空白字符:"+ ("\n".matches("\\s"))); System.out.println("\\S是匹配非空白字符:"+ ("a".matches("\\S")));
System.out.println("\\w是匹配单词字符:"+ ("$".matches("\\w")));
System.out.println("\\w是匹配非单词字符:"+ ("a".matches("\\W")));
|
数量词 ? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{n} X,恰好 n 次 X{n,} X,至少 n 次 X{n,m} X,至少 n 次,但是不超过 m 次
System.out.println("".matches("\\d?")); //表示数字可能出现一次,或者一次也不出现。 System.out.println("a".matches("\\d*")); //零次或多次 System.out.println("1".matches("\\d+")); //至少要出现一次
System.out.println("123".matches("\\d{3}")); //恰好 n 次
System.out.println("112345678903".matches("\\d{3,}")); //至少出现三次
System.out.println("123455".matches("\\d{3,5}")); // 至少 3 次,但是不超过 5 次
|
范围词 [abc] a、b 或 c(简单类) [^abc] 任何字符,除了 a、b 或 c(否定) [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
注意:范围词里面的内容即是再长也只能匹配一个字符,如果需要匹配多个字符,那么需要加上数量词 System.out.println("e".matches("[abc]")); System.out.println("e".matches("[^abc]")); // ^ 出现在范围词中表示的是"非"的意思 System.out.println("^".matches("[a-zA-Z0-9_$]")); // 出现的字符是a-z范围之内的。 |
正则表达式查找:
如果需要查找字符串的内容需要使用到正则的对象:
Pattern(正则类)
Matcher(匹配器)
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。
执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p =Pattern.compile("a*b"); 先把字符串的正则编译成一个正则对象。。
Matcher m =p.matcher("aaaaab"); // 使用正则对象匹配一个字符串,然后就产生了一个Matcher对象。
boolean b = m.matches(); //
匹配要使用的方法:
find()通知匹配去找适合的内容,如果找到,那么返回true,找不到适合的内容返回false.
group() 获取匹配器找到的内容
\b 单词边界单词边界匹配器只代表了单词 的边界,不匹配任何一个字符。
public class Demo4 {
//需求:找出三个字符串组成的单词给我。 public static void main(String[] args) { String data = "da jia jin tian hao hao zuo xiang mu"; String reg = "\\b[a-z]{3}\\b"; // \\b为边界匹配器 //正则对象 Pattern p = Pattern.compile(reg); //使用正则对象匹配字符串,生成一个匹配器 Matcher m = p.matcher(data);
while(m.find()){ System.out.println(m.group()); } } } |
public class Demo6 {
public static void main(String[] args) { String data = "有事没事联系:1122423@qq.com 有事没事联系:1122423@qq.com 有事没事联系:1122423@qq.com 有事没事联系:1122423@qq.com 有事没事联系:1122423@qq.com 有事没事联系:1122423@qq.com 有事没事联系:1122423@qq.com 有事没事联系:1122423@qq.com.cn " + "有事没事联:1122423@qq.com.cn 有事没事联系:1122423@163.hhh 有事没事联系:1122423@qq.net ";
// 1122423 @qq.com 首位: 英文数字 其他位:\\w @ //String reg = "[a-zA-Z0-9]\\w{3,15}@[a-zA-Z0-9]{2,22}(\\.[a-z]{2,3}){1,2}";
String reg = "[a-zA-Z0-9]\\w{3,15}@[a-zA-Z0-9]{2,22}(\\.(net|com|cn)){1,2}"; Pattern pattern = Pattern.compile(reg); Matcher m = pattern.matcher(data); while(m.find()){ System.out.println(m.group()); } //System.out.println("net".matches("(net)|(com)|(cn)"));
} } |