Skip to content

day19.Map 集合

java
课前回顾:
  1.ArrayList底层原理:
    a.第一次add的时候会创建一个默认长度为10的数组
    b.超过数组,会自动扩容
    c.扩容:1.5倍
  2.LinkedList:
    a.特点:元素有序 无索引 元素可重复 线程不安全
    b.数据结构:双向链表
    c.方法:有大量直接操作首尾元素的方法
  3.泛型:
    a.含有泛型的类 -> new对象的时候确定类型
    b.含有泛型的方法 -> 在调用的时候确定类型
    c.含有泛型的接口
      在实现类的时候确定类型
      在实现类的时候不确定类型,需要在new的时候确定类型
    d.高级使用:
      上限:  ? extends 类型  ->?接收的类型应该是后面的本类类型以及子类类型
      下限:  ? super 类型 -> ?接收的类型应该是后面的本类类型以及父类类型
  4.增强for:
    a.格式:
      for(元素类型 变量名:集合名或者数组名){

      }
    b.遍历集合的时候底层原理为迭代器
      遍历数组的时候底层原理为普通for
  5.HashSet:
    a.特点: 无序 无索引 元素唯一 线程不安全
    b.数据结构:哈希表

  6.LinkedHashSet:
    a.特点:有序 无索引 元素唯一 线程不安全
    b.数据结构:哈希表+链表

  7.HashSet如何保证元素唯一的:
    先比较哈希值,再比较内容
    如果哈希值不一样,存
    如果哈希值一样,内容不一样,存
    如果哈希值一样,内容一样,去重复

  8.Collections:集合工具类
    addAll shuffle sort sort(集合,比较器)

今日重点:
 1.知道HashMap以及LinkedHashMap的特点以及使用
 2.知道HashMap和Hashtable的区别
 3.会使用properties属性集
 4.会遍历嵌套集合

第一章.Map 集合

1.Map 的介绍

java
1.概述:双列集合顶级接口
2.双列集合:
  一个元素由两部分构成 -> key和value(键值对)
  我们都是通过key获取value

2.HashMap 的介绍和使用

java
1.概述:是Map的实现类
2.特点:
  a.无序
  b.无索引
  c.key唯一,value可重复
  d.线程不安全
  e.可以存null键null值
3.数据结构:
  哈希表
4.方法:
  V put(K key, V value)  -> 添加元素,返回的是被替换的value值
  V remove(Object key)  ->根据key删除键值对,返回的是被删除的value
  V get(Object key) -> 根据key获取value
  boolean containsKey(Object key)  -> 判断集合中是否包含指定的key
  Collection<V> values() -> 获取集合中所有的value,转存到Collection集合中
  Set<K> keySet()->将Map中的key获取出来,转存到Set集合中
  Set<Map.Entry<K,V>> entrySet()->获取Map集合中的键值对,转存到Set集合中
java
public class Demo01HashMap {
    public static void main(String[] args) {
        HashMap<String, String> hashMap = new HashMap<>();
        //V put(K key, V value)  -> 添加元素,返回的是被替换的value值
        hashMap.put("涛哥","三上");
        hashMap.put("文章","马伊琍");
        hashMap.put("黄晓明","杨颖");
        String value = hashMap.put("涛哥", "金莲");
        System.out.println("value = " + value);
        hashMap.put("大郎","金莲");
        System.out.println(hashMap);
        //V remove(Object key)  ->根据key删除键值对,返回的是被删除的value
        System.out.println(hashMap.remove("大郎"));
        System.out.println(hashMap);
        //V get(Object key) -> 根据key获取value
        System.out.println(hashMap.get("黄晓明"));
        //boolean containsKey(Object key)  -> 判断集合中是否包含指定的key
        System.out.println(hashMap.containsKey("黄晓明"));
        //Collection<V> values() -> 获取集合中所有的value,转存到Collection集合中
        System.out.println(hashMap.values());
    }
}
java
1.概述:LinkedHashMap 是 HashMap的子类
2.特点:
  a.有序
  b.无索引
  c.key唯一,value可重复
  d.线程不安全
  e.可以存null键null值
3.数据结构:
  哈希表+链表
4.方法:
  和HashMap一样
