【Java】day18--静态导入、增强for循环、可变参数、自动装箱与拆箱、枚举类、正则表达式部分知识点总结

(一)静态导入

jdk1.5新特性之------>静态导入
静态导入的作用:简化书写。
静态导入仅对于一个类的静态成员起作用。
静态导入的格式:
    import static 包名.类名.静态成员;
静态导入要注意的事项:
    1.如果静态导入的成员与本类的静态成员同名了,那么优先使用本类的静态成员。
    2.如果要使用静态导入方法,需要指定类名调用。

import java.util.ArrayList;
import java.util.Collections;
import static java.util.Collections.*;
import static java.lang.System.out;
public class staticc_demo1 {

	public static void main(String[] args) {
		ArrayList list=new ArrayList();
		list.add(10);
		list.add(15);
		list.add(8);
		list.add(11);
		Collections.sort(list);
		System.out.println("元素内容:"+list);//out是System类的静态成员变量,表示标准输出流
		out.println("最大值:"+max(list));//静态导入后可以简化书写
		System.out.println("最小值:"+min(list));
	}
	public static void sort(ArrayList list) {
		System.out.println("排序成功。。。");
	}
}

(二)增强for循环

jdk1.5新特性之-------->增强for循环
增强for循环的主要作用是:简化迭代器的书写格式。
增强for循环的格式:
    for(元素的数据类型  变量名:遍历的目标){
    }
增强for循环的前提:
    只有实现了Iterable接口的对象或数组对象才能使用 。
增强for循环要注意的细节:
    1.增强for循环的底层还是通过获取迭代器的方式进行遍历的,只不过不需要手动获取迭代器由jvm自动获取,所以在使用增强for循环遍历元素
    的过程中不能使用集合对象改变集合对象的元素个数。
    2.增强for循环与迭代器的区别:增强for循环只能用于遍历集合的元素,不能增删;但用迭代器的方法既能遍历也能增删元素。
    3.增强for循环遍历时必须存在一个遍历的目标对象,而普通的for循环可以不存在。

public class jdk15_demo1 {

	public static void main(String[] args) {
		//Iterable根接口--Collection子接口--Set子接口--HashSet实现类,所以HashSet实现了Iterable接口
		HashSet set=new HashSet();//加泛型减少强制转换
		//以后的开发过程中一个集合对象只会存储同一种类型的数据,因为同一类型的数据才会有相同的处理方式。有必要使用泛型
		set.add("小米");
		set.add("大米");
		set.add("黑米");
		set.add("红米");
		/*Iterator it=set.iterator();
		System.out.println("迭代器的遍历方式:");
		while(it.hasNext()) {
			System.out.print(it.next()+",");
		}*/
		/*
		//增强for循环
		System.out.println("增强for循环遍历:");
		for(String item:set) {//遍历出来的每个元素都会交给item变量
			System.out.print(item+",");
			set.add("aaa");
		}*/
		/*
		int[] arr= {15,16,18,20};
		for(int item:arr) {
			System.out.println(item);
		}
		for(int i=0;i<5;i++) {
			System.out.println("hello world");
		}*/
		
		TreeMap tree=new TreeMap();
		tree.put(101,"小米");
		tree.put(113,"大米");
		tree.put(125,"黑米");
		tree.put(222,"红米");
		//使用增强for循环遍历map集合
		Set> entrys=tree.entrySet();
		for(Entry item:entrys) {
			System.out.println(item);
		}
	}
}

(三)可变参数

jdk1.5的新特性------可变参数。
可变参数的格式:
    数据类型... 变量名
可变参数要注意的实现:
    1.如果一个函数的形参使用了可变参数,那么调用该函数的时候可以传参也可不传参。
    2.可变参数实际就是一个数组。
    3.可变参数必须位于形参列表中的最后一个位置。
    4.一个方法中最多只能使用一个可变参数。

public class variable_demo1 {

