第五周总结(2022.11.14~2022.11.19)

目录

Day1

1.常用类之Object (重点)

1.public int hashCode():获取对象的hash码值--->支持散列表(支持key-value键值对)

2.String toString():返回对象的字符串表示形式

3.public boolean equals(Object obj):指定其他对象与此对象是"相等"

4.Object的克隆方法

2.Scanner类提供一个判断功能

 1.java.util.Scanner:文本扫描器

3.String以及StringBuffer(字符串缓冲区) (重点)

2.面试题:

3.String类相关的获取功能

4.String类的转换功能

5.String的判断/替换/去除两端空格 (了解)相关功能

Day2

1.StringBuffer类(字符串缓冲区,线程安全的类)/StringBuilder

1.StringBuffer的追加和插入

2.StringBuufer的获取功能

 3.StringBuffer的替换功能:

4.StringBuffer的截取功能:

5.StringBuffer的特有功能:

6.StringBuffer和String之间相互转换

2.Integer类

1.Integer的构造方法:

2.类型转换

3.Character类

4.java.util.Date日期 (重点) 

5.Random:伪随机数生成器

6.System类

Day3

1.其他类之Calendar日历类

2.BigDecimal:小数精确计算

3.Jdk5里面其他新特性:

4.Colleciton集合

1.遍历

2.Collection的专有遍历方式:迭代器

5.List集合

Day4

1.List去重

2.Vector集合

3.LinkedList集合

4.Set集合:唯一/无序(不能保证迭代顺序)

1.hashset

2.TreeSet

Day5

1.Map(针对键有效,键必须唯一!)的基本功能

2.面试题

3.遍历Map集合的方式

4.HashMap,v>

5.TreeMap,v>

6.java.util.Collections:针对集合操作工具类


Day1

1.常用类之Object (重点)

1.public int hashCode():获取对象的hash码值--->支持散列表(支持key-value键值对)

 hashCode()(哈希算法 hash table)"理解为地址值",不是真实地址值,每一个对象的hash码值不同

2.String toString():返回对象的字符串表示形式

返回对象的字符串表示形式,结果应该是一个更容易让人读懂的信息表达式(建议所有的子类都覆盖这个方法)
                几乎Java所有类都会重写toString()方法
                          idea--->alt+ins---->toString

3.public boolean equals(Object obj):指定其他对象与此对象是"相等"

 ==和equals()方法区别?
      ==:比较两个基本类型,数据值是否相等
      ==:连接是两个引用类型,比较的是地址值是否相等
    而Object的equals方法,默认比较的是两个引用类型的地址值是否相等,建议子类需要重写这个equals(),重写之后比较的是
    两个对象的成员信息是否相同!(Java中所有类都会重写!)    ,重写equals方法,必须同时重写hashCode()方法

   重写equals:比较每一个对象的成员信息是否相同 如果一样,还要比较每一个成员信息 hashCode()哈希码值是否一样,如果都相同
    系统认为这个两个人是一样的!

4.Object的克隆方法

 protected Object clone() throws CloneNotSupportedException  创建对象并返回它的"副本"
               方法里面本身就会带有CloneNotSupportedException:克隆不支持的异常(当要对某个Object的类进行克隆
               如果这个类不能实现cloneable接口,那么就会出现这个异常)

2.Scanner类提供一个判断功能

 1.java.util.Scanner:文本扫描器

构造方法:
        public Scanner(InputStream source) 创建键盘录入对象
 
       创建一个文本扫描器
               Scanner 对象名 = new Scanner(System.in) ;
                --->System类---变量名
               public static final InputStream in
  成员方法:

  nextXXX():获取功能
   public int nextInt() :录入int类型
   public String nextLine() ;录入String类型

 判断功能:
     public boolean hasNextInt():判断录入的下一个数据是否为int类型,是,返回true,否则false
       public boolean hasNextLine():判断录入的下一个数据为一行内容
 
 
       键盘录入的时候
                   先录入int,在录入String ----nextLine() ,这块会出现被漏掉("回车符号")
                   解决方案:
                           1)在第一个录入int之后,重新创建一个新的键盘录入对象Scanner ,然后在使用nextLine()
                           2)在录入String---- String next()
 

