天天看點

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 則添加失敗