	public static void main(String[] args) {
		System.out.println(new int[] {});//匿名数组对象 [I@1f32e575
		int res=sum("小米",1,2,5,10);//当一个函数使用可变参数,传递数据时,JVM会自动把实参数据保存到一个数组中,然后再传递给可变参数。
		System.out.println(res);
	}
	public static int sum(String name,int... arr) {//arr这里实际是一个数组
		int sum=0;
		//增强for循环
		for(int item:arr) {
			sum+=item;
		}
		System.out.println(arr);
		System.out.println(arr.length);
		return sum;
	}
}

  (四)自动装箱与自动拆箱

jdk1.5新特性之---自动装箱与自动拆箱

java是面向对象的语言,任何事物都使用了一个类进行描述。 基本数据类型也是一类事物,所以
java对于基本类型的数据也使用了对应的类进行描述,把描述基本类型变量的类称为--包装类。

基本数据类型         包装类型
  byte        Byte
  short       Short
  int         Integer
  long        Long
  float          Float
  double      Double
  boolean      Boolean
  char        Character
基本数据类型设计出对应的包装类型的好处:可以让基本数据类型也使用方法,让功能变得强大。

集合:存储任意对象类型数据的集合容器,不存储基本类型数据。

自动装箱---自动把基本数据类型转成引用类型数据。

public class jdk15_demo3 {

	public static void main(String[] args) {
		/*
		String str="12";	
		//功能一:把字符串转成数字
		int num=Integer.parseInt(str);
		System.out.println(num);
		//功能二:可以把数字转成指定进制格式的字符串。
		int num2=10;
		System.out.println("二进制:"+Integer.toBinaryString(num2));
		System.out.println("八进制:"+Integer.toOctalString(num2));
		System.out.println("十六进制:"+Integer.toHexString(num2));
	*/
		//自动装箱---自动把基本数据类型转成引用类型数据。
		ArrayList list=new ArrayList();
		list.add(new Integer(1));
		list.add(2);//jvm自动new Integer(数据) 将基本类型数据转成引用类型
	
		//自动拆箱  :自动把引用数据类型数据转成基本数据类型。引用(对象)类型不允许参与运算。
		Integer i=new Integer(10);//引用数据类型数据
		System.out.println(2+i);//intValue()获取基本数据类型数据
    }
}

(五)Integer考点

public class jdk15_demo3 {

	public static void main(String[] args) {
        
            Integer i1=12;
		Integer i2=12;
		System.out.println("是同一个对象么?"+(i1==i2));//true
		
		i1=127;
		i2=127;
		System.out.println("是同一个对象么?"+(i1==i2));//true
		
		i1=128;
		i2=128;
		System.out.println("是同一个对象么?"+(i1==i2));//false
		/*
			Integer类内部维护了一个静态数组,该数组内部存储了-128~127,当创建一个Integer对象
			时,若数据在-128~127范围内,那么会直接从数组中获取,而不会创建新的Integer对象。
		 	把一些常用的数据事先创建好,然后贡献给大家一起使用:享元模式。
		 	好处:减少创建对象的次数,节省内存空间。
		 * 
		 * */
	}
}

(六)枚举类

枚举类:
    枚举的应用场景:一些方法在运行时,需要的数据不能是任意的,而必须是在一定范围内的值。
    如:一年四季、方向
定义枚举类的格式:
    enum 类名{
    
    }
枚举类要注意的事项:
    1.枚举类是一个特殊的类。
    2.枚举值磨人的修饰符是:public static final.
    3.枚举值其实就是一个当前枚举类的对象。
    4.枚举值必须位于枚举类中的第一个语句。
    5.枚举类的构造方法默认的修饰符是private,修饰符也必须是private。
    6.枚举类允许出现抽象的方法,但是一旦出现了抽象的方法,那么枚举值就必须实现抽象方法。

switch语句适用的数据类型:byte\short\int\char\ String\枚举类型。
注意事项:
    1.在switch语句中使用枚举类的时候,case语句后面不需要枚举类,只需写枚举值即可。

