2021-08-04 Java学习基础第五天总结

Java第五天基础学习



1.集合体系
2.迭代器
3.并发修改异常
4.增强for循环
5.泛型
6.可变参数
7.正则表达式
8.数据结构


集合体系:

单列集合:

Collection接口:

LIst:接口
特点:

1.元素存取顺序一致(有序)
2.有索引
3.可重复
常用实现类:
1.ArrayList:底层是数组实现,查询快,增删慢
2.LinkedList:底层是链表实现,增删快,查询慢


Set接口:
特点:
1.元素存取顺序不一致(无序)
2.无所引
3.不重复
常用实现类:
1.HashSet
2.TreeSer


双列集合:

Map接口

在这里插入图片描述
在这里插入图片描述

源码参考:

package _02Collection和List接口;

import java.util.ArrayList;
import java.util.Collection;

/*
    目标:掌握Collection的常用方法

    1.Collection接口中常用方法:
        boolean add(E e)  往集合中添加元素
        boolean remove(Object o) 删除指定元素
        void clear() 清空集合所有元素
        boolean contains(Object o) 判断集合中是否包含某个元素
        boolean  isEmpty() 判断集合是否为空(元素个数为0)
        int size()获取集合的元素个数

    2.List接口的特有方法:
        void add(int index, E element)  在指定索引出添加元素
        E remove(int index) 根据索引删除元素,返回被删元素
        E set(int index, E element) 替换指定索引处的元素,返回被替换的元素
        E get(int index)    获取指定索引处的元素
 */
public class Demo1 {
    public static void main(String[] args) {

        //coll对象只能访问Collection中的方法
        Collection<String> coll = new ArrayList<>();
        coll.add("柳岩");
        coll.add("刘亦菲");
        coll.add("王一博");

        //删除指定元素
        //System.out.println(coll.remove("王一博"));

        //void clear() 清空集合所有元素
        //coll.clear();

        //boolean contains(Object o) 判断集合中是否包含某个元素
        //System.out.println( coll.contains("柳岩") ); //调用元素类自带的equals方法,比较是否一样

        //boolean  isEmpty() 判断集合是否为空(元素个数为0)
        //System.out.println( coll.isEmpty() );

        //int size()获取集合的元素个数
        System.out.println(  coll.size() );

        System.out.println(coll);
    }
}

package _02Collection和List接口;

import java.util.ArrayList;
import java.util.List;

/*
        4.List接口的特有方法:
            void add(int index, E element)  在指定索引出添加元素
            E remove(int index) 根据索引删除元素,返回被删元素
            E set(int index, E element) 替换指定索引处的元素,返回被替换的元素
            E get(int index)    获取指定索引处的元素
 */
public class Demo2 {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("柳岩");
        list.add("刘亦菲");
        list.add("王一博");

        //在指定索引出添加元素
        //list.add(0,"马云");

        //根据索引删除元素,返回被删元素
       // System.out.println(  list.remove(0));

        //替换指定索引处的元素,返回被替换的元素
        //System.out.println( list.set(2,"马云") );

        //获取指定索引处的元素
        System.out.println( list.get(0) );
        System.out.println( list.get(1) );
        System.out.println( list.get(2) );

        for(int i=0; i<list.size(); i++){
            System.out.println( list.get(i) );
        }

        System.out.println(list);
    }
}


迭代器:

Iterator接口常用方法:
在这里插入图片描述

遍历集合步骤:

Collection<String> coll = new ArrayList<>();
        coll.add("马云");
        coll.add("马化腾");
        coll.add("刘强东");
        //获取迭代器
        Iterator<String> itr = coll.iterator();

        //遍历元素
        while (itr.hasNext()){ //询问有没有下一个元素
            String name = itr.next(); //获取下一个元素
            System.out.println(name);
        }`

使用注意:

1.每次调用next()方法获取集合元素之前,先调用hasNext()方法判断是否有元素,否则使用next()时容易有异常
2.迭代遍历过程中,不能使用集合对象的add或者remove方法增删集合元素,否则会有并发修改异常
3.遍历过程中,如果需要删除元素,可以使用迭代器自身的remove方法。

源代码参考:

package _03Iterator迭代器遍历集合;


import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
    目标:掌握迭代器遍历元素的步骤

    小结:迭代器遍历元素的步骤

        1.获取迭代器对象:   集合对象.iterator();
        2.循环判断是否有下一个元素: 迭代器对象.hasNext()
        3.如果有元素,调用 next() 方法,取出元素。
 */
public class Demo1 {
    public static void main(String[] args) {

        Collection<String> coll = new ArrayList<>();
        coll.add("马云");
        coll.add("马化腾");
        coll.add("李彦宏");
        coll.add("刘强东");

        //获取迭代器
        Iterator<String> itr = coll.iterator();

        //遍历元素
        while (itr.hasNext()){ //询问有没有下一个元素
            String name = itr.next(); //获取下一个元素
            System.out.println(name);
        }

        //System.out.println(itr.next()); //NoSuchElementException 遍历结束,不能再次获取元素

        //如果还想继续遍历,需要重新获取新的迭代器对象
        Iterator<String> itr2 = coll.iterator();
        while (itr2.hasNext()){ //询问有没有下一个元素
            String name = itr2.next(); //获取下一个元素
            System.out.println(name);
        }


    }
}


并发修改异常

package _04并发修改异常_了解;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
    目标:了解迭代器遍历的常见问题

    1.什么情况下会出现并发修改异常?
        ConcurrentModificationException
        当使用迭代器遍历时,使用了集合对象增删元素,就会产生并发修改异常。

    2.如何避免并发修改异常?
        统一操作数据的对象。(使用迭代器遍历,并且使用迭代器删除)
 */
public class Demo1 {
    public static void main(String[] args) {

        Collection<Integer> list = new ArrayList<>();
        list.add(11);
        list.add(12);
        list.add(13);
        list.add(14);
        list.add(15);

        //删除集合中的偶数元素

        //迭代器遍历
        //使用迭代器对象遍历元素
        Iterator<Integer> itr = list.iterator();
        while ((itr.hasNext())){
            Integer num = itr.next();
            if(num%2==0){
               // list.remove(num); //使用集合对象删除元素 并发修改异常
                itr.remove();
            }
        }

        System.out.println(list);
    }
}


增强for循环:

格式:
for(元素类型 变量名:数组或者集合){
}
底层原理:
增强for底层是迭代器,作用是简化迭代器的语法
使用注意:
使用增强for遍历集合过程中,不能增删集合元素,否则会有并发修改异常

源码参考1:

package _05增强for循环;

import java.util.ArrayList;
import java.util.Collection;

/*
    目标:掌握增强for循环的使用

    1.格式:
        for(元素类型  变量名 : 数组或者集合){

        }

    2.原理:
        底层就是迭代器

    3.使用注意:
        在遍历过程无法增删元素,否则会有并发修改异常

 */
public class Demo1 {

    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        coll.add("马云");
        coll.add("马化腾");
        coll.add("李彦宏");
        coll.add("刘强东");

        //使用增强for遍历
        //在遍历过程无法增删元素,否则会有并发修改异常
        for (String name : coll) {
            System.out.println(name);
            //coll.remove("马云"); //此处运行会报并发修改异常
        }

        //遍历数组
        int[] arr = {11, 22, 33};
        for(int a : arr){
            System.out.println(a);
        }

    }

}

源码参考2:

package _05增强for循环;

import java.util.ArrayList;
import java.util.Collection;

/*
    目标:掌握增强for循环的使用

    1.格式:
        for(元素类型  变量名 : 数组或者集合){

        }

    2.原理:
        底层就是迭代器

    3.使用注意:
        在遍历过程无法增删元素,否则会有并发修改异常

 */
public class Demo2 {

    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        coll.add("马云");
        coll.add("马化腾");
        coll.add("李彦宏");
        coll.add("刘强东");

        for (String name : coll) {
            System.out.println(name);
            //coll.remove("马云");
        }

    }

   /*
   反编译代码:
   public static void main(String args[]){
		Collection coll = new ArrayList();
		coll.add("马云");
		coll.add("马化腾");
		coll.add("李彦宏");
		coll.add("刘强东");

		String name;

		for (Iterator iterator = coll.iterator(); iterator.hasNext(); System.out.println(name)){
			name = (String)iterator.next();
		}

        执行步骤:
            Iterator iterator = coll.iterator();

            iterator.hasNext();
            name = (String)iterator.next();
            System.out.println(name)

	}
*/
}


泛型:

泛型类:
public class 类名<类型标记>{
}
创建对象时,确定泛型类的泛型类型
泛型接口:
public interface 接口名<泛型标记>{
}
实现接口时,确定接口的泛型类型
泛型方法:
修饰符 <“T”> 返回值类型 方法名(T t){
}
调用方法时,传入实参时确定泛型类型

泛型通配符?:
当使用泛型的时候,无法确定泛型的具体类型时,可以使用通配符?来表示某一种类型
泛型上限:
? extends XX
?匹配的类型只能是XX或者XX的子类
泛型下限:
?super XX
?匹配的类型只能是XX或者XX的父类

源码参考1:

package _08泛型的概述;

import java.util.ArrayList;
import java.util.Map;

/*
    目标:了解泛型的概述和好处

    1.泛型的概述
        泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制。

    2.泛型的好处
        把运行期间的问题提前到了编译期间。
        避免了强制类型转换。

 */
public class Demo1 {
    public static void main(String[] args) {

        //<String> 作用规范集合容器的元素的类型 ,约束集合类型
        ArrayList<String> array = new ArrayList<>();
        array.add("java");
        array.add("c++");
        //array.add(11);
        String s = array.get(0);


        /*ArrayList array = new ArrayList();
        array.add(11);
        array.add("java");
        array.add("c++");
        array.add(3.14);
        array.add(true);

        //获取数据时,需要进行类型转换
        String o = (String)array.get(0);
        System.out.println(o.length());*/

    }

}

源码参考2:

package _09泛型类的定义和使用;

/*
    目标:掌握泛型类的定义格式

        泛型类定义格式:
            public class 类名<类型标记>{

            }
            类型标记可以写成 T E  K  V  A M 等(一个大写字母)

        泛型类使用:
            创建对象时,确定泛型类的泛型类型

 */
public class Demo1 {
    public static void main(String[] args) {

        //创建泛型类的对象
        Generic<String> g = new Generic<>();
        g.setValue("java");
        String value = g.getValue();
        System.out.println("value = " + value);

        Generic<Integer> g2 = new Generic<>();
        g2.setValue(100);
        Integer a = g2.getValue();
        System.out.println(a);


    }
}
package _09泛型类的定义和使用;

//定义了泛型类
//T 表示某一个引用数据类型,在类中,可以使用数据类型的地方,就可以使用T代替
public class Generic<T> {

    private T value;

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}


源码参考3:

package _10泛型接口的定义和使用;


/*
    目标:掌握泛型接口的定义格式

        泛型接口定义格式:
            public interface 接口名<泛型标记>{

            }

        泛型接口使用:
            实现接口时,在实现类中确定接口的泛型类型
 */
public class Demo1 {
    public static void main(String[] args) {

    }

}
package _10泛型接口的定义和使用;

public class My<T> implements MyList<T>{
    @Override
    public void add(T t) {

    }

    @Override
    public T get(int index) {
        return null;
    }
}
package _10泛型接口的定义和使用;


public class MyArrayList implements MyList<String>{

    @Override
    public void add(String s) {

    }

    @Override
    public String get(int index) {
        return null;
    }

}
package _10泛型接口的定义和使用;

public class MyLinkedList implements MyList<Integer> {
    @Override
    public void add(Integer integer) {

    }

    @Override
    public Integer get(int index) {
        return null;
    }
}
package _10泛型接口的定义和使用;

//定义泛型接口
public interface MyList<E> {

    void add(E e);

    E get(int index);


}

源码参考4:

package _11泛型方法的定义和使用;


/*
    目标:掌握泛型方法的定义格式

        泛型方法定义格式:
            修饰符  <T> 返回值类型 方法名(T t){

            }

        泛型方法使用:
            调用方法时,传入实参时确定泛型类型
 */
public class Demo1 {

    public static void main(String[] args) {
        //泛型方法的参数必须是引用类型
        Integer[] arr = {11, 22, 33};
        printArray(arr);

        Double[] arr2 = {1.1, 2.2, 3.3};
        printArray(arr2);
    }

    //定义泛型方法
    public static <T> void printArray(T[] arr) {
        System.out.print("[");

        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
            } else {
                System.out.print(arr[i] + ", ");
            }
        }

        System.out.println("]");
    }


    /*//数组的格式化打印
    public static void printArray(double[] arr){
        System.out.print("[");

        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1){
                System.out.print(arr[i]);
            }else {
                System.out.print(arr[i]+", ");
            }
        }

        System.out.println("]");
    }

    //数组的格式化打印
    public static void printArray(int[] arr){
        System.out.print("[");

        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1){
                System.out.print(arr[i]);
            }else {
                System.out.print(arr[i]+", ");
            }
        }

        System.out.println("]");
    }*/

}

泛型通配符参考源码:

package _12泛型通配符和泛型上下限.应用举例;

//汽车父类
public class Car {

}
package _12泛型通配符和泛型上下限.应用举例;

//奥迪汽车
public class Audi extends Car{

}
package _12泛型通配符和泛型上下限.应用举例;

//吉普汽车
public class Jeep extends Car{

}
package _12泛型通配符和泛型上下限.应用举例;

import java.util.ArrayList;

//qq飞车游戏
public class QQPlay {
    public static void main(String[] args) {
        ArrayList<Audi> audis = new ArrayList<>();
        audis.add(new Audi());
        audis.add(new Audi());
        play(audis);

        ArrayList<Jeep> jeeps = new ArrayList<>();
        jeeps.add(new Jeep());
        jeeps.add(new Jeep());
        play(jeeps);

        ArrayList<Car> cars = new ArrayList<>();
        cars.add(new Car());
        cars.add(new Car());
        play(cars);

       /* ArrayList<Dog> dogs = new ArrayList<>();
        play(dogs);

        ArrayList<Object> objs = new ArrayList<>();
        play(objs);*/

    }


    //定义方法,可以接收任意汽车集合(泛型没有重载和多态)
    //ArrayList<?> 表示 ArrayList集合可以接收任意类型
   /* public static void play(ArrayList<?> list){

    }*/

    //为了限制通配符能匹配的范围,需要使用上下限
    //? extends Car :泛型的类型只能Car或者Car的子类(上限)
    public static void play(ArrayList<? extends Car> list){

    }

    //? super Car :泛型的类型只能是Car或者Car的父类(下限)
    /*public static void play(ArrayList<? super Car> list){

    }*/

}

class Dog{

}



可变参数

使用场景
当方法形参的类型确定,而个数不确定时,可以使用可变参数(…)表示。
格式:
修饰符 返回值类型 方法名(参数类型…变量名){
}
原理:
可变参数的本质是数组。
使用注意:
一个方法中只能有一个可变参数。
当方法有多个参数时,可变参数必须时最后一个人参数

参考源码1:

package _13可变参数;

/*
	目标:掌握可变参数的使用
	
    可变参数格式:
        修饰符  返回值类型  方法名(参数类型 ... 变量名){

        }

    原理:
       可变参数底层就是数组
 */
public class Demo1 {
    public static void main(String[] args) {
        //如果参数是可变参,传参时参数个数可以变化
        System.out.println(getSum());
        System.out.println(getSum(1));
        System.out.println(getSum(1, 2));
        System.out.println(getSum(1, 2, 3));

        /*int[] arr = {1};
        System.out.println(getSum(arr));

        int[] arr2 = {1,2};
        System.out.println(getSum(arr2));

        int[] arr3 = {};
        System.out.println(getSum(arr3));*/
    }

    //可变参数底层就是数组
    public static int getSum(int... arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum+=arr[i];
        }
        return sum;
    }


   /* public static int getSum(int[] arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum+=arr[i];
        }
        return sum;
    }
    */

    /*public static int getSum(int a, int b){
        return a+b;
    }

    public static int getSum(int a, int b, int c){
        return a+b+c;
    }

    public static int getSum(int[] arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum+=arr[i];
        }
        return sum;
    }*/


}

参考源码2:

package _13可变参数;

import java.util.Collections;

/*
	可变参数使用注意:
		1.一个方法只能定义一个可变参数。
		2.如果方法中有多个参数,可变参数要放到最后。

 */
public class Demo2 {

    public static void main(String[] args) {
        getSum(1,2,3);

    }

    /*public static void getSum(int... arr, double ... arr2){

    }*/

    public static void getSum( int a, int... arr) {

    }


}


正则表达式:

作用:
正则表达式是一个强大的字符串处理工具,是用于匹配字符串的模板,可以对字符串进行格式化校验,查找,提取,替换等操作。

语法:
范围匹配:
常用写法:

[abz]:匹配abc中任意一个字符。
[a-z]:匹配小写字母a-z中的一个。
[A-Z]:匹配大写字母A-Z中的一个。
[0-9]:匹配数字0-9中的一个。
组合匹配:
[a-zA-Z0-9]:匹配a-z或者A-Z或者0-9之间的任意一个字符。
[a-dm-p]:匹配a-d或者m-p之间的任意一个字符。
排除匹配:
[^abc]:匹配除a、b、c之外的任意一个字符
[^a-z]:匹配除小写字母外的任意一个字符。

预定义字符:
“.”:匹配一个任意字符
“\d”:匹配一个数字字符,相当于[0-9]
“\D”:匹配一个非数字,相当于[^0-9]
“\s”:匹配一个空白字符
“\S”:匹配一个非空白字符
“\w”:匹配一个单词字符,包括大小写字母,数字,下划线,相当于[a-zA-Z0-9_]
“\W”:匹配一个非单词字符

数量词匹配
?0或1次
‘*’ 0次或者多次(任意次)
‘+’ 1次或者多次
{n} 重复n次
{n,} 重复n次以上(至少n次)
{n,m} 重复n到m次(包括n和m)

逻辑匹配符:
&& 并且(交集)
| :或者(并集)

分组:
()

参考源码1:

package _14正则表达式_演示;

/*
普通方式校验字符串:
    判断用户输入的身份证号码是否合法。
    规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。
 */
public class RegexTest1 {

    public static boolean checkId(String id){

        if(id==null){
            return false;
        }

        //号码为18位.如果不是18位,返回false
        if(id.length()!=18){
            return false;
        }
        //不能以数字0开头,如果以数字0开头,返回false
        if(id.startsWith("0")){
            return false;
        }
        //前17位只可以是数字,如果前17位中有不是数字的,返回false
        for(int i=0; i<17; i++){
            char ch = id.charAt(i);
            if(ch>'9' || ch<'0'){
                return false;
            }
        }
        //最后一位可以是数字或者大写字母X
        char last = id.charAt(17);
        if(last=='X' || (last>='0' && last<='9')){
            return true;
        }else {
            return false;
        }

    }

    //测试
    public static void main(String[] args) {
        System.out.println( checkId("445221199909091234") );
        System.out.println( checkId("44522119990909123X") );
        System.out.println( checkId("44522119990909123") );
        System.out.println( checkId("4452211999090912345") );
        System.out.println( checkId("045221199909091234") );
        System.out.println( checkId("4452A1199909091234") );
        System.out.println( checkId("44522119990909123x") );
    }



}
package _14正则表达式_演示;

/*
正则表达式校验字符串:
    判断用户输入的身份证号码是否合法。
    规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。
 */
public class RegexTest2 {

    public static boolean checkId(String id){

      if(id!=null){
          // 规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。
          return id.matches("[1-9]\\d{16}[0-9X]");
      }else {
          return false;
      }

    }

    //测试
    public static void main(String[] args) {
        System.out.println( checkId("445221199909091234") );
        System.out.println( checkId("44522119990909123X") );
        System.out.println( checkId("44522119990909123") );
        System.out.println( checkId("4452211999090912345") );
        System.out.println( checkId("045221199909091234") );
        System.out.println( checkId("4452A1199909091234") );
        System.out.println( checkId("44522119990909123x") );
    }
}

源码2:

package _15正则表达式语法_了解;

/*
    1.范围匹配 []
        [abc]:匹配abc中任意一个字符。
        [a-z]:匹配小写字母a-z中的一个。
        [A-Z]:匹配大写字母A-Z中的一个。
        [0-9]:匹配数字0-9中的一个。

        组合:
        [a-zA-Z0-9]:匹配a-z或者A-Z或者0-9之间的任意一个字符。
        [a-dm-p]: 匹配a-d或m-p之间的任意一个字符。


        排除:
        [^abc]:匹配除a、b、c之外的任意一个字符。
        [^a-z]:匹配除小写字母外的任意一个字符。
 */
public class Demo1 {

    public static void main(String[] args) {
        //字符串对象.matches("正则表达式") ,符合正则表达式规则,返回true

        //[abc]:匹配abc中任意一个字符。
        System.out.println( "a".matches("[abc]") );
        System.out.println( "b".matches("[abc]") );
        System.out.println( "c".matches("[abc]") );


        System.out.println( "ab".matches("[abc]b") ); //字符串的第一个字符可以是a,b,c,第二个字符只能是b

        //匹配abc的任意组合  acb  bca aaa  bbb  abb ...
        System.out.println( "acb".matches("[abc][abc][abc]") );
        System.out.println( "bbb".matches("[abc][abc][abc]") );


        //[a-z]:匹配小写字母a-z中的一个。
        System.out.println( "e".matches("[a-z]") );

        //[^abc]:匹配除a、b、c之外的任意一个字符。
        System.out.println( "我".matches("[^abc]") );

    }

}

参考源码3:

package _15正则表达式语法_了解;

/*
    2.预定义字符
        "." : 匹配一个任意字符
        "\d": 匹配一个数字字符,相当于[0-9]
        "\D": 匹配一个非数字,相当于[^0-9]

        "\s": 匹配一个空白字符
        "\S": 匹配一个非空白字符

        "\w": 匹配一个单词字符,包括大小写字母,数字,下划线,相当于[a-zA-Z0-9_]
        "\W": 匹配一个非单词字符
 */
public class Demo2 {
    public static void main(String[] args) {

        //匹配长度为4的数字验证码
        System.out.println("1234".matches("\\d\\d\\d\\d"));
        System.out.println("0495".matches("\\d\\d\\d\\d"));

        //匹配一个三位数 (100~999)
        System.out.println("100".matches("[1-9]\\d\\d"));
        System.out.println("999".matches("[1-9]\\d\\d"));

        // "\s": 匹配一个空白字符,只能匹配一个空白
        System.out.println(" ".matches("\\s"));

        //"." : 匹配一个任意字符
        System.out.println(" ".matches("."));
        System.out.println("中".matches("."));
        System.out.println("a".matches("."));
        System.out.println("9".matches("."));

        //只是单独匹配 . 这个符号
        System.out.println(".".matches("\\.")); //true
        System.out.println("!".matches("\\.")); //false
    }
}

参考源码4:

package _15正则表达式语法_了解;

/*
    3.数量词(限定符)
        ?   0次或1次
        *   0次或多次 (任意次)
        +   1次或多次

        {n}    重复n次
        {n,}   重复n次以上 (至少n次)
        {n,m}  重复n到m次(包括n和m)
 */
public class Demo3 {
    public static void main(String[] args) {
        //匹配长度为4的数字验证码
        System.out.println("1234".matches("\\d{4}"));

        //匹配密码 5-8位的密码 (密码只能是单词字符)
        System.out.println("34rrA_".matches("\\w{5,8}"));
        System.out.println("12345@".matches("\\w{5,8}"));

        //衣服尺码 比如:L XL  XXL  XXXL
        System.out.println("L".matches("X*L")); //X可以出现任意次,L只能固定
        System.out.println("XL".matches("X*L")); //X可以出现任意次,L只能固定
        System.out.println("XXXL".matches("X*L")); //X可以出现任意次,L只能固定

        //匹配任意一个英文单词,英文单词全部是小写字母就行
        //a  is  out  love  hello
        System.out.println("a".matches("[a-z]+"));
        System.out.println("love".matches("[a-z]+"));

    }

}

参考源码5:

package _15正则表达式语法_了解;

/*
    4.逻辑匹配
        && :并且(交集)
        |  :或者(并集)

    5.括号分组 ()
        正则表达式中用小括号()来做分组,也就是括号中的内容作为一个整体。
 */
public class Demo4 {
    public static void main(String[] args) {

        //逻辑匹配:
        //匹配除去tmd外任意一个小写字母
        System.out.println("m".matches("[[a-z]&&[^tmd]]"));
        System.out.println("h".matches("[[a-z]&&[^tmd]]"));
        System.out.println("A".matches("[[a-z]&&[^tmd]]"));

        //匹配邮箱后缀 com 或者 cn 或者 org
        System.out.println("cn".matches("com|cn|org"));
        System.out.println("org".matches("com|cn|org"));
        System.out.println("edu".matches("com|cn|org"));

        //( )分组
        //匹配 over! 字符串出现3次
        System.out.println("over!over!over!".matches("over!{3}")); //false,因为正则表达式匹配over!!!
        System.out.println("over!over!over!".matches("(over!){3}")); //true

    }
}

练习邮箱格式源码:

package _16练习_邮箱格式校验;

/*
    目标:使用正则表达式完成邮箱格式校验

    要求:
        邮箱地址必须是6~18个字符,可使用字母,数字,下划线,需要以字母开头。
        邮箱后缀支持 @163.com 或者 @126.com 或者 @yeah.net。
 */
public class Demo1 {
    public static void main(String[] args) {

        String email = "itheima@yeah.net";

        boolean result = email.matches("[a-zA-Z]\\w{5,17}@(163\\.com|126\\.com|yeah\\.net)");

        System.out.println(result);


    }
}

表达式拓展源码:

package _16练习_邮箱格式校验;

import java.util.Arrays;

/*
    String replaceAll(String regex, String replacement)
        将该字符串中所有匹配正则表达式的内容替换成新的字符串,并返回替换后的新的字符串。

    String[] split(String regex)
        根据匹配规则,把字符串分割成多个子串。

 */
public class Demo2 {
    public static void main(String[] args) {
        //replaceAll(正则表达式, 新的字符串)
        String date = "2021-8-4";

        //将日期换成2021/8/4
        String s = date.replaceAll("-", "/");
        System.out.println(s);

        /*String word =" 我   爱       java ";
        //把字符串的所有空格去掉
        String s1 = word.replaceAll(" ", "");
        System.out.println(s1);*/

        String word ="我   爱       java";
        //把字符串中间的空格换成一个空格 "我 爱 java"
        String s1 = word.replaceAll(" +", " ");
        System.out.println(s1);

        //split(String regex)
        String date1 = "2021-8-4";
        //将date1字符串切割出年,月,日
        String[] arr = date1.split("-");
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        String[] arr2 = word.split(" +");
        System.out.println(Arrays.toString(arr2));

    }
}


数据结构

栈:先进后厨
队列:先进先出
数组:查询快,增删慢
链表:增删快,查询慢

package _01常见数据结构_了解;

/*
    目标: 了解常见数据结构的特点

    小结:
        栈结构特点
            先进后出

        队列结构特点
            先进先出

        数组结构特点
            查询快,增删慢(有索引,长度固定)

        链表结构特点
            增删快,查询慢(有节点,节点能指向相邻元素)
 */
public class Demo1 {


}


今天就学到这里
小结:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值