3.String以及StringBuffer(字符串缓冲区) (重点)

String类: 这个类final修饰不能被继承
 字符串是不变; 它们的值在创建后不能被更改(字符串是一个常量,存储在常量池中)

构造方法:
      public String():空字符串    类似于 String s = "" ;
       public String(String original):构造一个字符串对象,里面指定一个字符串常量值
       public String(byte[] bytes) :使用平台默认字符集(idea默认utf-8)解析解码--->字节数组--->字符串
       String(byte[] bytes, int offset, int length) :将一部分字节数组构造成字符串
      public String(char[] value):将字符数组---构造成String
       public String(char[] value,int offseet,int len):将一部分字符串数组构造成字符串

2.面试题:

数组中没有length(),字符串有没有length(),集合中没有有length()?

 数组 没有length(),length属性  数组对象.length
 字符串有length(),
 集合没有,获取集合中 元素数 size()

String s = new String("hello")和String s = "hello" ; 有什么区别?分别创建了几个对象?

区别
      前者:在堆内存中开辟空间,然后字符串值常量---指向常量池, 两个对象
      后者:推荐的方式,直接常量赋值,直接在常量池中找,有就返回地址,没有,开辟常量空间!

3.String类相关的获取功能

1)public char charAt(int index) :获取指定索引处的字符
2)int length():获取字符串的长度
3)public String concat(String str)拼接功能-- 将一个字符串拼接到指定字符串的后面(末尾追加)
4)public String substring(int beginIndex):截取--->从指定位置开始截取,默认截取到末尾结束!
public String substring(int beginIndex, int endIndex) 截取--->从指定位置开始截取到指定位置结束

         包前不包后(包含第一个位置,不包含最后一个位置,只能取到endIndex-1处)
   5)public String[] split(String regex):拆分(分割) ,按照指定的分割符将字符串拆分成字符串数组
 6)public int indexOf(int ch) :返回此字符第一次在字符串中出现的索引值
       public int lastIndexOf(int ch):返回此字符最后一次在字符串中出现的索引值

4.String类的转换功能

1)char[] toCharArray() 将字符串转换成字符数组
2)byte[] getBytes() 平台默认字符集编码(String--->byte[])   和
         byte[] getBytes(String charset):指定的字符集进行编码
         String(byte[] bytes) :(bytes[]--->String  ) 平台默认字符集解码
         String(byte[] bytes,String charset) :(bytes[]--->String  ) 指定字符集解码

 3)public String toLowerCase():将字符串转换成小写
      public String toUpperCase():将字符串转换成大写

 4)万能方法:  可以将任何数据类型---->String
      public static String valueOf(int i/float....Object)

      编码和解码必须一致,否则乱码!

5.String的判断/替换/去除两端空格 (了解)相关功能

判断功能:
             boolean contains(String str):判断大串中是否包含指定子字符串
             boolean endsWith(String suffix):判断是否以指定结尾的字符串
             public boolean startsWith(String prefix):判断是否指定的字符串开头
             boolean equals(Object anObject)。:比较两个字符串内容是否相同
             boolean equalsIgnoreCase(String anotherString) :不区分大小写比较两个字符串是否相同
              public boolean isEmpty():判断字符串是否空 ,长度为0,true
              空串,和空对象? 一样吗?
                 不一样

            public String replace(char oldChar,char newChar)  :替换功能
           public String trim() :去除字符串两端空格 (一般io流中:  文件读写文件)

Day2

1.StringBuffer类(字符串缓冲区,线程安全的类)/StringBuilder

StringBuffer:线程安全的类,支持可变字符序列!

