集合
Collection(單列集合)
Collection是單列集合祖宗介面,其全部單列集合都可以使用。
建立其實現類的物件。arraylist
boolean add(E e)//增 可重複時,返回值為true 不可重複,若重複返回值為false
boolean remove(E e)//刪 不能透過索引刪除,只能透過物件刪除;成功刪除返回true,失敗返回false
boolean contains(OBJect obj)//查 根據equals進行判斷是否存在 如果集合中儲存對是自定義物件,則需要重寫equals方法 另外字串比較也是equals。
void clear()
boolean isEmpty()
int size()
迭代器遍歷時候,不可以使用集合的方法進行增加刪除。可以使用迭代器提供的remove方法刪除。
Iterator<String> it=coll.iterator();
while(it.hasNext()){
String str=it.next();//next方法獲取元素,並移動指標。
if("bbb".equals(str)){
//coll.remove("bbb");
it.remove();
}
}
List
定義:有序,可重複,有索引(存取有序)
boolean add(int index,E e)//增
boolean remove(E e)//刪,可以透過索引刪除,將被刪除的元素返回
boolean set(int index,E e)//改
E get(int index) //返回指定的元素
額外新增的方法:迭代器可新增元素
ListIterator<String> it=list.listIterator();
while(it.hasNext()){
String str=it.next();//next方法獲取元素,並移動指標。
if("bbb".equals(str)){
list.add("qqq");
}
}
另外。增強for迴圈中s為臨時變數
for(String s:list){
s="q";
}
LinkedList
底層資料是雙連結串列,查詢慢,增刪快,操作首尾也很快。
Vector
Set
定義:無序,不重複,無索引
boolean add(E e)//增,不可重複,若新增重複返回值為false
boolean remove(E e)//刪
boolean contains(OBJect obj)//查
void clear()
boolean isEmpty()
int size()
Set<String> s=new HashSet<>();
s.add("wang");
s.add("quqi");
s.add("wang");
Iterator<String> it=s.iterator();
while(it.hasNext()){
String str=it.next();
System.out.println(str);
}
for(String str:s)
{
System.out.println(str);
}
HashSet
底層採用hash表儲存。
一般情況下會重寫hashCode方法,不同物件只要屬性值相同,雜湊值就一樣。如果沒有重寫則不同。
如果集合中儲存的是自定義物件,必須重寫hashCode和equals方法
HashSet<Student> hs=new HashSet<>();
TreeSet
不重複,無索引,可排序(從小到大:數值型別,字元,字串ASCII碼錶)
基於紅黑樹實現。
如何比較自定義?
- 預設的排序規則 Student實現Comparable介面,重寫裡面的抽象方法。
public class Student implements Comparable<Student>{
public int compareTo(Student o) {
//指定排序規則
return this.getAge()-o.getAge();//年齡升序
//this表示要新增的元素,o表示紅黑樹存在的元素。 返回值為負,說明新增元素是小的,在左邊,為正,元素是大的,存右邊。
}
}
- 比較器排序:建立TreeSet物件時候,傳遞比較器Comparator指定規則。
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int i = o1.getName().length() - o2.getName().length();//按照長度排序
i = i == 0 ? o1.compareTo(o2) : i; //如果一樣長按照首字母排序。(如果長度為0,按照預設比較規則排序)
return i; //如果長度不為0,按照上面相減為準。
}
});
Map(雙列集合)
鍵和值一一對應,鍵不可重複,值可以重複。
鍵值對叫做Entry物件。
V put(K key,V value)//增 如果鍵不存在,直接把鍵值對物件加入map集合。如果鍵存在,把原有的鍵值對物件覆蓋,被覆蓋的值返回。
V remove(Object key)//刪 成功刪除返回被刪除的值。
boolean containsKey(Object key)//查
boolean containsValue(Obkect value)//查
void clear()
boolean isEmpty()
int size()
Map遍歷方法
鍵找值 :
map.keySet(); set集合包含key物件
map.get(key)
Map<String,String> map=new HashMap<>();
map.put("曲奇","安子");
map.put("安子","曲奇");
Set<String> keys=map.keySet();//獲取所有的物件,把鍵放到一個集合中。
for (String key : keys) {
System.out.println(key);
String value=map.get(key);//get查詢鍵對應的值
System.out.println(key+"=" +value);
}
Iterator<String> it=keys.iterator();
while(it.hasNext())
{
String str=it.next();
String value=map.get(str);
System.out.println(str+"="+value);
}
鍵值對
map.entrySet();set集合包含Entry物件 ctrl alt v自動補全程式碼
entry.getKey();
entry.getValue();
Set<Map.Entry<String, String>> entries = map.entrySet();//透過方法獲得所有鍵值物件,返回set集合
for(Map.Entry<String, String> entry:entries){//遍歷集合,獲得所有鍵值對物件
String key=entry.getKey();
String value=entry.getValue();//利用entry呼叫get
System.out.println(key+"="+value);
}
Iterator<Map.Entry<String, String>> iterator = entries.iterator();
while(iterator.hasNext())
{
Map.Entry<String, String> entry = iterator.next();
String key=entry.getKey();
String value=entry.getValue();
System.out.println(key+"="+value);
}
HashMap
不重複,無索引,無序。
底層和hashSet完全一樣,雜湊表結構(長度為16,預設載入因子為0.75的陣列)
利用鍵計算雜湊值。
如果鍵儲存為自定義物件,需要重寫hashCode和equals方法。值不需要。
底層原理
TreeMap
不重複,無索引,可排序(預設/自定義)
和TreeSet底層原理一樣,都是紅黑樹結構。
TreeMap<Integer, String> tm = new TreeMap<>();//打出new TreeMap使用ctrl alt v
TreeMap<Integer, String> tm = new TreeMap<>(new Comparator<Integer>() {//ctrl+p 檢視形參,new comparator補齊
@Override
public int compare(Integer o1, Integer o2) {
return 0;
}
});
如何比較自定義?
- 預設的排序規則 Student實現Comparable介面,重寫裡面的抽象方法。
- 比較器排序:建立TreeSet物件時候,傳遞比較器Comparator指定規則。
例子:統計字串中每個字元出現個數。
String s="aacdbbdc";
TreeMap<Character,Integer> tm=new TreeMap<>();
for(int i=0;i<s.length();i++)
{
char c=s.charAt(i);
if(tm.containsKey(c)){
int count=tm.get(c);
count++;
tm.put(c,count);
}else{
tm.put(c,1);
}
}
System.out.println(tm);
可變引數
方法形參的個數可以發生變化,格式:屬性型別 ...名字//int...args
在方法中,其他形參放在前面,可變引數寫在最後
public static int getSum(int...args){
}
泛型
泛型不能寫基本資料型別,要寫必須寫其包裝類。如數字:Integer。
指定泛型型別後,傳遞資料時可以傳入子類型別。
如果不寫型別則預設為Object類。
public static void main(String[] args) {
ObjectBox objectBox=new ObjectBox();//box物件
Apple apple=new Apple();//蘋果物件
objectBox.setContent(apple);//新增蘋果
Apple content= (Apple) objectBox.getContent();//取出物件為object類,需要強制轉換為apple類
}
public class ObjectBox {
private Object content;//Object類
public Object getContent() {
return content;
}
public void setContent(Object content) {
this.content = content;
}
}
取出物件為object類,需要強制轉換為apple類.
泛型類
透過泛型類可以直接獲得
public class GenericBox<T> {//泛型T
private T content;
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
}
GenericBox<Apple> genericBox=new GenericBox<>();//泛型apple
Apple apple=new Apple();
genericBox.setContent(apple);
Apple content= genericBox.getContent();//直接獲得apple類
泛型方法
要定義泛型方法,請將泛型型別引數放在返回值之前
public static <T> void printArray(T[] x)
{
for(T ele:x)
{
System.out.println(ele);
}
}
Apple[] apples=new Apple[2];
printArray(apples);
泛型萬用字元
泛型不可以繼承,但是泛型的資料可以繼承。
ArrayList<Ye> list1=new ArrayList<>();
ArrayList<Fu> list2=new ArrayList<>();
ArrayList<Zi> list3=new ArrayList<>();
list.add(new Ye());//dui
method(list1);//泛型裡面寫什麼型別,只能傳遞什麼型別資料(public static void method(ArrayList<Ye> list))
method(list2);
method(list3);
萬用字元:? 進行型別限定
<?extends E> 表示可以傳遞E和所有子類
<? super E> 表示傳遞E和所有父類
工具類
定義
工具類是為了提供一些通用的、某一非業務領域內的公共方法,僅僅是作為工具方法被使用。所以將它做成靜態方法最合適,不需要例項化。
如果要例項化一個工具類,就需要一定的記憶體空間,工具類提供的是靜態方法,透過類就能呼叫,所以不必浪費記憶體去例項化工具類物件。
public final class Math {
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
}
設定建構函式為private訪問許可權,表示除了類本身外,誰都不能產生一個例項,因此,其他類只能透過類名來訪問,不能透過例項物件訪問
。而由於工具類中都提供靜態方法,所以可以透過類進行訪問。
Collections
是集合的工具類。
addAll(Collection<T> c,T...elements) //批次參加元素
shuffle(List<?>list)//打亂順序
sort(List<T> list)
sort(List<T> list,Comparator<T> c)
copy(List<T>dest,List<T>src)//複製