Java学习笔记(17)

双列集合:

------------------| Map  如果是实现了Map接口的集合类,具备的特点是:存储的数据都是以键值对的形式存在的键不可重复,值可以重复

----------------------| HashMap

----------------------| TreeMap

----------------------| Hashtable

Map集合的方法:

添加:
  put(K key, V value)
  putAll(Map<? extends K,? extends V> m)

public class Demo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Map<String, String> map=new HashMap<String,String>();
        //添加方法
        map.put("汪峰", "章子怡");
        map.put("文章", "马伊琍");
        map.put("许一清", "沈某");
        System.out.println("返回值:"+map.put("许一清", "宋某"));//如果之前没有存在该键,那么返回的是null,如果之前就已经存在该键了,那么就返回之前该键对应的值
        map.put("狗娃", "宋某");
        System.out.println("集合的元素是:"+map);
        
        Map<String, String> map2=new HashMap<String,String>();
        map2.put("系综", "彭总");
        map2.put("狗蛋", "郝某");
        map.putAll(map2);//把map2的元素添加到map集合中
        
        System.out.println("集合的元素:"+map);
    }

}

结果:
返回值:沈某
集合的元素是:{狗娃=宋某, 文章=马伊琍, 汪峰=章子怡, 许一清=宋某}
集合的元素:{狗娃=宋某, 文章=马伊琍, 狗蛋=郝某, 汪峰=章子怡, 许一清=宋某, 系综=彭总}

删除:
    remove(Object key)      根据键删除一条map中的数据,返回的是其对应的值
    clear()      清空集合的元素数据

获取:
  get(Object key)  根据键获取对应的值
  size()    获取map集合中键值对的个数

判断:
  containsKey(Object key)      判断map集合是否包含指定的键
  containsValue(Object value)     判断map集合是否包含指定的值

  isEmpty()    判断map是否为空

null可以作为键和值存入集合

迭代:
  keySet()
  values()
  entrySet()

public class Demo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Map<String, String> map=new HashMap<String,String>();
        //添加方法
        map.put("汪峰", "章子怡");
        map.put("文章", "马伊琍");
        map.put("许一清", "沈某");
        //System.out.println("返回值:"+map.put("许一清", "宋某"));//如果之前没有存在该键,那么返回的是null,如果之前就已经存在该键了,那么就返回之前该键对应的值
        map.put("狗娃", "宋某");
        //添加方法
        /*Map<String, String> map2=new HashMap<String,String>();
        map2.put("系综", "彭总");
        map2.put("狗蛋", "郝某");
        map.putAll(map2);//把map2的元素添加到map集合中
*/        
        //System.out.println("集合的元素:"+map);
        System.out.println("根据指定的键获取对应的值:"+map.get("文章"));
        System.out.println("map集合中键值对的个数:"+map.size());
        System.out.println(map.isEmpty());
        System.out.println("集合的元素是:"+map);
        map.remove("狗娃");
        map.clear();
        
        System.out.println("集合的元素是:"+map);
    }

}

结果:
根据指定的键获取对应的值:马伊琍
map集合中键值对的个数:4
false
集合的元素是:{狗娃=宋某, 文章=马伊琍, 汪峰=章子怡, 许一清=沈某}
集合的元素是:{}

 Map的三种遍历方式:

package cn.itcast.map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/*
 
 迭代:
          keySet()    把map集合中的所有键都保存到一个Set类型的集合对象中返回        缺点:keySet方法只是返回了所有的键,没有值
          values()     把所有的值存储到一个Collection集合中返回        缺点:values方法只能返回所有的值,没有键
          entrySet()
          
  
  */