java
public class Demo02LinkedHashMap {
    public static void main(String[] args) {
        LinkedHashMap<String, String> hashMap = new LinkedHashMap<>();
        //V put(K key, V value)  -> 添加元素,返回的是被替换的value值
        hashMap.put("涛哥","三上");
        hashMap.put("文章","马伊琍");
        hashMap.put("黄晓明","杨颖");
        hashMap.put("大郎","金莲");
        System.out.println(hashMap);
    }
}

3.HashMap 的两种遍历方式

3.1.方式 1:获取 key,根据 key 再获取 value

java
Set<K> keySet()->将Map中的key获取出来,转存到Set集合中
java
public class Demo03HashMap {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("张无忌","赵敏");
        map.put("段誉","王语嫣");
        map.put("虚竹","梦姑");
        map.put("乔峰","阿朱");
        map.put("杨过","小龙女");

        Set<String> set = map.keySet();
        for (String key : set) {
            String value = map.get(key);
            System.out.println(key+"..."+value);
        }
    }
}

3.2.方式 2:同时获取 key 和 value

1744076672433
java
Set<Map.Entry<K,V>> entrySet()->获取Map集合中的键值对,转存到Set集合中
java
public class Demo04HashMap {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("张无忌","赵敏");
        map.put("段誉","王语嫣");
        map.put("虚竹","梦姑");
        map.put("乔峰","阿朱");
        map.put("杨过","小龙女");

        Set<Map.Entry<String, String>> set = map.entrySet();
        for (Map.Entry<String, String> entry : set) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"..."+value);
        }
    }
}

4.Map 存储自定义对象时如何保证 key 唯一

java
1.细节:
  HashSet存储的元素都会存到Map集合的key位置,所以map如何保证key唯一的,set集合就是如何保证元素唯一的,所以set集合保证元素唯一的原理和map保证key唯一原理是一样的

2.想要保证key唯一,key必须重写hashCode和equals方法

3.保证key唯一的过程:
  先比较key的哈希值,再比较key的内容
  如果哈希值不一样,存
  如果哈希值一样,内容不一样,存
  如果哈希值一样,内容也一样,value覆盖前面的value
java
public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) && Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
java
public class Demo05HashMap {
    public static void main(String[] args) {
        HashMap<Person, String> map = new HashMap<>();
        map.put(new Person("张三", 20),"北京");
        map.put(new Person("李四", 21),"天津");
        map.put(new Person("张三", 20),"河北");
        System.out.println(map);
    }
}

5.Map 的练习

java
需求:用Map集合统计字符串中每一个字符出现的次数
步骤:
  1.创建String字符串
  2.创建HashMap集合,key为字符,value为次数
  3.遍历字符串,将每一个字符获取出来
  4.判断集合中是否包含指定的key,如果不包含,将该字符和1存到map中
  5.如果包含,根据key获取对应的value,将value+1,然后将字符和value重新存到map中
  6.输出map
1744078863674
java
public class Demo06HashMap {
    public static void main(String[] args) {
        //1.创建String字符串
        String data = "abdafdasfwef";
        //2.创建HashMap集合,key为字符,value为次数
        HashMap<String, Integer> map = new HashMap<>();
        //3.遍历字符串,将每一个字符获取出来
        char[] chars = data.toCharArray();
        for (char cChar : chars) {
            String key = cChar + "";
            //4.判断集合中是否包含指定的key,如果不包含,将该字符和1存到map中
            if (!map.containsKey(key)) {
                map.put(key, 1);
                //5.如果包含,根据key获取对应的value,将value+1,然后将字符和value重新存到map中
            }else{
                Integer value = map.get(key);
                value++;
                map.put(key, value);
            }
        }
        //6.输出map
        Set<Map.Entry<String, Integer>> set = map.entrySet();
        for (Map.Entry<String, Integer> entry : set) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"..."+value);
        }
    }
}

第二章.TreeSet

java
1.概述:是Set接口的实现类
2.特点:
  a.对元素进行排序
  b.无索引
  c.元素唯一
  d.线程不安全
3.数据结构:
  红黑树
4.构造方法:
  a.TreeSet() 将元素按照ASCII码排序
  b.TreeSet(Comparator<? super E> comparator) 按照指定的规则排序
