java常用對象

boolean b=Pattern.matches("(86)*0*1\\d{10}",mobile);//大陸手機號碼的匹配

日期類
Date date =new Date();//構造當前的時間
calendar=Calendar.getInstance();//通過工廠方法獲取實例
calendar.set(year, month, date);//設置年月(0-11)日 時分秒位當前時間
calendar.set(year, month, date, hourOfDay, minute, second);//設置年月日時分秒
DateFormat df=new SimpleDateFormat("yyyy年MM月dd日 HH點mm分ss秒");
String s=df.format(date);
Date date=df.parse(date_str);

在多線程的情況下使用StringBuffer 保證數據的同步。在單線程情況下兩個都可以用StringBuilder會快一些。

集合:長度可以自動的擴展,存儲的類型可以不限定(這點不太安全)
JAVA的集合框架中有兩個基本的集合接口,一個是Collection,還一個是Map
Collection接口有比較實用的實現方式:有序列表list 無序列表Set 和隊列Queue
List:有序列表,存儲空間是有下標的,可以按位置存取
Set:散列集合,存儲空間沒有下標
前兩者都是Collection的子接口
Map:鍵值對,根據鍵值K取V,鍵值K是唯一的

優勢:增強for循環能不需要定義下標i,簡潔方便,無序的集合頁可以讀取
由於增強循環比較簡潔,不需要按位置讀取,所以不知道當前元素的位置

JAVA的集合是可以存儲多個數據類型的,Collection coll=new ArrayList();在coll中可以存儲除了基本數據類型(裝箱爲包裝類存儲)的一切對象。就是說可以存儲Integer String Employee所以在讀取的時候是無法知道其準確的類型是什麼的?
需要強制類型轉換,除非事先知道類型否則會出現類型轉換異常,這樣程序的安全性就降低。
使用泛型,就是在編譯階段限定其存儲的類型是什麼,這樣就不能隨便存儲其他類型了,讀取時也不需要強制類型轉換了。

集合中使用泛型來指定參數類型:
1.可以讓代碼更安全健壯
2.不需使用強制類型轉換

集合的迭代器——操作元素
Iterator迭代器有三個操作方法:
hasNext():如果仍有元素可以迭代,則返回true.
next():返回迭代的下一個元素
remove():從迭代器指向的collection中移除迭代器返回的最後一個元素
注意在讀取前一定要進行判斷是否可以迭代(hasNext()),然後進行讀取下一個(next())
集合接口方法獲取出迭代器:注意import相關接口
Iterator iterator=arr.iterator();

集合的使用起來容量可以擴展,而且有很豐富的API所以在使用時,比數組多得多,之後的學習和工作中都會使用集合進行存儲數據:
1.  集合長度自動擴展
2. 集合可以使用泛型指定存儲類型,必須是引用類型,不能存儲基本類型,如:int
3.集合的api比較豐富,比如add,remove,contains方法判斷包含元素
4.集合接口有豐富的數據結構實現
PS:包含 比較,刪除等需要判斷是否同一個對象,都是比較對象的地址,按照值比較需要重寫equals和hashCode 方法

有序列表List
集合中最常見的一個集合是有序列表list:
List接口是有序的列表,與父類 Collection比包含了Collection所有的方法,又擴展了能精確地控制每個位置上的元素的方法:
如:
list.get(i);讀取第i位置的元素;
add(int index, E element)指定位置添加元素
remove(int index)移除指定位置的元素
set(int index, E element)
subList(int fromIndex, int toIndex)截取子列表
list.size();
list.add();
list.remove();
list.get(i);

ArrayList:數組實現方式,查詢速度快,按位增刪速度慢
LinkedList:鏈表的實現方式,按位增刪速度快,查詢速度慢
Vector:多線程時線程同步的,保證數據安全

無序列表
Set 是一個散列的集合,數據會按照散列值存儲的,兩個hello的散列值相同,會存儲在同一個地址中,所以看到的就是隻有一個hello在集合中了
Set的特徵是:
不會出現重複的元素(按照equals 和hashCode 的規則比較是否重複)
Set屬於Collection的子接口,擁有Collection的所有的方法
Set 是散列存儲沒有位置編號,沒有按照編號進行操作的方法

Set接口也有不同的實現方式:
HashSet:散列集合裏存儲的對象必須正確重寫hashCode和equals方法
TreeSet:樹集集合通過二叉樹算法保證無重複元素,並對元素進行排序(自然順序)
要求要存儲的類要實現Comparable接口,重寫compareTo方法(後續會將排序的接口)