public class Demo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Map<String, String> map=new HashMap<String,String>();
        //添加方法
        map.put("汪峰", "章子怡");
        map.put("文章", "马伊琍");
        map.put("许一清", "沈某");
        map.put("成龙", "林凤娇");
        //map集合中遍历方式一:使用keySet方法进行遍历
        Set<String> keys=map.keySet();
        Iterator<String> it=keys.iterator();
        while (it.hasNext()) {
            String key=it.next();
            System.out.println("键:"+key+" 值:"+map.get(key));
        }
        
        //map集合的遍历方式二:使用values方法进行遍历
        Collection<String> c=map.values();
        Iterator<String> it2=c.iterator();
        while (it2.hasNext()) {
            System.out.println("值:"+it2.next());
        }
        
        //map集合的遍历方式三: 使用entrySet方法进行遍历
        Set<Map.Entry<String,String>> entrys=map.entrySet();
        Iterator<Map.Entry<String,String>> it3=entrys.iterator();
        while (it3.hasNext()) {
            Map.Entry<String,String> entry=it3.next();
            System.out.println("键:"+entry.getKey()+" 值:"+entry.getValue());
        }
    }

}

结果:
键:文章 值:马伊琍
键:成龙 值:林凤娇
键:汪峰 值:章子怡
键:许一清 值:沈某
值:马伊琍
值:林凤娇
值:章子怡
值:沈某
键:文章 值:马伊琍
键:成龙 值:林凤娇
键:汪峰 值:章子怡
键:许一清 值:沈某

HashMap:底层也是基于哈希表实现的

HashMap的存储原理:

    往HashMap添加元素的时候,首先会调用键的hashCode方法,得到元素的哈希码值,然后经过运算就可以算出该元素在哈希表中的存储位置

  1. 情况一:如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中
  2. 情况二:如果算出的位置目前已经存在其他的元素,那么还会调用该元素d的equals方法与这个位置上的元素进行比较,如果equals方法返回的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为c重复元素,不允许存储
package cn.itcast.map;

import java.util.HashMap;

public class Demo5 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashMap<Person, String> map=new HashMap<Person,String>();
        map.put(new Person(110, "狗娃"), "001");
        map.put(new Person(220, "狗剩"), "002");
        map.put(new Person(330, "铁蛋"), "003");
        map.put(new Person(110, "狗娃"), "007");//如果出现了相同的键,那么后添加的数据的值会取代之前的值。
        System.out.println("集合的元素:"+map);
    }

}
class Person {
    int id;
    String name;
    public Person(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "[编号:"+this.id+" 姓名:"+this.name+"]";
    }
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return this.id;
    }
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        Person p=(Person)obj;
        return this.id==p.id;
    }
}

结果:
集合的元素:{[编号:330 姓名:铁蛋]=003, [编号:220 姓名:狗剩]=002, [编号:110 姓名:狗娃]=007}

TreeMap:TreeMap也是基于红黑树(二叉树)数据结构实现的,特点:会对元素的键进行排序存储

 TreeMap要注意的事项:

  1. 往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储
  2. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,那么键所属的类必须要实现Comparable接口,把键的比较规则定义在CompareTo方法上
  3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须在创建TreeMap对象的时候传入比较器
package cn.itcast.map;

import java.util.Comparator;
import java.util.TreeMap;

public class Demo6 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*TreeMap<Character, Integer> tree=new TreeMap<Character,Integer>();
        tree.put('c', 10);
        tree.put('b', 2);
        tree.put('a', 5);
        tree.put('h', 12);
        System.out.println(tree);*/
        //创建一个自定义比较器
        MyComparator comparator=new MyComparator();
        
        
        TreeMap<Emp, String> tree=new TreeMap<Emp,String>(comparator);
        tree.put(new Emp("冰冰", 2000), "001");
        tree.put(new Emp("家宝", 1000), "002");
        tree.put(new Emp("大总", 3000), "003");
        tree.put(new Emp("克己", 5000), "005");
        tree.put(new Emp("克人", 5000), "008");//相同的不会取代,但是值会取代
        System.out.println(tree);
    }

}
class Emp {//implements Comparable<Emp>{
    String name;
    int salary;
    public Emp(String name, int salary) {
        super();
        this.name = name;
        this.salary = salary;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "[姓名:"+this.name+" 薪水:"+this.salary+"]";
    }

