天天看点

Java时间类(SimpleDateFormatTest)

1.SimpleDateFormatTest

1.1概念

日期格式化:用于Date对象和指定格式字符串之间的转换
java.test.SimpleDateFormatTest
把对象转换为指定格式的字符串
解析:把指定格式的字符串,获取一个对象(Date)
      

1.2字符串

日期和字符串相互转换,必须指定字符串的格式: 如xxxx-xx-xx
需使用SimpleDateFormat当中定义好的一些字母来表示时间参数
年   y
月   M
日   d
星期    E
时   H
分   m
秒   s

      

1.3方法

//==========================构造方法==============================================
1.SimpleDateFormat(String pattern) 使用给定模式 SimpleDateFormat并使用默认的 FORMAT语言环境的默认日期格式符号。
    
    
//===========================格式化方法===========================================
1.String format(Date date): 把参数date对象转化为指定格式的字符串
    
//===========================解析方法============================================
1.Date parse(String source) throws ParseExcepton: 把字符串参数转化为Daet对象, 必须和指定格式相同 
      

练习

public class SimpleDateFormatTest {
  public static void main(String[] args) throws ParseException {
    Date date = new Date();
    
    //格式:xxxx-xx-xx xx:xx:xx
    //创建模式:使用预定以的字符表示
    String strDate = "yyyy-MM-dd HH:mm:ss";
    //创建SimpleDateFormat对象关联模式
    SimpleDateFormat sim = new SimpleDateFormat(strDate);
    //使用格式化方法
    String str = sim.format(date);//2021-09-02 10:49:59
    System.out.println(str);
    
    String strDate2 = "2020-09-02 10:49:59";
    Date date2 = sim.parse(strDate2);//Wed Sep 02 10:49:59 CST 2020
    System.out.println(date2);
  }
}
      

注意

1.创建SimpleDateFormat: 必须关联一个字符串模式; 其中用预定义的字母来表示时间参数
2.调用SimpleDateFormat的parse必须在方法上声明添加throws ParseException
      

2.Calendar

2.1概念

日历类:用于弥补java.util.Date类而创建的用于实现国际化的描述的时间类
java.util.Date时完全按照美国人对时间描述而创建的类: 与地球上其他民族描述的时间不一样
设计:为例满足国际化,把相关时间的参数整合到一起
      

2.2方法

public class CalendarTest {
  public static void main(String[] args) {
    
    //Calendar类时抽象的,通过静态方法getInstance()获取子类对象
    
    
    Calendar c1 = Calendar.getInstance();//多态
    
    //java.util.GregorianCalendar[time=1630552380622,areFieldsSet=true,areAllFieldsSet=true,lenient=true,
//    zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,
//        transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=8,
//        WEEK_OF_YEAR=36,WEEK_OF_MONTH=1,DAY_OF_MONTH=2,DAY_OF_YEAR=245,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,
//        AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=13,SECOND=0,MILLISECOND=622,ZONE_OFFSET=28800000,DST_OFFSET=0]
    System.out.println(c1);
    
    
    
    //方法:
    //1.Calendar.getInstance()
//    1.abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。  
//      boolean after(Object when) 返回 Calendar是否 Calendar指定时间之后的时间 Object 。  
//      boolean before(Object when) 返回此 Calendar是否 Calendar指定的时间之前指定的时间 Object 。  

    
    
    //3.设置和获取时间参数,通过静态变量来表示时间参数
//    int get(int field) 返回给定日历字段的值 
//    void set(int field, int value) 将给定的日历字段设置为给定的值 
    
    print(c1);
    c1.set(Calendar.YEAR, 2001);
    print(c1);
    
    //设置年月日
    //void set(int year, int month, int date) 设置日历字段中的值 YEAR , MONTH和 DAY_OF_MONTH 。  
    //void set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段中的值 YEAR , MONTH , DAY_OF_MONTH , HOUR_OF_DAY和 MINUTE 。 
    c1.set(2000, 11-1,11,10,9,8);
    print(c1);
    
    //5.设置指定添加值
    //abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段 
    c1.add(Calendar.YEAR, 2);
    print(c1);
    
    //6.Date getTime() 返回一个 Date表示此物体 Calendar的时间值(毫秒从偏移 Epoch “)。  
    //void setTime(Date date) 使用给定的 Date设置此日历的时间。 
  
    //7.日历和毫秒值的转换
//    void setTimeInMillis(long millis) 从给定的长值设置此日历的当前时间。 
//    abstract int getMinimum(int field) 返回此 Calendar实例的给定日历字段的 Calendar 。 
    
    
  }
  
  
  