构造方法:
     public StringBuffer()  --->空参构造,初始容量16个字符
     public StringBuffer(int capacity)--->指定容量大小的字符串字符串缓冲区(很少用)
     public StringBuffer(String str)--->将指定的字符串内容构造到字符串缓冲区中,容量=当前str的长度+16

    int length()获取字符串缓冲区长度        

    int capacity()  :获取容量大小

1.StringBuffer的追加和插入

public StringBuffer append(任意Java类型):将指定的类型追加字符串缓冲区的序列中,返回自己本身

    public StringBuffer insert(int index,String str/可以任意Java类型) 在指定位置处插入指定的数据,返回字符串缓冲区本身

2.StringBuufer的获取功能

public char charAt(int index):获取字符串缓冲区中指定位置的字符,返回指定的字符
  StringBuffer的删除
     StringBuffer delete(int start, int end)  :删除从指定位置开始到指定位置结束(end-1)的字符,返回字符串缓冲区本身
    StringBuffer deleteCharAt(int index):删除指定位置处的字符,返回值字符串缓冲区本身

 3.StringBuffer的替换功能:

public StringBuffer replace(int start,int end,String str)
    将字符串缓冲区中的从指定位置开始到指定位置结束(end-1)的字符序列使用指定的字符串进行替换

4.StringBuffer的截取功能:

public String substring(int beginIndex)
public String substring(int beginIndex,int endIndex)

5.StringBuffer的特有功能:

public StringBuffer reverse()将字符串缓冲区中的字符序列进行反转

6.StringBuffer和String之间相互转换

在实际开发中,牵扯很多类型之间的相互转换
       将A类型-->B类型,因为想去使用B类型的功能
       但是又可能将B类型--->A类型,最终需求的结果是A类型

   String---->StringBuffer
  StringBuffer---->String

public class StringBufferDemo4 {
    public static void main(String[] args) {

        //String---->StringBuffer
        String s = "hello" ;
       /* String s = "hello" ;
        StringBuffer sb = s ;*/ //两个类型不匹配

        //方式1 :使用StringBuffer(String str)有参构造
        StringBuffer sb = new StringBuffer(s) ;
        System.out.println("sb:"+sb) ;

        System.out.println("-----------------------------------") ;

        //方式2:使用StringBuffer()空参构造,结合append(String str)追加
        StringBuffer sb2 = new StringBuffer() ;
        sb2.append(s) ;
        System.out.println("sb2:"+sb2);

        System.out.println("----------------------------------------------------");

        //StringBuffer---->String
        StringBuffer buffer = new StringBuffer("helloJavaEE") ;

        //方式1:StringBuffer--->public String toString()
        String str = buffer.toString();
        System.out.println(str) ;
        System.out.println("----------------------------------------------------") ;

        //方式2:String类----->构造方法public String(StringBuffer buffer)
        String str2 = new String(buffer) ;
        System.out.println(str2);

    }
}

2.Integer类

包装的int类型的值
 四类八种基本类型---------->包装类类型(引用类型)  :

                                jdk5以后的自动拆装箱
       byte               Byte
       short              Short
       int                  Integer
       long               Long
       float               Float
       double           Double
       char               Character
       boolean         Boolean
 
       基本类型         引用类型       String
 
       String         Integer          int

1.Integer的构造方法:

public Integer(int value) :将int类型数据包装为Integer类型
public Integer(String s)throws NumberFormatException :将字符串类型包装Integer类型,如果字符串非数字字符串,
  就会出现NumberFormatExceptio数字格式化异常
 
 jdk5以后的新特性:自动拆装箱      /静态导入(导入到方法的级别,前提方法必须为静态)/增强for循环/可变参数...
       基本类型会自动装箱为 引用类型:    int-->Integer
       引用类型会拆箱为 基本类型  :     Integer-->int

2.类型转换

int---->String 静态方法public static String toString(int i)
       String--->int  (使用居多)  public static int parseInt(String s)
                   前后端交互:前端提交的数据几乎String类型

