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