enum Direction{
	//public static final Direction UP=new Direction();//本质是这样,由jvm实现
	//UP,DOWN,LEFT,RIGHT;		//枚举值是该类的对象,由无参的构造方法创建,不存在无参的,应该传一个参数的
	//对象中不允许有抽象方法存在
	UP("上"){
		@Override
		public void test() {
			System.out.println("向上");
		}
	},DOWN("下"){
		@Override
		public void test() {
			System.out.println("向下");
		}
	},LEFT("左"){
		@Override
		public void test() {
			System.out.println("向左");
		}
	},RIGHT("右"){
		@Override
		public void test() {
			System.out.println("向右");
		}
	};
	String value;
	public void print() {
		System.out.println("value:"+value);
	}
	private Direction(String value) {
		this.value = value;
	}
	public abstract void test();
}
public class jdk15_demo5 {

	public static void main(String[] args) {
		Direction.UP.print();
		Direction.DOWN.print();
		Direction.LEFT.test();
	}
}
enum Gender{
	MAN("男"),WOMAN("女");
	String value;
	private Gender(String value) {
		this.value = value;
	}
}
/*
//保证性别输入只有男女
class Gender{
	String value;
	//对外提供本类的对象
	public static final Gender MAN=new Gender("男");
	public static final Gender WOMAN=new Gender("女");
	//私有化构造函数
	private Gender(String value) {
		this.value=value;
	}
} */
class Person{
	String name;
	private Gender sex;
	@Override
	public String toString() {
		return "{姓名:"+this.name+" 性别:"+this.sex.value+"}";
	}
	public Gender getSex() {
		return sex;
	}
	public void setSex(Gender sex) {
			this.sex = sex;
	}	
}
public class jdk15_demo4 {

	public static void main(String[] args) {
		Person p=new Person();
		p.name="小米";
		p.setSex(Gender.WOMAN);//不能自创建Gender对象,只能用类提供的对象,否则编译即报错
		System.out.println(p);
	}
}

(七)正则表达式

正则表达式:用于操作字符串的一些规则。

预定义字符类:
    .任何字符(与行结束符可能匹配也可能不匹配)
    \d 数字:[0-9]
    \D 非数字:[^0-9]
    \s 空白字符:[\t\n\x0B\f\r](\n回车 \r换行)
    \S 非空白字符:[^\s]
    \w 单词字符:[a-z A-Z _ 0-9] 
    \W 非单词字符:[^\w]
注意:一个预定义字符只能匹配一个字符,除非预定义字符配合了数量词使用。    
 
数量词:
    X? X, ?表示一次或零次
    X* X,零次或多次
    X+ X,一次或多次
    X{n} X,恰好出现n次
    X{n,} X,至少n次
    X{n,m} X,至少n次,最多m次
    
范围词:
    [abc]  a b 或c(简单类)
    [^abc] 任意字符除了a b c(否定)
    [a-zA-Z ] (范围)
注意:一个范围词没有配合数量词使用也只能匹配一个字符而已。

public class regular_demo2 {

	public static void main(String[] args) {
		/*
		System.out.println(".任何字符:"+("%".matches(".")));
		System.out.println("\\d代表数字:"+("12".matches("\\d\\d")));
		System.out.println("\\D代表数字:"+("&".matches("\\D")));
		System.out.println("\\s代表数字:"+("\r".matches("\\s")));
		System.out.println("\\w代表单词字符:"+("a".matches("\\w")));
		System.out.println("\\W代表数字:"+("*".matches("\\W")));
		 */
		/*
		System.out.println("?一次或零次:"+"".matches("\\d?"));
		System.out.println("*零次或多次:"+"12".matches("\\d*"));
		System.out.println("+一次或多次:"+"1".matches("\\d+"));
		System.out.println("{n}恰好n次:"+"12".matches("\\d{2}"));
		System.out.println("{n,}至少n次:"+"123".matches("\\d{2,}"));
		System.out.println("{n,m}至少n次,最多m次:"+"124567".matches("\\d{2,5}"));
		*/
		System.out.println("d".matches("[abc]+"));
		System.out.println("d".matches("[^abc]+"));
		System.out.println("123456".matches("[a-zA-Z0-9_]+"));
		
	}
}

正则对字符串的常见操作:

    匹配:matches
    切割: split()
    替换: replaceAll(String reg,String replace)
    查找 

public class regular_demo3 {