public class IntegerDemo3 {
    public static void main(String[] args) {


        //int--->String
        int i = 100 ;
        String result = "" ;
        //方式1:字符串拼接符号+
        result += i;
        System.out.println(result) ;
        System.out.println("---------------------------------");
        //方式2:int--->Integer---->String
        //Integer(int i) ---->publict String toString()
        Integer ig = new Integer(i) ;
        String result2 = ig.toString();
        System.out.println(result2); //"100"
        System.out.println("---------------------------------");
        //方式3:Integer的静态方法public static String toString(int i)
        String result3 = Integer.toString(i);
        System.out.println(result3);

        System.out.println("--------------------------------------") ;
       // String---->int
        String s = "20" ; //数字字符串
       //方式1:String--->Integer --->public int intValue()
        Integer ig2 = new Integer(s) ;
        int value = ig2.intValue();
        System.out.println(value); //20
        System.out.println("-----------------------------------------") ;
        //方式2:直接转换public static int parseInt(String s) throws NumberFormatException
        int value2 = Integer.parseInt(s);
        System.out.println(value2); //20


        //parseXXX方法在任意的基本类型对应的类型都存在(万能方法)
        //String--Long-->long---->Long.parseLong(字符串)
        //String--Float-->float--->Float.parseFloat(小数字符串)

    }
}

3.Character类

构造方法
   Character(char value):包装一个char字符类型  char---->Character

成员方法
       public static boolean isDigit(char ch):判断是否为数字字符
       public static boolean isUpperCase(char ch):判断是否为大写字母字符
       public static boolean isLowerCase(char ch):判断是否为小写字母字符

4.java.util.Date日期 (重点) 

java.util.Date:特定的日期
       构造方法:
               public Date():系统时间的日期格式
       成员方法:
               public long getTime():获取指定Date对象的系统时间毫秒值

Date日期格式      ----->String日期文本             --->格式化操作
 
      String日期文本
           2022/11/15  2022年11月15日 ----------->Date (重点 )       ---->解析
       应用场景:用户注册 填写 出生日期  "1995-05-27"   String---->数据库Date格式
 
   格式化或者解析:使用DateFormat类,它是一个抽象类,不能实例化,用的抽象类的子类SimpleDateFormat
 
  Date日期个--->String格式化
       public final String format(Date date)
  构造方法
   SimpleDateFormat(String pattern)        pattern模式  :  y:代表年              yyyy 代表整个年份 :2022
                                                          M:代表月份                MM       11  07  06
                                                          d:月份中的日               dd      03 11 01
                                                         H:0-23(一天的小数数)       HH
                                                         m:小时的分钟数             mm
 
 
 String日期文本---->Date 解析
 public Date parse(String source)  throws ParseException :
       如果String日期文本 和转换器SimpleDateFormat(String pattern) 里面的模式不匹配就会造成解析异常!
           String s = "2008-5-12"
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ") ;//解析出问题了!
 

5.Random:伪随机数生成器

 public Random() 构造方法:创建新的随机数生成器
       public Random(long seed) 构造方法:创建新的随机数生成器(以指定的long 的类型计算随机数):每一次均分布局一样的 (不推荐)
       成员方法
          public int nextInt():获取的int类型的取值范围
          public int nextInt(int n):[0,n)随机数

6.System类

三个成员变量 ---静态常量
           static PrintStream err“标准”错误输出流。
           static InputStream in“标准”输入流。   (InputStream:字节输入流 --读数据)
           static PrintStream out  “标准”输出流。(PrintStream字节打印流--->
           OutputStream字节输出流---写/打印)
 
成员方法
   public static long currentTimeMillis():获取系统时间毫秒值(应用场景:计算程序的执行效率)
   public static void exit(int status):参数为0,正常终止jvm
   public static void gc():手动开启垃圾回收器
            开启垃圾回收器,会调用Object类的finalize()垃圾回收方法
   public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)  :复制数组
              参数1:原数组
              参数2:原数组中的某个位置
              参数3:目标数组
              参数4:目标数组中的某个位置
              参数5:从原数组的那个位置srcPos指定长度复制到目标数组中

Day3

1.其他类之Calendar日历类

