ArrayList
arraylist:可調整大小的數組的實現List接口。 實現所有可選列表操作,並允許所有元素,包括null 。 除了實現List 接口之外,該類還提供了一些方法來操縱內部使用的存儲列表的數組的大小.
該size,isEmpty,get,set,iterator和listIterator操作在固定時間內運行。 add操作以攤餘常數運行 ,即添加n個元素需要O(n)個時間。 所有其他操作都以線性時間運行(粗略地說)。 與LinkedList實施相比,常數因子較低
ArrayList的特點:
底層數據結構是數組,查詢快,增刪慢,
線程不安全,效率高。
ArrayList去重複
ArrayList<String> list=new ArrayList<String>();
list.add("aa");
list.add("aa");
list.add("bb");
list.add("cc");
list.add("cc");
list.add("bb");
list.add("aa");
ArrayList<?> hha=getsingle(list);
System.out.println(hha);
System.out.println(getsingle(list));
}
public static ArrayList<Object> getsingle(ArrayList<String> list){
ArrayList<Object> newlist=new ArrayList<Object>();
Iterator<String> it=list.iterator();
while(it.hasNext()){
Object objec=it.next();
if(!newlist.contains(objec)){
newlist.add(objec);
}
arrayList的兩種遍歷:
ArrayList<String> list=new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
Iterator it=list.iterator();
while(it.hasNext()){
String ss=(String)it.next();
System.out.println(ss);
}
for(int i=0;i<list.size();i++){
String ss1=list.get(i);
System.out.println(ss1);
}
}
泛型
(1)泛型概述
是一種把明確類型的工作推遲到創建對象或者調用方法的時候纔去明確的特殊的類型。
格式:<數據類型>只能是引用類型
泛型的好處:
A把運行時的問題提前到了編譯期間。
B:避免了強制轉換
C:優化了程序設計,解決了黃色的警告線。
泛型在那些地方使用呢?
看API,如果在類,接口,抽象類後面跟着的話就說明要用泛型。
一般在集合中要使用。
案列:
ArrayList<String> list=new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("java");
Iterator<String> it=list.iterator();
while(it.hasNext()){
String s=it.next();
System.out.println(s);
}
System.out.println("---------------------------");
for(int i=0;i<list.size();i++){
String ss=list.get(i);
System.out.println(ss);
}
}
案列:
ArrayList<lei01 > list=new ArrayList<lei01>();
lei01 s=new lei01("曹操",40);
lei01 s1=new lei01("蔣幹",20);
lei01 s2=new lei01("諸葛亮",30);
lei01 s3=new lei01("蒙羞",18);
lei01 s4=new lei01("曹丕",50);
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
Iterator<lei01> it=list.iterator();
while(it.hasNext()){
lei01 ss=it.next();
System.out.println(ss.getName()+"-----------"+ss.getAge());
}
練習:獲取十個1到20的數,要求不能重複。(好好思考)
Random r=new Random();
ArrayList<Integer> list=new ArrayList<Integer>();
int cout=0;
while(cout<10){
int num=r.nextInt(20)+1;
if(!list.contains(num)){
list.add(num);
cout++;
}
}
for(int i=0;i<cout;i++){
Integer ha=list.get(i);
System.out.print(ha+" ");
}
}
集合中tostring(源碼)的解析:
A:Collection c = new ArrayList();
這是多態,所以輸出c的toString()方法,其實是輸出ArrayList的toString()
B:看ArrayList的toString()
而我們在ArrayList裏面卻沒有發現toString()。
以後遇到這種情況,也不要擔心,你認爲有,它卻沒有,就應該去它父親裏面看看。
C:toString()的方法源碼
public String toString() {
Iterator<E> it = iterator(); //集合本身調用迭代器方法,得到集合迭代器
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next(); //e=hello,world,java
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
//[hello, world, java]
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
hashset
Hashset遍歷元素時需要重寫Hashcode和equals不然重複的值不能去掉。
HashSet<Student> hs=new HashSet<Student>();
Student s=new Student("老子",22);
Student s1=new Student("孔子",12);
Student s2=new Student("尋子",24);
Student s3=new Student("孟子",28);
Student s4=new Student("墨子",29);
Student s5=new Student("老子",22);
hs.add(s);
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
hs.add(s5);
for(Student ss:hs){
System.out.println(ss.getName()+"----------"+ss.getAge());
}
Treeset的特點
1.自然排序
2.唯一
MAP集合的
僅僅知道學號就能知道學生的姓名和年齡,collection很麻煩,所以Java給我們提供的了MAP集合來解決這個問題。
Map將鍵映射到值的對象。 地圖不能包含重複的鍵; 每個鍵可以映射到最多一個值。
這個接口取代了Dictionary類,它是一個完全抽象的類而不是接口。
Map界面提供了三個集合視圖 ,允許將映射內容視爲一組鍵,值集合或鍵值映射集合。 地圖的順序被定義爲其中在地圖上的集合視圖迭代返回元素的順序。 一些地圖實現,如TreeMap課程,對他們的訂單做出了具體的保證; 其他人.
Map可以存儲鍵值,鍵不能重複,值可以重複。
Map和collection的區別:
Map集合存儲的元素是成對出現的,值是可以重複的,可以理解爲夫妻對。
collection的集合元素的單個出現的,set是唯一的,list是可以重複的,光棍一個。
案列
Map<String,String> map=new HashMap<String, String>();
map.put("諸葛亮", "逆天改名");
map.put("曹操", "挾天子以令諸侯");
map.put("孫權", "天下人才盡在江東");
map.put("司馬懿", "能屈能伸");
map.put("司馬微", "諸葛亮師傅");
map.put("徐遠志", "人才");
map.remove("曹操");
System.out.println(map);
獲取鍵值的案列:
Map<String,String> map=new HashMap<String, String>();
map.put("諸葛亮", "逆天改名");
map.put("曹操", "挾天子以令諸侯");
map.put("孫權", "天下人才盡在江東");
map.put("司馬懿", "能屈能伸");
map.put("司馬微", "諸葛亮師傅");
map.put("徐遠志", "人才");
map.remove("曹操");
System.out.println(map);
System.out.println("------------------------");
Set<String> s=map.keySet();
for(String vea:s){
System.out.println(vea);
}
System.out.println("------------------------------");
Collection<String> ss=map.values();
System.out.println(ss);
Map集合的遍歷
Map<String,String> map=new HashMap<String, String>();
map.put("狗雜種", "阿秀");
map.put("石青", "閔柔");
map.put("不三", "不四");
Set<String> s=map.keySet();
for(String ss:s){
String vale=map.get(ss);
System.out.println(ss+"------------"+vale);
Hasmap
基於哈希表的實現的Map接口。 此實現提供了所有可選的地圖操作,並允許null的值和null鍵。 ( HashMap類大致相當於Hashtable ,除了它是不同步的,並允許null)。這個類不能保證地圖的順序; 特別是,它不能保證訂單在一段時間內保持不變
案列
private static void menth1() {
// TODO Auto-generated method stub
HashMap<String, Student> hm = new HashMap<String, Student>();
// 創建學生對象
Student s1 = new Student("周星馳", 58);
Student s2 = new Student("劉德華", 55);
Student s3 = new Student("梁朝偉", 54);
Student s4 = new Student("劉嘉玲", 50);
// 添加元素
hm.put("9527", s1);
hm.put("9522", s2);
hm.put("9524", s3);
hm.put("9529", s4);
// 遍歷
Set<String> set = hm.keySet();
for (String key : set) {
// 注意了:這次值不是字符串了
// String value = hm.get(key);
Student value = hm.get(key);
System.out.println(key + "---" + value.getName() + "---"
+ value.getAge());
}
}
public static void menth(){
HashMap<String, SStudent> hs=new HashMap<String, SStudent>();
SStudent s=new SStudent("諸葛亮",25);
SStudent s1=new SStudent("曹操",25);
SStudent s2=new SStudent("孫權",26);
SStudent s3=new SStudent("馬超",21);
SStudent s4=new SStudent("曹操",22);
SStudent s5=new SStudent("哈哈",28);
hs.put("001", s);
hs.put("002", s1);
hs.put("003", s2);
hs.put("004", s3);
hs.put("005", s4);
hs.put("006", s5);
Set<String> key=hs.keySet();
for(String ss:key){
//SStudent ss1=hs.get(ss);
//System.out.println(ss1);
SStudent value = hs.get(ss);
System.out.println(ss + "---" + value.getName() + "---"
+ value.getAge());
}
- 需求 :”aababcabcdabcde”,獲取字符串中每一個字母出現的次數要求結果:a(5)b(4)c(3)d(2)e(1)
-
- 分析:
- A:定義一個字符串(可以改進爲鍵盤錄入)
- B:定義一個TreeMap集合
- 鍵:Character
- 值:Integer
- C:把字符串轉換爲字符數組
- D:遍歷字符數組,得到每一個字符
- E:拿剛纔得到的字符作爲鍵到集合中去找值,看返回值
- 是null:說明該鍵不存在,就把該字符作爲鍵,1作爲值存儲
- 不是null:說明該鍵存在,就把值加1,然後重寫存儲該鍵和值
- F:定義字符串緩衝區變量
- G:遍歷集合,得到鍵和值,進行按照要求拼接
H:把字符串緩衝區轉換爲字符串輸出
public class TreeMapDemo { public static void main(String[] args) { // 定義一個字符串(可以改進爲鍵盤錄入) Scanner sc = new Scanner(System.in); System.out.println("請輸入一個字符串:"); String line = sc.nextLine(); // 定義一個TreeMap集合 TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>(); //把字符串轉換爲字符數組 char[] chs = line.toCharArray(); //遍歷字符數組,得到每一個字符 for(char ch : chs){ //拿剛纔得到的字符作爲鍵到集合中去找值,看返回值 Integer i = tm.get(ch); //是null:說明該鍵不存在,就把該字符作爲鍵,1作爲值存儲 if(i == null){ tm.put(ch, 1); }else { //不是null:說明該鍵存在,就把值加1,然後重寫存儲該鍵和值 i++; tm.put(ch,i); } } //定義字符串緩衝區變量 StringBuilder sb= new StringBuilder(); //遍歷集合,得到鍵和值,進行按照要求拼接 Set<Character> set = tm.keySet(); for(Character key : set){ Integer value = tm.get(key); sb.append(key).append("(").append(value).append(")"); } //把字符串緩衝區轉換爲字符串輸出 String result = sb.toString(); System.out.println("result:"+result); }
}