	public static void main(String[] args) {
		matchPhone("0133918670");
		matchTel("0372-7759404");
		splitTest1();
		splitTest2();
		replacePhone();
		replace2();
	}
	/*
	 匹配一个手机号:
	手机号码的规则:
		首位必须是1   第二位:3 4 5 7 8      长度必须是11位
	 */
	public static void matchPhone(String phone) {
		String reg="1[34578]\\d{9}";
		System.out.println(phone.matches(reg)?"合法手机号":"非合法手机号");
	}
	/*
	 匹配固定电话:
	 	规则:
	 		区号:1.长度3-4位    2. 0开头
	 		主机号:  首位不能是0     长度是7-8位
	 * */
	public static void matchTel(String tel) {
		String reg="0\\d{2,3}-[1-9]\\d{6,7}";
		System.out.println(tel.matches(reg)?"合法电话号":"非合法电话号");
	}
	//根据空格进行切割
	public static void splitTest1() {
		String str="明    天        学  i            o";
		String reg=" +";
		String[] strs=str.split(reg);//字符串数组
		System.out.println("数组的元素:"+Arrays.toString(strs));
	} 
	//根据重叠词进行切割
	public static void splitTest2() {
		String str= "小小小小米米米米米米米真美美美美美美美美美丽丽丽呢";
		String reg="(.)\\1+";//分组:(.)只有1组   \\1表示引用第1组的内容。
		String[] strs=str.split(reg);
		System.out.println("数组的元素:"+Arrays.toString(strs));

		/*
		 后面的一个正则字符要使用到前面正则匹配的内容。
		 前面正则的内容需要被复用起来。
		 如果正则的内容需要被复用,那么就需要对正则进行分组。
		 每个组都有一个编号,编号从1开始。 
		*/
	}
	//把手机号替换成***
	public static void replacePhone() {
		String str="有需要请联系13598121970有需要请联系13598121970有需要请联系13598121970有需要请联系13598121970";
		String reg="1[34578]\\d{9}";
		str=str.replaceAll(reg, "****");
		System.out.println(str);			
	}
	//去除重叠词
	public static void replace2() {
		String str="小小小小小小米米米米米米米米米真美美美美美美美美美美";
		String reg="(.)\\1+";//正则表达式
		str=str.replaceAll(reg, "$1");//注意如果引用正则的内容,如果不是在一个正则表达式内部,那么需要使用"$组号"进行引用。
		System.out.println(str);
	}
}

正则的查找:

如果正则表达式需要查找内容需要使用以下两个对象:
    Pattern(正则对象)
    Matcher(匹配器对象)
指定为字符串的正则表达式必须首先被编译为此类Pattern的实例。然后,Pattern对象可与任意字符序列匹配,匹配字符串之后可以得到一个Matcher对象,
所涉及与字符串匹配的状态都驻留在匹配器中。

典型的调用顺序:
    Pattern p=Pattern.compile("正则");
    Matcher m=p.matcher("aaaacccc");
    boolean b=m.matches();
匹配器常用的方法:
    find()  通知匹配器查找符合该正则的字符串。如果存在符合规则的字符串返回true,否则返回false.
    group() 获取符合规则的字符串。
    
注意:使用匹配器的方法时,要先调用find方法才能调用group方法。否则匹配器没有去查找合适的内容,报错。

单词边界匹配器:不匹配任何字符,只是代表了一个单词的开始或结束部分。
    \b   单词边界

public class regular_demo4 {
	//找出三个字符构成的单词
	
	public static void main(String[] args) {
		String str="jin tian hen kai xin ,tai yang he feng dou hen da";
		String reg="\\b[a-z]{3}\\b";//表示只能由三个小写字母组成,\\b表示了单词的开始和结束
		//第一步:要把字符串的正则编译成Pattern对象
		Pattern p=Pattern.compile(reg);
		//第二步:使用正则对象匹配字符串,得到一个matcher对象
		Matcher m=p.matcher(str);
		//
		//System.out.println("找到合适么?"+m.find());
		//System.out.println("内容:"+m.group());//只能获取到一个
		while(m.find()) {
			System.out.println("内容:"+m.group());
		}
	}
}
public class regular_demo5 {
	public static void main(String[] args) {
		System.out.println("hello world".matches("hello\\b world"));//true
	}
}

 

你可能感兴趣的:(java)