    /*@Override
    public int compareTo(Emp o) {
        // TODO Auto-generated method stub
        return this.salary-o.salary;
    }*/
}
class MyComparator implements Comparator<Emp> {

    @Override
    public int compare(Emp o1, Emp o2) {
        // TODO Auto-generated method stub
        return o1.salary-o2.salary;
    }
    
}

结果:
{[姓名:家宝 薪水:1000]=002, [姓名:冰冰 薪水:2000]=001, [姓名:大总 薪水:3000]=003, [姓名:克己 薪水:5000]=008}

 需求:定义一个TreeMap,键存储的是书对象,值存储的是字符串。根据书的出版日期排序

package cn.itcast.map;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TreeMap;

/*
 
 需求:定义一个TreeMap,键存储的是书对象,值存储的是字符串。根据书的出版日期排序
  
  
  */
public class Demo7 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TreeMap<Book, String> map=new TreeMap<Book,String>();//值存储书名
        map.put(new Book("红楼梦","1990-12-03"),"001");
        map.put(new Book("西游记","1993-08-13"),"002");
        map.put(new Book("水浒传","1989-04-03"),"003");
        map.put(new Book("三国演义","1997-10-04"),"004");
        System.out.println(map);
    }

}
class Book implements Comparable<Book>{
    String name;
    String date;//出版日期
    public Book() {}
    public Book(String name, String date) {
        super();
        this.name = name;
        this.date = date;
    }
    //利用字符串的CompareTo方法进行排序
    /*@Override
    public int compareTo(Book o) {
        // TODO Auto-generated method stub
        return this.date.compareTo(o.date);
    }*/
    
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "[ 书名:"+this.name+" 出版日期:"+this.date+"]";
    }
    //先把字符串的日期转换Date对象,然后再使用Date对象进行比较
    @Override
    public int compareTo(Book o) {
        // TODO Auto-generated method stub
        //日期格式化类
        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
        //使用日期格式化类把字符转换成Date对象
        Date date1=null;
        Date date2=null;
        try {
            date1=dateFormat.parse(this.date);
            date2=dateFormat.parse(o.date);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return date1.compareTo(date2);
    }
    
}

结果:
{[ 书名:水浒传 出版日期:1989-04-03]=003, [ 书名:红楼梦 出版日期:1990-12-03]=001, [ 书名:西游记 出版日期:1993-08-13]=002, [ 书名:三国演义 出版日期:1997-10-04]=004}

HashTable:底层也是依赖了哈希表实现的,也就是实现方式与HashMap是一致的,但是HashTable是线程安全的,操作效率低。

Collections:

Collections:常见方法:
1, 对list进行二分查找:
   //前提该集合一定要有序。
    int binarySearch(list,key);
    int binarySearch(list,key,Comparator);
2,对list集合进行排序。
    sort(list);
    sort(list,comaprator);
3,对集合取最大值或者最小值。
    max(Collection)
    max(Collection,comparator)
    min(Collection)
    min(Collection,comparator)
4,对list集合进行反转。
    reverse(list);
8,可以将不同步的集合变成同步的集合。
    Set synchronizedSet(Set<T> s)
    Map synchronizedMap(Map<K,V> m)
    List synchronizedList(List<T> list)  

package cn.itcast.util;

import java.util.ArrayList;
import java.util.Collections;

/*
 
 集合的工具类(Collections):
     说出Collection与Collections的区别
         1.Collection是一个单例集合的根接口,Collections是操作集合对象的一个工具类
Collections:常见方法:
1,    对list进行二分查找:
        前提该集合一定要有序。
        int binarySearch(list,key);
        int binarySearch(list,key,Comparator);
2,对list集合进行排序。
        sort(list); 
        sort(list,comaprator);
3,对集合取最大值或者最小值。
        max(Collection)
        max(Collection,comparator)
        min(Collection)
        min(Collection,comparator)
4,对list集合进行反转。
        reverse(list);
8,可以将不同步的集合变成同步的集合。
        Set synchronizedSet(Set<T> s)        Collections.synchronizedSet(Set<T> s)会返回一个线程安全的Set集合
        Map synchronizedMap(Map<K,V> m)
        List synchronizedList(List<T> list)
 
  
  */