  public static void print(Calendar c) {
    //获取时间参数
    int year = c.get(Calendar.YEAR);
    int mon = c.get(Calendar.MONTH) + 1;
    int day = c.get(Calendar.DAY_OF_MONTH);
    
    String str = year + "年" + mon + "月" + day + "日";
    System.out.println(str);
  }
}


abstract class MyDate{
  void myDate() {
    
  }
  
  static MyDate getDate() {
    return new MyCalendar();
  }
  
}
class MyCalendar extends MyDate{
  
}
      

3.集合

3.1概念

和数组相同, 都是容器:
装任意个数个引用数据类型数据的容器
      
  • 集合和数组的区别
数组 : 装指定个数个相同类型的数据的容器
集合 : 装任意个数个引用数据类型数据的容器
相同之处: 都是容器, 用于装多个数据
不同之处: (1)数组创建后长度不能变
        集合元素是可变的
      (2)数组中的元素类型必须一致
        集合当中的元素类型可以不同
      (3)数据的元素类型可以是任意的 : 基本数据类型 / 引用数据类型
        集合的元素类型只能是引用数据类型
      (4)数组中的元素不赋值, 有默认值
        集合的元素没有默认值
      
  • 集合框架
由多个接口和实现类组成
集合框架结构:
  Collection: 接口 单列集合的顶层接口
      List: 子接口 有序列表
            ArrayList: 实现类: 底层是长度可变的数组的实现. 查询和更改效率高, 增和删效率低
            Vector: 实现类: 方法和底层和ArrayList相同(线程安全的,相比于ArrayList效率低)
       LinkedList: 实现类: 底层是双向链表, 查询和更改慢, 插入和删除高
         Set接口: 子接口 : 不重复列表
             HashSet: 实现类: 无序,不重复列表
             TreeSet: 实现类: 有序,不重复列表
        
     Map: 接口 双列集合的顶层接口--.每次增删改查,需要有键值对(键不能重复)
         HashMap: 实现类: 键和值都可以为null(线程不安全的)
         HashTable: 实现类: 键和值都不能为null(线程安全的)
         
         
      

3.2Collection

注意:Collection是单列集合的顶层接口: 其方法是所有子接口的共同方法
      
public class CollectionTest {

  public static void main(String[] args) {
    
//    //添加
//    boolean add(E e) 确保此集合包含指定的元素(可选操作)。  
//    boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合(可选操作)。  
    Collection coll = new ArrayList();
    coll.add(123);
    coll.add("312");
    coll.add(new Date());
    Collection coll1 = new ArrayList();
    coll1.add(123);
    coll1.add("312");
    //判断
//    boolean contains(Object o) 如果此集合包含指定的元素,则返回 true 。  
//    boolean containsAll(Collection<?> c) 如果此集合包含指定 集合中的所有元素,则返回true。  
//    boolean isEmpty() 如果此集合不包含元素,则返回 true 。  
    
    System.out.println(coll.containsAll(coll1));
    
//    //删除
//    boolean remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作)。  
//    boolean removeAll(Collection<?> c) 删除指定集合中包含的所有此集合的元素(可选操作)。  
//    void clear() 从此集合中删除所有元素(可选操作)。  
//    coll.remove(123);//集合中有多个相同元素,只删除第一个
//    coll.removeAll(coll1);//删除
//    //获取
//    int size() 返回此集合中的元素数。    
//    Iterator<E> iterator() 返回此集合中的元素的迭代器。  
//      方法:hasNext() / next()
    //一次性的, 第二次遍历需要重新创建
    //Object[] toArray() 返回一个包含此集合中所有元素的数组。  
      
    
    
    
    //集合重点: 1.集合特点 2.遍历方式
    //1.遍历方式
    for(Object obj : coll) {
      System.out.println(obj);
    }
    System.out.println("==================");
    //2.遍历方式:转化为数组来进行遍历
    Object[] arr = coll.toArray();
    for(int i = 0; i < arr.length; i++) {
      System.out.println(arr[i]);
    }
    System.out.println("====================");
    //3.遍历方式:使用迭代器
    Iterator iterator = coll.iterator();
    while(iterator.hasNext()) {
      Object obj = iterator.next();//获取元素
      System.out.println(obj);
    }
    
    
    
    
    
  }
}
      