java
public class Demo01TreeSet {
    public static void main(String[] args) {
        TreeSet<String> set = new TreeSet<>();
        set.add("a.床前明月光");
        set.add("c.举头望明月");
        set.add("d.低头思故乡");
        set.add("b.疑是地上霜");
        System.out.println(set);

        System.out.println("===========================");
        TreeSet<Person> set2 = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge()-o2.getAge();
            }
        });
        set2.add(new Person("张三", 18));
        set2.add(new Person("李四", 20));
        set2.add(new Person("王五", 19));
        System.out.println(set2);
    }
}
java
public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) && Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

第三章.TreeMap

java
1.概述:是Map接口的实现类
2.特点:
  a.可以对key进行排序
  b.无索引
  c.key唯一,value可重复
  d.线程不安全
3.数据结构:
  红黑树
4.构造:
  TreeMap() -> 将key按照ASCII码排序
  TreeMap(Comparator<? super K> comparator) -> 对key进行指定顺序排序
java
public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) && Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
java
public class Demo02TreeMap {
    public static void main(String[] args) {
        TreeMap<String, String> map = new TreeMap<>();
        map.put("1","锄禾日当午");
        map.put("3","谁知盘中餐");
        map.put("4","粒粒皆辛苦");
        map.put("2","汗滴禾下土");
        System.out.println(map);

        System.out.println("========================");
        TreeMap<Person, String> map1 = new TreeMap<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o2.getAge()-o1.getAge();
            }
        });
        map1.put(new Person("张三", 20), "河北");
        map1.put(new Person("李四", 30), "河南");
        map1.put(new Person("王五", 25), "山西");
        System.out.println(map1);
    }
}

第四章.Hashtable 和 Vector 集合(了解)

1.Hashtable 集合

java
1.概述:是Map接口的实现类
2.特点:
  a.无序
  b.无索引
  c.key唯一,value可重复
  d.线程安全
  e.不能存null
3.数据结构:
  哈希表
4.用法:和HashMap一样
java
public class Demo01Hashtable {
    public static void main(String[] args) {
        Hashtable<String, String> hashtable = new Hashtable<>();
        hashtable.put("涛哥","金莲");
        hashtable.put("庆庆","莲莲");
        hashtable.put("松松","虎虎");
        //hashtable.put(null,null);
        System.out.println(hashtable);
    }
}

Hashtable 和 HashMap 区别:

相同点:元素无序,无索引,key 唯一,都是哈希表

不同点:HashMap 线程不安全,Hashtable 线程安全

​ HashMap 可以存储 null 键 null 值;Hashtable 不能

2.Vector 集合

java
1.概述:是List接口的实现类
2.特点:
  a.元素有序
  b.有索引
  c.元素可重复
  d.线程安全
3.数据结构:
  数组
4.注意:
  a.如果利用空参构造创建对象,扩容默认是2倍
  b.如果利用有参构造创建对象,指定了容量增量,那么扩容就在数组长度的基础上加容量增量
java
public class Demo02Vector {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("张三");
        vector.add("李四");
        vector.add("王五");
        vector.add("赵六");
        System.out.println(vector);
        for (String s : vector) {
            System.out.println(s);
        }
    }
}
java
1.Vector() 构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量(扩容的长度)为零
java
Vector<String> vector = new Vector<>();
=======================================
public Vector() {
    this(10);
}
public Vector(int initialCapacity) {
    this(initialCapacity, 0);
}
public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
}

=========================================
假如正在添加第11个元素,会自动扩容
vector.add("赵六");
public synchronized boolean add(E e) {
    modCount++;
    add(e, elementData, elementCount);
    return true;
}
private void add(E e, Object[] elementData, int s) {
    if (s == elementData.length)
        elementData = grow();
    elementData[s] = e;
    elementCount = s + 1;
}
private Object[] grow() {
    return grow(elementCount + 1);
}
private Object[] grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = ArraysSupport.newLength(oldCapacity,
            minCapacity - oldCapacity, /* minimum growth */
            capacityIncrement > 0 ? capacityIncrement : oldCapacity
                                       /* preferred growth */);
    return elementData = Arrays.copyOf(elementData, newCapacity);
}
java
1.Vector(int initialCapacity, int capacityIncrement)使用指定的初始容量和容量增量构造一个空的向量
==============================
Vector<String> vector = new Vector<>(10,15);
public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
}