public class Demo1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Integer> list=new ArrayList<Integer>();
        list.add(12);
        list.add(1);
        list.add(2);
        list.add(19);
        //排序
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
        System.out.println("元素所在的索引值是:"+Collections.binarySearch(list, 12));
        System.out.println("最大值是:"+Collections.max(list));
        System.out.println("最小值是:"+Collections.min(list));
        Collections.reverse(list);
        System.out.println(list);
        //System.out.println(list);
    }


}

结果:
[12, 1, 2, 19]
[1, 2, 12, 19]
元素所在的索引值是:2
最大值是:19
最小值是:1
[19, 12, 2, 1]
package cn.itcast.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Demo2 {
    //如果单例集合存储的都是不具备自然顺序的元素,那么排序需要传入比较器
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Person> list=new ArrayList<Person>();
        list.add(new Person("狗娃", 12));
        list.add(new Person("张三", 22));
        list.add(new Person("铁蛋", 2));
        Collections.sort(list, new AgeComparator());
        System.out.println("集合中的元素:"+list);
        System.out.println("找到的索引值是:"+Collections.binarySearch(list,new Person("铁蛋", 2),new AgeComparator()));
        System.out.println("最大值是:"+Collections.max(list,new AgeComparator()));
        System.out.println("最小值是:"+Collections.min(list,new AgeComparator()));
    }

}
class Person {
    String name;
    int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "{姓名:"+this.name+" 年龄:"+this.age+"}";
    }
}
class AgeComparator implements Comparator<Person> {

    @Override
    public int compare(Person o1, Person o2) {
        // TODO Auto-generated method stub
        return o1.age-o2.age;
    }
    
}

结果:
集合中的元素:[{姓名:铁蛋 年龄:2}, {姓名:狗娃 年龄:12}, {姓名:张三 年龄:22}]
找到的索引值是:0
最大值是:{姓名:张三 年龄:22}
最小值是:{姓名:铁蛋 年龄:2}

 Arrays:

1,二分查找,数组需要有序
  binarySearch(int[])
  binarySearch(double[])

2,数组排序
  sort(int[])
  sort(char[])
2, 将数组变成字符串。
  toString(int[])

没学过:
3, 复制数组。
  copyOf(boolean[] original, int newLength);
    original:源数组
    newLength:新数组的长度
4, 复制部分数组。
  copyOfRange(byte[] original, int from, int to)
    original:源数组
    from:开始拷贝的索引值
    to:结束的索引值
5, 比较两个数组元素是否一致。
  equals(int[],int[]);
6, 将数组变成集合。
  List asList(T[]);

package cn.itcast.util;

import java.util.Arrays;
import java.util.List;

/*
 
 1,二分查找,数组需要有序
    binarySearch(int[])
    binarySearch(double[])

2,数组排序
    sort(int[])
    sort(char[])
2,    将数组变成字符串。
     toString(int[])
     
没学过:    
3,    复制数组。
     copyOf(boolean[] original, int newLength);
         original:源数组
         newLength:新数组的长度
4,    复制部分数组。
    copyOfRange(byte[] original, int from, int to)
        original:源数组
        from:开始拷贝的索引值
        to:结束的索引值
5,    比较两个数组元素是否一致。
    equals(int[],int[]);
6,    将数组变成集合。
    List asList(T[]);
  
  */
public class Demo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Integer[] arr= {10,8,6,9};//如果是int类型的话,后面多余的元素会是0,但是如果是Integer的话,后面的元素就是null了
        Integer[] arr2=Arrays.copyOf(arr, 6);
        Integer[] arr3=Arrays.copyOfRange(arr, 1, 3);
        System.out.println("arr2拷贝后的数组元素是:"+Arrays.toString(arr2));
        System.out.println("arr3拷贝后的数组元素是:"+Arrays.toString(arr3));
        System.out.println("判断两个数组对应位置的元素是否完全一致:"+Arrays.equals(arr, arr2));
        
        List<Integer> list=Arrays.asList(arr);//把数组变集合
        list.toArray();   //把集合变数组
        System.out.println("集合的元素:"+list);
    }

}