Map映射容器
Map(映射)是一個可以根據鍵值進行存儲的,它的一個 Key 對應的是一個存儲的位置,所以Key值是唯一的,根據Key值可以獲取到對應的存儲的Value
這種存儲的集合我們稱爲 “鍵-值” Map
1. 它不是集合Collection的子類;
2. 它的鍵值是唯一的,根據鍵值可以取出值
3. 根據值無法直接取出Key
//存儲操作:
map.put("key1","value1");
map.put("key2","value1");//value值是可以重複的
//讀取操作
map.get("key1");
是否包含K map.containsKey(Object key)
是否包含V map.containsValue(Object value)
取出所有的K值 Set<K> map.keySet() 返回的是K的Set
取出所有的Value Collection<V> map.values()  返回的是K的是Collection

Map的幾種實現方式
同樣的對於Map接口是有多種實現方式的
HashMap 按照散列存儲,這樣的存取較快,線程不安全的,允許存放null鍵,null值
Hashtable 線程安全,速度慢,不允許存放null鍵,null值
TreeMap 鍵值使用二叉樹來保證唯一的對鍵值有排序功能

Map和Set還有List一樣如果涉及到包含,比較等操作,自定義的對象需要正確重寫equals 和hashCode方法才能滿足我們想要的結果
Map的鍵值可以用Employee,Map<Employee,Integer> Employee需正確實現equals和HashCode
Set中存儲Employee Employee需正確實現equals和HashCode
List中包含操作contains 等都是需要實現實現equals和HashCode

Collections
常用的方法:
sort(List<T> list):將集合List的進行按照升序進行排序
binarySearch(List<? extends Comparable<? super T>> list, T key)二分查找Lisi中的元素
copy(List<? super T> dest, List<? extends T> src):將src 中的數據複製到dest中
max(Collection<? extends T> coll):獲取集合中最大的元素
min(Collection<? extends T> coll):獲取集合中最小的元素
reverse(List<?> list)將List進行反轉


使用Collections.sort();排序能夠排序Integer String等類型,卻無法對我們自己定義的員工類進行排序????
public class Car implements Comparable<Car>{
    public int compareTo(Employee o) {
       return (this.getWeight().compareTo(o.getWeight()));
    }
}

排序的方法有兩種:
sort(List<T> list) 根據元素的自然順序 對指定列表按升序進行排序。
sort(List<T> list, Comparator<? super T> c) 根據指定比較器產生的順序對指定列表進行排序
兩種啥區別的呢:
第一種自身支持排序功能,實現了排序Comparable接口的可以直接按照默認規則排序
第二種按照比較規則排序,有沒有實現接口無所謂,因爲有比較器
比如,員工默認支持按照編號排序,現在實現功能
第一步:按照編號排序
第二步:按照工資排序
一個排序接口如何支持兩種呢?
比較器接口就不一樣了,它不需要再本類上實現,可以編寫多個實現類
如汽車比較器可以這樣寫
按照重量的比較器
public class CarSpeedComparator implements Comparator{
  @Override
  public int compare(Car car1, Car car2) {
    return (car1.getSpeed()-car2.getSpeed());
  }
}
按照速度的比較器
public class CarWeightComparator implements Comparator{
  @Override
  public int compare(Car car1, Car car2) {
    return (car1.getWeight()-car2.getWeight());
  }
}
比較時可以根據場景不同指定不同的比較器
sort(list, speedComparator) 或者sort(list,weightComparator)


多線程:
利:
多線程可以提高程序運行效率和資源的利用率。
弊:
多線程會比較消耗資源,效率比較低。處理不好的話會造成線程死鎖。

多線程的實現方法
在Java中實現線程有兩種方式:
1.繼承Thread類
從Thread類中實例化的對象即代表線程,啓動一個線程就是建立一個Thread實例。因爲完成線程真正功能的代碼放在類的run()方法中,所以可以將線程要做的事寫在run()方法中即可。然後調用Thread類中的start()方法執行線程,也就是調用run()方法。
2.實現Runnable接口
Java不支持多重繼承,因此如果有一個子類要想實現線程,那就可以實現Runnable接口。實現了Runnable接口並編寫run()方法,使該任務可執行你的命令。
一般推薦大家實現Runnable接口來實現多線程。

線程通信常用方法
sleep();----強制正在執行的線程休眠(暫停執行),單位是毫秒(不釋放資源)。
注意:線程睡眠到期自動甦醒,並返回到可運行的狀態。sleep()中指定的時間使線程不會運行的最短時間。因此,sleep()方法不能保證該線程睡眠到期後就開始執行。
wait();當前線程暫停,等待notify()來喚醒(釋放資源)。
join();當前線程暫停,等待加入的線程運行結束,當前線程繼續執行。
使用鎖對象的notify()方法可以將正在等待的線程喚醒,但是同時有多個線程都處於等待狀態,notify()只是隨機喚醒一個。
我們可使用notifyAll()方法,喚醒所有的等待的線程。


 

發佈了36 篇原創文章 · 獲贊 34 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章