===============================
假设存储第11个元素
public synchronized boolean add(E e) {
    modCount++;
    add(e, elementData, elementCount);
    return true;
}
private void add(E e, Object[] elementData, int s) {
    if (s == elementData.length)
        elementData = grow();
    elementData[s] = e;
    elementCount = s + 1;
}
private Object[] grow() {
    return grow(elementCount + 1);
}
private Object[] grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = ArraysSupport.newLength(oldCapacity,
            minCapacity - oldCapacity, /* minimum growth */
            capacityIncrement > 0 ? capacityIncrement : oldCapacity
                                       /* preferred growth */);
    return elementData = Arrays.copyOf(elementData, newCapacity);
}

第五章.Properties 集合(属性集)

java
1.概述:
  是Hashtable的子类
2.特点:
  a.无序
  b.无索引
  c.key唯一,value可重复
  d.线程安全
  e.不能存null
  f.key和value固定为String
3.数据结构:
  哈希表
4.用法:和HashMap一样
5.特有方法:
  a.setProperty(String key, String value)  存键值对
  b.String getProperty(String key)  根据key获取value
  c.Set<String> stringPropertyNames()  获取所有的key保存到set集合中,类似于keySet
  d.void load(InputStream inStream)  -> 将流中的数据加载到properties集合中
java
public class Demo01Properties {
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.setProperty("username","root");
        properties.setProperty("password","123456");

        Set<String> set = properties.stringPropertyNames();
        for (String key : set) {
            String value = properties.getProperty(key);
            System.out.println(key+"..."+value);
        }
    }
}

使用场景:解析配置文件使用

properties
创建一个xxx.properties文件
username=root
password=root
java
public class Demo02Properties {
    public static void main(String[] args) throws IOException {
        Properties properties = new Properties();
        FileInputStream fis = new FileInputStream("day19_map/jdbc.properties");
        properties.load(fis);

        Set<String> set = properties.stringPropertyNames();
        for (String key : set) {
            String value = properties.getProperty(key);
            System.out.println(key+"..."+value);
        }
    }
}

第六章.集合嵌套

1.List 嵌套 List

java
需求:创建2个List集合,每个集合中分别存储一些字符串,将2个集合存储到第3个List集合中
java
public class Demo01ListInList {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("张三");
        list1.add("李四");
        list1.add("王五");

        ArrayList<String> list2 = new ArrayList<>();
        list2.add("赵六");
        list2.add("田七");
        list2.add("朱八");

        ArrayList<ArrayList<String>> list = new ArrayList<>();
        list.add(list1);
        list.add(list2);

        /*
          遍历
          先遍历大集合,将小集合获取出来
          再遍历小集合,将元素获取出来
         */

        for (ArrayList<String> arrayList : list) {
            for (String s : arrayList) {
                System.out.println(s);
            }
        }
    }
}

2.List 嵌套 Map

java
1班级有三名同学,学号和姓名分别为:1=张三,2=李四,3=王五,2班有三名同学,学号和姓名分别为:1=黄晓明,2=杨颖,3=刘德华,请将同学的信息以键值对的形式存储到2个Map集合中,再将2个Map集合存储到List集合中。
java
public class Demo02ListInMap {
    public static void main(String[] args) {
        HashMap<Integer, String> map1 = new HashMap<>();
        map1.put(1,"张三");
        map1.put(2,"李四");
        map1.put(3,"王五");

        HashMap<Integer, String> map2 = new HashMap<>();
        map2.put(1,"黄晓明");
        map2.put(2,"杨颖");
        map2.put(3,"刘德华");

        ArrayList<HashMap<Integer, String>> list = new ArrayList<>();
        list.add(map1);
        list.add(map2);

        //先遍历list,将两个map获取出来
        for (HashMap<Integer, String> map : list) {
            //遍历小map
            Set<Map.Entry<Integer, String>> set = map.entrySet();
            for (Map.Entry<Integer, String> entry : set) {
                System.out.println(entry.getKey() + "=" + entry.getValue());
            }
        }
    }
}