结果:
arr2拷贝后的数组元素是:[10, 8, 6, 9, null, null]
arr3拷贝后的数组元素是:[8, 6]
判断两个数组对应位置的元素是否完全一致:false
集合的元素:[10, 8, 6, 9]

 eclipse:

alt+/ 内容补全键
Ctrl+1 快速修复键
alt+上下方向键 移动代码
tab 整体向右移动
shift+tab 整体向左移动
ctrl+/ 取消或者添加单行注释
ctrl+shift+f 代码格式化
ctrl+sgift+o 快速导包
ctrl+d 删除当前行代码
ctrl+shift+t 查看源代码 ctrl+鼠标点击或者F3

断点调试
step over 跳过本行代码
step into 进入方法内部
step return 结束方法,返回数据

正则表达式:正则表达式其实就是用于操作字符串的一个规则,正则表达式的规则使用了特殊的符号表示

需求:校验一个qq号

package cn.itcast.regex;
/*

  正则表达式:
  需求:校验一个qq号
      1.不能以0开头
      2.长度5~11
      3.只能由数字组成
  
  */
public class Demo1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String qq="45122257";
     //System.out.println(qq.matches("[1-9]\\d{4,10}")?"合法QQ":"非法QQ");
if (!qq.startsWith("0")) { if (qq.length()>=5&&qq.length()<=11) { try { Long.parseLong(qq); System.out.println("恭喜你,你得到了一个合法QQ"); } catch (Exception e) { System.out.println("非法QQ,QQ号只能由数字组成"); } } else { System.out.println("非法QQ,QQ号的长度只能是5~11位"); } } else { //以0开头 System.out.println("非法QQ,QQ号不能以0开头"); } } } 结果: 恭喜你,你得到了一个合法QQ

预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

注意:任何预定义字符没有加上数量词之前都只能匹配一个字符而已

数量词:

Greedy 数量词
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] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)

注意:

范围词里面不管内容有多长,没有数量词的配合都只能匹配一个而已。

package cn.itcast.regex;

import java.util.Arrays;

/*
 
 匹配    matches()
 
 切割    split()
 
         看有多少组就看有多少对括号,依次从左往右的每一对括号就为第几组
         ((A)(B(C)))
         第一组:((A)(B(C)))
         第二组:(A)
         第三组:(B(C))
         第四组:(C)
     \1    引用第一组所匹配到的内容
     
 替换
 
 查找
 */
public class Demo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //需求:编写一个正则表达式匹配一个手机号
        matchesPhone("13835026666");
        matchesTel("020-38325125");
        testSplit1();
        testSplit2();
    }
    public static void matchesPhone(String phone) {
        //String reg="1[34578]\\d{9}";
        System.out.println(phone.matches("1[34578]\\d{9}")?"合法手机号":"非法手机号");
    }
    //需求2:匹配固定电话
    public static void matchesTel(String tel) {
        System.out.println(tel.matches("0\\d{2,3}-[1-9]\\d{6,7}")?"合法固话":"非法固话");
    }
    //按照空格切割
    public static void testSplit1() {
        String str="明          天           放    假";
        String[] datas=str.split(" +");
        System.out.println("数组的元素:"+Arrays.toString(datas));
    }
    //根绝重叠词进行切割
    public static void testSplit2() {
        String str="大家家家明天天玩得得得得得得得得得得得开心";
        String[] datas=str.split("(.)\\1+");//如果正则的内容需要被复用,那么需要对正则的内容进行分组。分组的目的就是为了提高正则的复用性。组号不能指定,组号是从1开始
        System.out.println("数组的元素:"+Arrays.toString(datas));
    }
}

结果:
合法手机号
合法固话
数组的元素:[明, 天, 放, 假]
数组的元素:[大, 明, 玩, 开心]

猜你喜欢

转载自www.cnblogs.com/zhangwugai/p/10720513.html