3.3 ArrayList

  • 概念
底层是可变长度数组的实现:
单列集合, 元素有下标, 查询和修改效率高
      
  • 特有方法
public class ArrayListTest {
  public static void main(String[] args) {
    //ArrayList特有方法(比Collection多的)
    //void add(int index, E element) 在此列表中的指定位置插入指定的元素。  
    //E get(int index) 返回此列表中指定位置的元素。
    //int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。  
    //int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。  
    //E remove(int index) 删除该列表中指定位置的元素。  
    //E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。  
    
    ArrayList list = new ArrayList();
    
    list.add(123);
    list.add(321);
    list.add("123");
    list.add(new Date());
    
    list.add(1);//在末尾添加元素
    list.add(1,"333");//在指定位置添加
    int indexOf = list.indexOf(123);
    System.out.println(indexOf);
    
    System.out.println(list.remove(0));
    
    //遍历ArrayList的4种方法
    //1.foreach循环
    //2.通过toArray方法获取数组,遍历数组
    //3.通过迭代器
    //4.通过下标获取元素
    for(int i = 0; i < list.size(); i++) {
      System.out.println(list.get(i));
    }
    
    
  }
}
      

3.4 HashSet

Set接口实现类: 不重复
    HashSet: 不重复, 无序, 线程不安全, 可以有null值
      
  • 方法
全继承于Collection的方法, 无特有方法
      
  • HashSet元素不重复的原理
public class HashSetTest {

  public static void main(String[] args) {
    
    HashSet set = new HashSet();
    
    
    set.add(new Teacher("张三",'男',1000));
    set.add(new Teacher("张三",'男',1010));
    set.add(new Teacher("张四",'女',1000));
    set.add(new Teacher("张四",'男',1050));
    set.add(new Teacher("张五",'男',1100));
    set.add(new Teacher("张六",'男',990));
    set.add(new Teacher("张七",'男',1000));
    set.add(new Teacher("张三",'女',1010));
    
    
    //遍历
    Iterator iterator = set.iterator();
    while(iterator.hasNext()) {
      Object obj = iterator.next();
      System.out.println(obj);
    }
    

  }

}


class Teacher{
  private String name;
  private char sex;
  private int salary;
  
  
  public Teacher() {
    
  }
  public Teacher(String name, char sex, int salary) {
    this.name = name;
    this.sex = sex;
    this.salary = salary;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public char getSex() {
    return sex;
  }
  public void setSex(char sex) {
    this.sex = sex;
  }
  public int getSalary() {
    return salary;
  }
  public void setSalary(int salary) {
    this.salary = salary;
  }
  
  
  
  
  
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = salary % 5;
    return result;
  }
  @Override
  public boolean equals(Object obj) {
    if(obj instanceof Teacher) {
      Teacher teacher = (Teacher)obj;
      int n = Math.abs((this.salary - teacher.salary));
      if(this.name.equals(teacher.name) && this.sex == teacher.sex && n < 100 ) {
        return true;
      }else {
        return false;
      }
    }
    return false;
  }
  @Override
  public String toString() {
    return "Teacher [name=" + name + ", sex=" + sex + ", salary=" + salary + "]";
  }
  
  
  
  
  
  
  
  
}
      
  • 原理分析
调用set.add(obj)时,怎么保证元素唯一
    1.先调用obj的hashCode方法,获取其hashCode值
    2.如果此hashCode值 与set中其他所有元素比较是唯一的  直接添加成功
    3.如果此hashCode值 与set中其他所有元素中的n个元素 hashCode值相同
    4.调用obj1的equals方法与这n个相同hashCode值的元素 分别做比较
    5.只用当调用的n次equals方法都返回false 才允许添加  只要有一个返回true 则添加失败