3.Map 嵌套 Map

java
- JavaSE  集合 存储的是 学号 键,值学生姓名
  - 1(key)  张三(value)
  - 2  李四

- JavaEE 集合 存储的是 学号 键,值学生姓名
  - 1  王五
  - 2  赵六
java
作业
  小map的key为学号,value为姓名
map的key为字符串(javase,javaee),value为小map

第七章.File 类

1.File 类

java
1.xxx.jpg一定是图片吗?
  不一定
2.什么叫做文本文档?
  用记事本打开人能看懂的文档 -> 比如.txt  .java .html .css
3.F:\idea\io\1.jpg中1.jpg的父路径是谁?
  F:\idea\io
4.路径名称分隔符:一个路径中,文件夹与文件夹或者与文件之间的分隔符
    windows:\
    linux: /

  路径分隔符:一个路径和其他路径之间的分隔符
    ;
java
1.File概述:文件和目录路径名的抽象表示形式 -> 说白了就是代表文件对象或者文件夹对象

2.File 的静态成员

java
static String pathSeparator  与系统有关的路径分隔符,为了方便,它被表示为一个字符串
static String separator    与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串
java
public class Demo01File {
    public static void main(String[] args) {
        //static String pathSeparator  与系统有关的路径分隔符,为了方便,它被表示为一个字符串
        System.out.println(File.pathSeparator);
        //static String separator    与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串
        System.out.println(File.separator);

        System.out.println("==================");
        /*
          写代码要求:一次编写,到处运行
          下面的代码直接写的是\
          但是代码到了linux上运行就不合适了,因为linux是/
         */
        //String path = "F:\\idea\\io\\1.png";
        //System.out.println(path);
        String path = "F:"+File.separator+"idea"+File.separator+"io"+File.separator+"1.png";
        System.out.println(path);
    }
}

3.File 的构造方法

java
File(String parent, String child) 根据所填写的路径创建File对象
     parent:父路径
     child:子路径
File(File parent, String child)  根据所填写的路径创建File对象
     parent:父路径,是一个File对象
     child:子路径
File(String pathname)  根据所填写的路径创建File对象
     pathname:直接指定路径
java
public class Demo02File {
    public static void main(String[] args) {
/*      File(String parent, String child) 根据所填写的路径创建File对象
        parent:父路径
        child:子路径*/
        File file1 = new File("F:\\idea\\io", "1.png");
        System.out.println("file1 = " + file1);
/*      File(File parent, String child)  根据所填写的路径创建File对象
        parent:父路径,是一个File对象
        child:子路径*/
        File parent = new File("F:\\idea\\io");
        File file2 = new File(parent, "1.jpg");
        System.out.println("file2 = " + file2);
/*      File(String pathname)  根据所填写的路径创建File对象
        pathname:直接指定路径*/

        File file3 = new File("F:\\idea\\io\\1.jpg");
        System.out.println("file3 = " + file3);
    }
}

我们表示的文件或者文件夹的对象,可以不存在,但是没意义

4.File 的获取方法

java
String getAbsolutePath() -> 获取File的绝对路径->带盘符的路径
String getPath() ->获取的是封装路径->new File对象的时候写的啥路径,获取的就是啥路径
String getName()  -> 获取的是文件或者文件夹名称
long length() -> 获取的是文件的长度 -> 文件的字节数
java
public class Demo03File {
    public static void main(String[] args) {
        //String getAbsolutePath() -> 获取File的绝对路径->带盘符的路径
        File file = new File("F:\\1.jpg");
        System.out.println(file.getAbsolutePath());
        //String getPath() ->获取的是封装路径->new File对象的时候写的啥路径,获取的就是啥路径
        System.out.println(file.getPath());
        //String getName()  -> 获取的是文件或者文件夹名称
        File file1 = new File("F:\\idea\\io\\1.txt");
        System.out.println(file1.getName());
        //long length() -> 获取的是文件的长度 -> 文件的字节数
        System.out.println(file1.length());
    }
}

5.File 的创建方法

java
boolean createNewFile()  -> 创建文件
        如果要创建的文件之前有,创建失败,返回false
        如果要创建的文件之前没有,创建成功,返回true