java.util.Calendar :日历类--->是一个抽象类,不能new
  这个类里面的某些功能(静态功能)---一定完了这个类的子类的实例!
     创建日历实例--->public static Calendar getInstance()
 
   Calendar提供静态的字段(成员变量--->静态常量)
          public static final int DATE:月中的日期值
          public static final int MONTH:年中的月份值  (0-11),获取之后+1
          public static final int YEAR:年份值

 Calendar提供成员方法:
          public int get(int field):获取日历的字段值
                      参数就是需要通过Calendar访问的静态常量的那些字段

          public abstract void add(int field,int amount)    给日历字段设置偏移量,添加或者减去 amount值
 
           public final void set(int year,int month,int date) 设置日历字段

2.BigDecimal:小数精确计算

构造方法
    BigDecimal(String value):参数 "小数字符串值"
    BigDecimal(int value):整数
    BigDecimal(double value):浮动类型
 
 
 成员方法:
   public BigDecimal add(BigDecimal augend):加
    public BigDecimal subtract(BigDecimal subtrahend)减
    public BigDecimal multiply(BigDecimal multiplicand)乘
    public BigDecimal divide(BigDecimal divisor):除
    public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
              参数1:除数值
               参数2:scale保留小数位数
               参数3:roundingMode舍入的模式  BigDecimal提供静态常量

3.Jdk5里面其他新特性:

 1)静态导入---->导入到方法的级别
          import static 包名.类名.方法名;
      前提使用静态导入,这个类的方法必须为静态
 
       在使用静态导入的时候,导入jdk提供的一些工具类里面静态方法的时候,我们定义的方法不能和它方法名冲突
       如果冲突了,静态导入是不识别,这个时候必须导入全限定名称 :包名.类名.方法名(xxx)
 
      2)可变参数,当一个方法形式参数不知道多少个,这个时候可以使用可变参数(类似一个数组)
           public  返回值类型 方法名(数据类型... 参数名)

4.Colleciton集合

Colleciton:没有jdk提供直接实现,通过具体的子接口List/Set的子实现类实现
 
  创建集合的时候<E> :里面存储的引用类型的元素
       模拟数组,创建集合的时候就明确了集合中存储的数据类型,否则导致程序不安全!
 
 常用基本功能:
      添加
          boolean add(E e):添加元素 E--->Object任意Java元素
       删除
            删除集合中的元素boolean remove(Object o)
           暴力删除(将集合全部清空)void clear()
 
      判断
               boolean isEmpty():判断集合是否为空
               boolean contains(Object o):判断集合是否包含指定的元素

1.遍历

package com.qf.collection_04;
import java.util.ArrayList;
import java.util.Collection;

/**
 * @author 高圆圆
 * @date 2022/11/16 11:47
 * 遍历
 *      1)将集合转换对象数组
 *              Object[] toArray()  不推荐,还是变成数组!
 *
 *
 */
//jdk提供@SuppressWarnings("all")  解决警告问题 (实际开发中,项目打包--安装-->部署--->上线)
//@SuppressWarnings("all") //压制警告
public class CollectionDemo2 {
    public static void main(String[] args) {
        //创建一个集合--->存储String
        Collection<String>  c  = new ArrayList<>() ;
        //添加字符串数据
        c.add("hello") ;
        c.add("world") ;
        c.add("javaEE") ;
        c.add("Mysql") ;
        System.out.println(c);

        //转换成数组Object[] toArray()
        Object[] objects = c.toArray();
        for(int x = 0 ; x < objects.length ;x++){
            //objects[x]数组中---    相当于每一个元素 Object 对象名 = new String();//多态 向上转型
           // System.out.println(objects[x]);
            //遍历这些字符串并且同时它的长度
           // System.out.println(objects[x]+"---"+objects[x].length()); //Object类型没有length()
            //向下转型
            String s = (String) objects[x];
            System.out.println(s+"---"+s.length());

        }
    }
}

2.Collection的专有遍历方式:迭代器

Iterator<E> iterator()
           Iterator接口提供了功能:Object next() :获取下一个可以遍历的元素
           boolean hasNext():判断如果迭代器里面有元素,则返回true,然后在获取!
 
          需求:使用Collection存储String类型,并去使用迭代器将元素一一遍历,打印控制台
 
  1)使用Collection集合存储5个学生,使用迭代器的这种方式进行遍历!
   2)使用Collection集合存储String类型,如果这个字符串是"world",那么添加一个新的字符串数据"javaEE",
   然后遍历集合中的数据

5.List集合

List集合的特点
       允许集合元素重复(实际应用,List集合如何去重?),而且有序集合(存储和取出一致)
 
   List集合的特有功能:
              void add(int index, E element):在指定位置插入新的元素
              E get(int index):获取指定位置处的元素
              E set(int index,E element):在指定位置处替换(修改)指定的元素
              ListIterator<E> listIterator():List集合的专有遍历-->列表迭代器

Day4

1.List去重

package com.qf.test_01;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 高圆圆
 * @date 2022/11/17 9:41
 * 使用List集合存储重复String类型的数据,保证集合的元素唯一!(去重)
 */
public class ListTest {
    public static void main(String[] args) {

        //1)创建一个集合
        List<String> list = new ArrayList<>() ;

        //2)添加重复的String
        list.add("hello") ;
        list.add("world") ;
        list.add("hello") ;
        list.add("java") ;
        list.add("java") ;
        list.add("android") ;
        list.add("world") ;
        list.add("android") ;
        list.add("JavaEE") ;
        list.add("hello") ;
        list.add("android") ;

        //3)新建一个集合
        List<String> newList = new ArrayList<>() ;
        //4)遍历以前的集合
        for(String s:list){
            //一一获取以前集合中所有元素
            //使用新集合判断里面如果不包含这个元素,不重复,添加到新集合中
            if(!newList.contains(s)){
                newList.add(s) ;
            }
        }

        //5)遍历新集合
        for(String s:newList){
            System.out.println(s);
        }
    }
}
/**
 *
 * 集合的contains方法底层源码:
 * public boolean contains(Object o) {  //Object o = new String("xx") ;//多态
 *         return indexOf(o) >= 0;
 *     }
 *
 *
 *     indexOf()----->依赖于Object的equals()方法
 *     而String类型 人家已经重写了Obejct的equals()方法
 *     比较的字符串内容是否相同
 */

2.Vector集合

 Vector集合:线程安全的类(底层结构:数组,查询快,增删慢)
  特有功能:
      public void addElement(E obj)将指定的元素添加Vector集合中(默认追加)
      public Enumeration<E> elements():获取枚举组件接口----->类似于Collection集合的Iterator iterator()
               Enumeration接口
 
                          boolean hasMoreElements() 判断是否有更多的元素 ----->类似于Iterator里面的boolean hasNext()
                          E  nextElement() :获取下一个元素              ----->类似于Iterator里面的E next()
 
      public E elementAt(int index):通过索引值获取元素   ---->类似List集合的E get(int index)
      int size():获取集合元素数

3.LinkedList集合

LinkedList:
       线程不安全,不同步,执行效率高
      底层数据结构: 线程结构之链表,查询慢,增删快!
 
     特有功能:
          添加元素
              public void addFirst(E e) 将指定的元素添加到链表的开头
              public void addLast(E e) 将指定的元素添加到链表的末尾
              public E getFirst():获取第一个元素
              public E getLast():获取最后一个元素
              public E removeFirst():删除第一个并返回第一个元素
              public E removeLast():删除最后一个元素并返回

4.Set集合:唯一/无序(不能保证迭代顺序)

1.hashset

Set集合:元素唯一的 默认情况使用HashSet进行实例(创建对象)
 
  HashSet的底层依赖于HashMap(哈希表结构),元素唯一,迭代顺序无法保证的!
 
 HashSet集合保证元素唯一---底层依赖HashMap的put方法---->依赖于hashCode()/equals(),
 而现在存储String类型,重写了equals和hashCode(),保证元素唯一!