boolean mkdirs() -> 创建文件夹(目录)既可以创建多级文件夹,还可以创建单级文件夹
        如果要创建的文件夹之前有,创建失败,返回false
        如果要创建的文件夹之前没有,创建成功,返回true
java
public class Demo04File {
    public static void main(String[] args) throws IOException {
        /*
          boolean createNewFile()  -> 创建文件
           如果要创建的文件之前有,创建失败,返回false
           如果要创建的文件之前没有,创建成功,返回true
         */
        File file = new File("F:\\idea\\io\\2.txt");
        System.out.println(file.createNewFile());

        /*
          boolean mkdirs() -> 创建文件夹(目录)既可以创建多级文件夹,还可以创建单级文件夹
           如果要创建的文件夹之前有,创建失败,返回false
           如果要创建的文件夹之前没有,创建成功,返回true
         */
        File file2 = new File("F:\\idea\\io\\a\\b\\c");
        System.out.println(file2.mkdirs());
    }
}

6.File 类的删除方法

java
boolean delete()->删除文件或者文件夹

注意:
  1.如果删除文件,不走回收站
  2.如果删除文件夹,必须是空文件夹,而且也不走回收站
java
public class Demo05File {
    public static void main(String[] args) {
       /*
        boolean delete()->删除文件或者文件夹

        注意:
        1.如果删除文件,不走回收站
        2.如果删除文件夹,必须是空文件夹,而且也不走回收站
        */
        File file = new File("F:\\idea\\io\\2.txt");
        System.out.println(file.delete());

        File file2 = new File("F:\\idea\\io\\a");
        System.out.println(file2.delete());
    }
}

7.File 类的判断方法

java
boolean isDirectory() -> 判断是否为文件夹
boolean isFile()  -> 判断是否为文件
boolean exists()  -> 判断文件或者文件夹是否存在
java
public class Demo06File {
    public static void main(String[] args) {
        File file = new File("F:\\idea\\io\\1.txt");
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
        System.out.println(file.exists());
    }
}

8.File 的遍历方法

java
File[] listFiles()-> 遍历指定的文件夹,返回的是File数组 ->这个推荐使用
java
    public static void main(String[] args) {
        File file = new File("F:\\idea\\io\\aa");
        File[] files = file.listFiles();
        for (File file1 : files) {
            System.out.println(file1);
        }
    }
}

练习:将指定文件夹下面的所有.jpg 的图片都获取出来

java
public class Demo08File {
    public static void main(String[] args) {
        File file = new File("F:\\idea\\io\\aa");
        method(file);
    }

    private static void method(File file) {
        //1.遍历file对象表示的文件夹
        File[] files = file.listFiles();
        for (File file1 : files) {
            //2.判断如果是文件,就直接获取文件名
            if (file1.isFile()) {
                //3.判断文件名是否是以.jpg结尾的
                String name = file1.getName();
                if (name.endsWith(".jpg")){
                    System.out.println(name);
                }
            }else{
                method(file1);
            }
        }
    }
}

9.相对路径和绝对路径

java
1.绝对路径:带盘符的路径
2.相对路径:不带盘符的路径

3.什么时候使用绝对路径和相对路径:
  跨盘符写路径可以使用使用绝对路径
  不跨盘符可以使用相对路径

4.在idea中如何写相对路径:
  a.哪个路径为参照路径,哪个路径就可以省略不写
  b.什么是参照路径:当前project的绝对路径

  c.举例1:在day19_map_file这个模块下创建了一个1.txt,1.txt的相对路径怎么写?
         先将1.txt的绝对路径写出来:F:\idea\workspace\BJ_241229Java\day19_map_file\\1.txt
         再找出参照路径:F:\idea\workspace\BJ_241229Java
         干掉参照路径,剩下的就是1.txt的相对路径写法:day19_map_file\\1.txt

5.总结:
  a.在idea中写相对路径从模块名开始写
  b.如果不带模块名,那么默认位置就是在当前project下

ArrayList

java
1.元素有序
2.有索引
3.元素可重复
4.线程不安全
5.数据结构:数组

LinkedList

java
1.元素有序
2.无索引
3.元素可重复
4.线程不安全
5.数据结构:双向链表

Vector

java
1.元素有序
2.有索引
3.元素可重复
4.线程安全
5.数据结构:数组

HashSet

java
1.元素无序
2.无索引
3.元素唯一
4.线程不安全
5.数据结构:哈希表

LinkedHashSet

java
1.元素有序
2.无索引
3.元素唯一
4.线程不安全
5.数据结构:哈希表+双向链表

TreeSet

java
1.对元素进行排序
2.无索引
3.元素唯一
4.线程不安全
5.数据结构:红黑树

HashMap

java
1.无序
2.无索引
3.key唯一,value可重复
4.线程不安全
5.可以存null键null值
6.数据结构:哈希表

LinkedHashMap

java
1.有序
2.无索引
3.key唯一,value可重复
4.线程不安全
5.可以存null
6.数据结构:哈希表+双向链表

TreeMap

java
1.可以对key进行排序
2.无索引
3.key唯一,value可重复
4.线程不安全
5.key不能为null
6.数据结构:红黑树

Hashtable

java
1.无序
2.无索引
3.key唯一,value可重复
4.线程安全
5.不能存null
6.数据结构:哈希表

Properties

java
1.无序
2.无索引
3.key唯一,value可重复
4.线程安全
5.key和value只能是String
6.数据结构:哈希表

是唯一一个能和IO流结合使用的集合,解析配置文件使用

第八章.哈希表

1744099603792

第九章.正则表达式

1.正则表达式的概念及演示

java
1.概述:用于校验一个字符串
2.作用:用于校验规则:比如用户名  密码   手机号  身份证号   邮箱等
3.方法:String中的方法:
  boolean matches(正则表达式)-> 判断字符串是否符合指定的正则规则
4.举例: 校验QQ号:
       不能以0开头,都是数字,5-15位
java
public class Demo01Regex {
    public static void main(String[] args) {
        /*
          不能以0开头,都是数字,5-15位
         */
        boolean result = "03112312312".matches("[1-9][0-9]{4,14}");
        System.out.println("result = " + result);
    }
}

2.正则表达式-字符类