2.TreeSet

TreeSet集合--->Set集合的的实现类,它应该满足保证元素唯一
 
  底层基于TreeMap<K,V>,它是一个红黑树(red-black-tree)
  有自然排序/比较器排序
 
  构造方法:
       public TreeSet():创建一个空的树,元素是按照自然排序顺序,里面的元素必须要实现Comparable接口
 
  现在使用TreeSet存储Integer类型的元素
   结论:
           要实现自然排序,那么使用TreeSet的无参构造方法,而且存的类型一定要实现Comparable接口,重写
          compareTo(T t)方法,完成比较

TreeSet自然排序

TreeSet<Stdudent>,使用TreeSet存储自定义类型
  存储的Student类型实现Comparable,完成自然排序!
                   排序条件(主要条件)
                          按照学生的年龄从小到大排序

                         自己的分析次要条件:


  使用TreeSet<Student>,按照自然排序排序
               主要条件:
                      按需学生的姓名的长度从小到大比较
               次要条件:长度相同,比较姓名内容是否相同

public class TreeSetDemo {
    public static void main(String[] args) {
        //创建TreeSet集合
        TreeSet<Student> ts = new TreeSet<Student>() ;//无参构造方法,自然排序

        //创建一堆学生
        Student s1 = new Student("gaoyuanyuan",32) ;
        Student s2 = new Student("gaoyuayuan",32) ;
        Student s3 = new Student("liushishi",36) ;
        Student s4 = new Student("wangbaoqi",36) ;
        Student s5 = new Student("wenzhang",28) ;
        Student s6 = new Student("wenzhang",28) ;
        Student s7 = new Student("mabaoguo",65) ;
        Student s8 = new Student("mabaoguo",56) ;
        Student s9 = new Student("gaoyuanyuan",35) ;
        Student s10 = new Student("zhangwen",35) ;

        //添加
        //Student类没有实现自然排序接口
        //java.lang.ClassCastException: com.qf.treeset_05.Student cannot be cast to java.lang.Comparable
        ts.add(s1) ;
        ts.add(s2) ;
        ts.add(s3) ;
        ts.add(s4) ;
        ts.add(s5) ;
        ts.add(s6) ;
        ts.add(s7) ;
        ts.add(s8) ;
        ts.add(s9);
        ts.add(s10);

        //遍历
        for(Student s:ts){
            System.out.println(s.getName()+"---"+s.getAge());
        }
    }
}

TreeSet比较器排序

存储的Student类型实现Comparable,完成比较器排序
 *                   排序条件(主要条件)
 *                           按照学生的年龄从小到大排序
 *   比较强排序:
 *          TreeSet有参构造方法
 *          public TreeSet(Comparator<? super E> comparator) 按照比较强排序

public class TreeSetDemo {
    public static void main(String[] args) {

        //创建一个TreeSet集合
        //public TreeSet(Comparator<? super E> comparator) 按照比较强排序
        //比较器排序方式1:自定义一个类实现Comparator接口
       // MyComparator my = new MyComparator() ;  //具体类对象
        //Comparator<Student> my = new MyComparator() ;  //接口多态
       // TreeSet<Student> ts = new TreeSet<>(my) ;

        //方式2:public TreeSet(Comparator<? super E> comparator) 按照比较强排序,使用接口匿名内部类

        TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //按照学生的年龄从小到大排序(主要条件)
                //s1---->this
                //s2---->s
                int num = s1.getAge() - s2.getAge() ;
                //次要条件:年龄相同,比较姓名是否一致
                int num2 = (num==0)?(s1.getName().compareTo(s2.getName())):num ;
                return num2;
            }
        }) ;
        //创建学生对象
        Student s1 = new Student("wenzhang",25) ;
        Student s2 = new Student("wenzhang",25) ;
        Student s3 = new Student("gaoyuanyuan",25) ;
        Student s4 = new Student("luozhixiang",32) ;
        Student s5 = new Student("gaoyuanyuan",22) ;
        Student s6 = new Student("mayili",22) ;
        //添加
        ts.add(s1) ;
        ts.add(s2) ;
        ts.add(s3) ;
        ts.add(s4) ;
        ts.add(s5) ;
        ts.add(s6) ;
        for(Student s:ts){
            System.out.println(s.getName()+"---"+s.getAge());
        }
    }
}