java
java.util.regex.Pattern:正则表达式的编译表示形式。
    正则表达式-字符类:[]表示一个区间,范围可以自己定义
        语法示例:
        1. [abc]:代表a或者b,或者c字符中的一个。
        2. [^abc]:代表除a,b,c以外的任何字符。
        3. [a-z]:代表a-z的所有小写字符中的一个。
        4. [A-Z]:代表A-Z的所有大写字符中的一个。
        5. [0-9]:代表0-9之间的某一个数字字符。
        6. [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
        7. [a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符
java
        //1.验证字符串是否以h开头,d结尾,中间是aeiou的某一个字符

        //2.验证字符串是否以h开头,d结尾,中间不是aeiou的某一个字符

        //3.验证字符串是否是开头a-z的任意一个小写字母,后面跟ad
java
public class Demo02Regex {
    public static void main(String[] args) {
        //1.验证字符串是否以h开头,d结尾,中间是aeiou的某一个字符
        boolean result01 = "had".matches("[h][aeiou][d]");
        System.out.println("result01 = " + result01);
        //2.验证字符串是否以h开头,d结尾,中间不是aeiou的某一个字符
        boolean result02 = "had".matches("[h][^aeiou][d]");
        System.out.println("result02 = " + result02);
        //3.验证字符串是否是开头a-z的任意一个小写字母,后面跟ad
        boolean result03 = "aad".matches("[a-z][a][d]");
        System.out.println("result03 = " + result03);
    }
}

3.正则表达式-逻辑运算符

java
 正则表达式-逻辑运算符
        语法示例:
        1. &&:并且
        2. | :或者
java
        //1.要求字符串是小写字母并且字符不能以[aeiou]开头,后面跟ad

        //2.要求字符是aeiou的某一个字符开头,后面跟ad
java
public class Demo03Regex {
    public static void main(String[] args) {
        //1.要求字符串是小写字母并且字符不能以[aeiou]开头,后面跟ad
        boolean result01 = "yad".matches("[[a-z]&&[^aeiou]][a][d]");
        System.out.println("result01 = " + result01);
        //2.要求字符是aeiou的某一个字符开头,后面跟ad
        boolean result02 = "aad".matches("[a|e|i|o|u][a][d]");
        System.out.println("result02 = " + result02);
    }
}

4.正则表达式-预定义字符

java
 正则表达式-预定义字符
    语法示例:
    1. "." : 匹配任何字符。(重点)  不能加[]
    2. "\\d":任何数字[0-9]的简写;(重点)
    3. "\\D":任何非数字[^0-9]的简写;
    4. "\\s": 空白字符:[ \t\n\x0B\f\r] 的简写
    5. "\\S": 非空白字符:[^\s] 的简写
    6. "\\w":单词字符:[a-zA-Z_0-9]的简写(重点)
    7. "\\W":非单词字符:[^\w]
java
        //1.验证字符串是否是三位数字


        //2.验证手机号: 1开头 第二位3 5 8 剩下的都是0-9的数字


        //3.验证字符串是否以h开头,d结尾,中间是任意一个字符
java
public class Demo04Regex {
    public static void main(String[] args) {
        //1.验证字符串是否是三位数字
        //boolean result01 = "111".matches("[0-9][0-9][0-9]");
        boolean result01 = "111".matches("\\d\\d\\d");
        System.out.println("result01 = " + result01);
        //2.验证手机号: 1开头 第二位3 5 8 剩下的都是0-9的数字
        boolean result02 = "13838381438".matches("[1][358]\\d\\d\\d\\d\\d\\d\\d\\d\\d");
        System.out.println("result02 = " + result02);
        //3.验证字符串是否以h开头,d结尾,中间是任意一个字符
        boolean result03 = "h1d".matches("[h].[d]");
        System.out.println("result03 = " + result03);
    }
}

5. 正则表达式-数量词

java
 正则表达式-数量词
        语法示例:x代表字符
        1. X? : x出现的数量为 0次或1次
        2. X* : x出现的数量为 0次到多次 任意次
        3. X+ : x出现的数量为 1次或多次 X>=1次
        4. X{n} : x出现的数量为 恰好n次 X=n次
        5. X{n,} : x出现的数量为 至少n次 X>=n次  x{3,}
        6. X{n,m}: x出现的数量为 n到m次(n和m都是包含的)   n=<X<=m
java
        //1.验证字符串是否是三位数字


        //2.验证手机号: 1开头 第二位3 5 8 剩下的都是0-9的数字


        //3.验证qq号:  不能是0开头,都是数字,长度为5-15
java
public class Demo05Regex {
    public static void main(String[] args) {
        //1.验证字符串是否是三位数字
        boolean result01 = "111".matches("\\d{3}");
        System.out.println("result01 = " + result01);

        //2.验证手机号: 1开头 第二位3 5 8 剩下的都是0-9的数字
        boolean result02 = "13838381438".matches("[1][358]\\d{9}");
        System.out.println("result02 = " + result02);
        //3.验证qq号:  不能是0开头,都是数字,长度为5-15
        boolean result03 = "11111".matches("[1-9][0-9]{4,14}");
        System.out.println("result03 = " + result03);
    }
}

6.正则表达式-分组括号( )

java
正则表达式-分组括号( )  (abc)
java
public class Demo06Regex {
    public static void main(String[] args) {
        boolean result = "abcabcabcabcab".matches("(abc)*");
        System.out.println("result = " + result);
    }
}

7.String 类中和正则表达式相关的方法

java
 String类中和正则表达式相关的方法
        boolean matches(String regex) 判断字符串是否匹配给定的正则表达式。
        String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
        String replaceAll(String regex, String replacement)把满足正则表达式的字符串,替换为新的字符
java
public class Demo07Regex {
    public static void main(String[] args) {
        //String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
        String s1 = "abc sdfads  sadfasd ";
        String[] arr = s1.split(" +");
        System.out.println(Arrays.toString(arr));
        //String replaceAll(String regex, String replacement)把满足正则表达式的字符串,替换为新的字符
        String s = s1.replaceAll(" +", "z");
        System.out.println("s = " + s);
    }
}

8.正则表达式生成网址:

html
https://www.sojson.com/regex/generate