Day5

1.Map(针对键有效,键必须唯一!)的基本功能

添加:
           V put(K key, V value):添加键值对元素,返回值什么意思?
                       map针对键有效,键如果唯一的,返回是null;
                       如果重复,将后面的键对应的值把前面的值覆盖了,返回第一次键对应的值
      删除:
          V remove(Object key):删除键,返回键对应的值
          void clear():暴力删除,将map清空掉
      判断:
           boolean containsKey(Object key):判断Map集合是否包含指定的键,包含返回true,否则false
           boolean containsValue(Object value):判断Map集合是否包含指定的值,包含则返回true,否则false
           boolean isEmpty() :判断集合是否为空

2.面试题

 Map和Collection的区别 ?
         Collection<E>:单例集合,只能存储一种引用类型数据 遍历方式和Map不同;
         Collection集合的应用范围大:
                       ArrayList
                      Vector
                       LinkedList
        它里面的部分集合和Map有关联(HashSet--->依赖HashMap   / TreeSet---->依赖于TreeMap)
       Map<K,V>,双列集合---->可以存储键值对("夫妻对")
         遍历方式:通用方式 获取所有的键,通过键找值!
          应用范围:
              HashMap---->存储 和 获取 (默认使用)
              TreeMap---->存储---获取(按照排序规则排序)
              Map---->称为 "实体"
                      Map<Integer,Product>

3.遍历Map集合的方式


 1)获取所有的键的集合 Set<K> keySet()    (通用的遍历方式)      --->"获取所有的丈夫",丈夫自己妻子
           结合    V get(Object key):通过键找值
         2)Set<Map.Entry<K,V>> entrySet() :获取Map结合的键值对对象    ---->"获取所有结婚",找丈夫,找妻子

 HashMap---->put方法---->依赖于hashCode()+equals()方法 能够保证键唯一!
 存储String,String类型重写了hashCode()+equals()方法,比较键的字符串内容是否相同!

4.HashMap<K,V>

   存储键值对元素,保证K唯一,根据的类型有关系
  如果K是自定义类型,
  HashMap<Student,String> ,考虑保证学生对象唯一!
       Key:Student类型
       Value:String类型
 
      要针对键有效,需要键的类型,需要重写equals()和hashCode()
      equals():比较内容是否相同, hashCode():比较每一个成员信息的哈希码值是否一样

5.TreeMap<K,V>

针对键有效,排序(自然排序/比较器排序)
 构造方法:
       public TreeMap():自然排序
      public TreeMap(Comparator<? super K> comparator):比较器排序
 
   如果键是自定义类型,键必须唯一,而且需要有排序规则!
 
  TreeSet<Emplyee,String> 来按照学生的年龄从小到大排序(主要条件)

6.java.util.Collections:针对集合操作工具类

常用的方法
       二分搜索法,在指定List集合中查询指定元素第一次出现索引值 (集合的元素有序)
 public static <T> int binarySearch(List<? extends Comparable<? super T>> list,T key)
 public static <T> T max(Collection<? extends T> coll):针对Collection集合获取最大值(自然顺序比较获取最大值)
  public static <T> T min(Collection<? extends T> coll):针对Collection集合获取最小值(自然顺序比较获取最小值)
 public static void reverse(List<?> list):将List集合的元素反转
 public static void shuffle(List<?> list):针对List集合随机置换
 public static <T extends Comparable<? super T>> void sort(List<T> list):针对List集合按照自然顺序排序
 public static <T extends Comparable<? super T>> void sort(List<T> list,Comparator<T> com):
  针对List集合按照比较器进行排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值