Map集合
1.Map存儲了一系列鍵值的映射關系
2.Map集合需要保證鍵的唯一性
3.可以通過鍵獲取到值,反之則不能
4.Map集合存儲元素使用put(key,valus)方法.
5.遍歷Map集合的兩種遍歷方式
a)通過KeySet方法返回由鍵組成的集合,迭代集合里面的元素拿到所有的鍵再通過get方法根據鍵來獲取值
b)通過entrySet方法返回鍵所映射的關系組成的集合,迭代該集合就拿到一個鍵值映射的關系,再通過getKey獲取到鍵,再通過getValue()方法獲取到值
HashMap
線程不安全,存儲速度快,允許存放null鍵,null值
通過HashSet保持鍵的唯一性
Hashtable
線程安全,存儲速度慢,不允許存放null鍵與null值
TreeMap
通過二叉樹的原理保證了鍵的唯一性
對鍵進行了排序,排序原理與SetMap相同.
(如果想要使用這個方法,必須要沖構造方法里面重寫Comparator 或者從對象所屬的類繼承Comparator實現這個接口)
Properties
Hashtable的子類,所以是線程安全的.
用于讀寫配置文件,一般配置項等號兩邊都是String,所以集合中的兩個列保存的都是String類型的數據.
這個集合中只能存String,所以不能使用泛型.
/*JavaAPI總結:application programming interface應用程序編程接口 sun公司提供給我們用的程序
一、String、StringBuffer、StringBuilder
1、String類是字符串常量
2、String池:String s = "abc" 和String s = new String("abc")的區別
3、String類的常用方法:charAt、indexOf、toCharArray、substring、split、compareTo、equals
4、StringBuffer:字符串容器,長度可變,一般用于字符串的增減刪的操作。reverse方法反向
String s = "abc"; s = s + "xxx";//String長度不可變,因為是常量
5、StringBuilder線程不安全,StringBuffer線程安全
二、集合類
|-Iterable:實現增強for循環
|--Collection:單列,按照一種或多種規則來存儲一系列元素
|---List:有序,允許有重復元素
|----AbstractList:抽象類,實現了iterator方法。
|-----ArrayList:數組實現,查找塊,增刪慢
|-----Vector:和ArrayList一樣,只是線程安全
|-----LinkedList:鏈表實現,查找慢,增刪塊
|---Set:無序,不允許有重復元素
|----HashSet:通過哈希算法保證元素不重復,對象要正確重寫equals和hashCode方法
|----HashTable:同上,但是線程安全
|----TreeSet:通過樹狀結構保證元素不重復,兩種方式
1、按照元素的自然順序進行排序,前提是元素具備比較功能,實現了Comparable接口的compareTo方法
2、在構造TreeSet實例時,傳入一個比較器,實現Comparator接口的compare方法
|-Map:保存的是鍵值對應關系,其中鍵不允許有重復,可以通過keySet方法拿到一個包含所有鍵的Set
再調用get(key)方法通過鍵拿到value
|--HashMap:通過HashSet的原理保證鍵不重復。
|--TreeMap:通過TreeSet的原理保證鍵不重復
|--Properties:用于讀取配置文件,不需要聲明泛型,因為鍵和值都只能為String類型。
list方法將集合中的配置項輸出到一個打印流
load方法將一個輸入流中的配置項存到集合中
Jdk1.5新特性泛型,減少集合存元素時錯誤發生的幾率。
Jdk1.5出現Iterable,為了實現增強for循環 for(元素類型 變量:集合或數組)
工具類:
Collections:集合工具類,sort、binarySearch、reverse
Arrays:數組工具類,sort。。。。
三、包裝類
1、Integer x = 0;x = x + 1; 裝箱-拆箱-裝箱(jdk1.5)
2、Interger.parseInt(String)將字符串轉為int型
四、System類
1、System類的常用方法:gc()垃圾回收、exit(0)終止程序、currentTimeMillis()獲得自1970年1月1日零時
以來的毫秒數、getProperty方法獲得系統屬性。
2、兩個靜態成員變量:in和out
in:標準輸入流,InputStreamReader類型
out:標準打印流,PrintStream類型
五、Runtime類
表示運行時,exec方法,在后臺新開啟一個窗口運行命令,是當前窗口的子窗口,繼承所有窗口屬性
六、日期對象
1、Date:大部分方法已過時,用new Date()創建日期對象表示當前時間
2、DateFormat:將日期格式化,抽象類
DateFormat df = DateFormat.getInstance(); String dateStr = df.format(new Date);
3、Calendar對象:
Calendar c = Calendar.getInstance();
可以將類中定義的常量當做參數傳入get和set方法來獲得和設置時間。
add方法,增加時間值,具體增加哪一項,就看傳入的常量,調用完此方法,時間對象就被改變了。
*/
面試題目總結:
一、請說說ArrayList、Vector和LinkedList的區別
這三者都是單列集合Collection下List集合的實現類,所以他們的共同點,元素有序,允許重復元素
不同點:
ArrayList和Vector底層都是數組實現,這樣的實現注定查找快、增刪慢
ArrayList和Vector的區別在于線程安全問題,Vector支持線程同步,是線程訪問安全的,而ArrayList線程不安全
LinkedList底層是鏈表結構,查找元素慢、增刪元素速度快,線程不安全。
二、請說說HashSet原理,并寫程序證明
HashSet在存元素時,會調用對象的hashCode方法計算出存儲位置,然后和該位置上所有的元素進行equals比較,
如果該位置沒有其他元素或者比較的結果都為false就存進去,否則就不存。
這樣的原理注定了元素是按照哈希值來找存儲位置,所有無序,而且可以保證無重復元素
我們在往HashSet集合存儲元素時,對象應該正確重寫Object類的hashCode和equals方法
正因為這樣的原理,HashSet集合是非常高效的。
比如,要查找集合中是否包含某個對象,首先計算對象的hashCode,折算出位置號,到該位置上去找就可以了,而不用和所有的元素都比較一遍
三、Collection和Collections的區別
兩者沒有任何關系
Collection是單列集合的父接口,JDK1.5中定義了Iterable接口作為Collection父類,為了實現增強for循環
Collections是工具類,提供了關于集合的常用操作,例如,排序、二分法查找、反轉元素等
1 Collections 的應用: 2 3 1. 4 package com.javami.kudyMap; 5 import java.util.ArrayList; 6 import java.util.Collections; 7 import java.util.Comparator; 8 import java.util.List; 9 public class ColletionsTest { 10 public static void main(String[]args) 11 { 12 /* 13 * Collections工具類:提供關于集合的常用操作. 14 */ 15 ArrayList<String> al = new ArrayList<String>(); 16 al.add("ab"); 17 al.add("aadc"); 18 al.add("aaa"); 19 al.add("hgdfakjg"); 20 al.add("xhyns"); 21 al.add("yyiouop"); 22 al.add("qq"); 23 al.add("zdff"); 24 25 /* 26 for(String s : al) 27 System.out.println(s+" "); 28 */ 29 30 /*Collections.sort(al); //list是一個接口 父類型的應用可以指向子類型的對象.. 31 for(String s : al) 32 System.out.println(s+" ");*/ 33 Collections.sort(al, new StringComparator()); 34 /* 35 * 第一種方法 : 通過比較器來對比排序 可以在構造方法里面. 36 * 或者在對象里面實現這個比較器.當new 這個實現接口.它會自動調用比較器的方法進行比較 37 */ 38 System.out.println("通過StringComparator()方法已經排序好-----"); 39 for(String s : al) 40 System.out.print(s+" "); 41 /* 42 * 使用了API里面的方法! 43 //binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 44 int pos = Collections.binarySearch(al,"aaa",new StringComparator()); 45 System.out.println(pos);//因為我們需要通過比較才可以! 46 */ 47 int pos = MyCollections.binarySearch(al,"dasdas",new StringComparator()); 48 System.out.println(pos); 49 } 50 51 } 52 53 /* 54 * 比較器: 先比較 長短,再比較順序 55 */ 56 class StringComparator implements Comparator<String> 57 { 58 59 @Override 60 public int compare(String s1, String s2) 61 { 62 //首先比較長度,再按照字典順序 63 int num = s1.length()- s2.length(); 64 if(num !=0) 65 return num; 66 return s1.compareTo(s2); 67 68 } 69 70 } 71 72 //實現一個二分查找 73 class MyCollections 74 { 75 private MyCollections(){}//私有化 76 public static<T> int binarySearch(List<T> l,T key,Comparator<T> com) 77 { 78 int min = 0; 79 int max = l.size()-1; 80 int mid = 0; 81 while(max >=min) 82 { 83 mid = (min+max) / 2; 84 //判斷比較器里面有沒有! 85 if(com.compare(key,l.get(mid))>0)//找到集合位置的值 86 min = mid+1; 87 else if(com.compare(key, l.get(mid))<0) 88 max = mid-1; 89 else 90 return mid; 91 } 92 93 //判斷mid位置的元素和key的大小 94 if(com.compare(key, l.get(mid))>0) 95 return -mid-2; 96 return -mid-1; 97 98 } 99 } 100 101 2.必須要通過比較器比較才能實現二分查找: 102 103 package com.javami.kudyAPI; 104 import java.util.ArrayList; 105 import java.util.Collections; 106 import java.util.Comparator; 107 108 public class Test { 109 public static void main(String[]args) 110 { 111 ArrayList<String> al = new ArrayList<String>(); 112 al.add("as"); 113 al.add("scx"); 114 al.add("dsad"); 115 al.add("hellsda"); 116 al.add("dsazxc"); 117 al.add("dascxxc"); 118 //在通過二分查找之前我們要經過排序' 119 System.out.println("還沒有排序之前"); 120 for(String s : al) 121 System.out.print(s+" "); 122 123 124 //第二部 : 當你調用二分查找之后.會調用比較器進行比較.是經過排序后的才可以進行二分查找 125 //比較器一定要傳過來 126 int num = Collections.binarySearch(al, "dsaas",new Comparator<String>(){ 127 128 @Override 129 public int compare(String s1, String s2) { 130 int num = s1.length() - s2.length();//比較長度 131 if(num != 0) 132 return num; 133 return s1.compareTo(s2); //按字典順序排 134 } 135 136 }); 137 System.out.println(num+1); 138 } 139 } 140 141 142 日期的應用: 143 144 package com.javami.kudyAPI; 145 import java.util.Calendar; 146 public class CalendarTest { 147 148 /** 149 * @param args 150 */ 151 152 public static void main(String[] args) 153 { 154 Calendar calendar = Calendar.getInstance(); 155 printCalendar(calendar); 156 int nums = getDayNum(2012); 157 System.out.println(nums); 158 159 //---------------- 160 Calendar startDay = Calendar.getInstance();//獲取當前的日歷 161 Calendar finishDay = getFinishDay(startDay); 162 int num = finishDay.get(Calendar.DAY_OF_YEAR) - calendar.get(Calendar.DAY_OF_YEAR); 163 System.out.println(num+"天數"); 164 } 165 166 //計算出某年的2月份有多少天 167 public static int getDayNum(int year) 168 { 169 //1.獲取一個日歷 170 Calendar calendar = Calendar.getInstance(); 171 172 /* 173 * set(int year, int month, int date) 174 設置日歷字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。 175 */ 176 calendar.set(year,2,1); //2月份其實就是中國的三月 177 //日歷字段 DAY_OF_YEAR獲取到年中的月份 , -1 其實就是2月份 178 calendar.add(Calendar.DAY_OF_YEAR,-1); 179 return calendar.get(Calendar.DAY_OF_MONTH); //獲取到二月份的天數 180 } 181 182 //一個項目做100天,周末休息,五一和十一各休息一天,今天開始做,哪天完工 183 //一個項目做100天,周末休息,五一和十一各休息一天,今天開始做,哪天完工 184 public static Calendar getFinishDay(Calendar c) { 185 for(int i=0; i<100; i++) { 186 187 //如果是星期六或者星期天(get 和 set 的字段數字,指示一個星期中的某天。) 188 if(c.get(Calendar.DAY_OF_WEEK)==1||c.get(Calendar.DAY_OF_WEEK)==7) 189 i--; 190 //(get 和 set 的字段數字,指示一個月中的某天。) 191 else if(c.get(c.DAY_OF_MONTH)==1&&(c.get(c.MONTH)==4||c.get(c.MONTH)==9)) 192 i--; 193 c.add(Calendar.DAY_OF_YEAR, 1); 194 } 195 return c; 196 } 197 //代表是一個時間 198 public static void printCalendar(Calendar calendar) 199 { 200 int year = calendar.get(calendar.YEAR); //年 201 int month = calendar.get(calendar.MONTH); //月 202 int day = calendar.get(calendar.WEEK_OF_MONTH);//日 203 int week = calendar.get(calendar.DAY_OF_WEEK);//星期 204 int hour = calendar.get(calendar.HOUR_OF_DAY); //時間 205 int minute = calendar.get(calendar.MINUTE);//分 206 207 String StringWeek = null; 208 switch(week) 209 { 210 211 case 1: 212 StringWeek = "星期天"; 213 break; 214 case 2: 215 StringWeek = "星期一"; 216 break; 217 case 3: 218 StringWeek = "星期二"; 219 break; 220 case 4: 221 StringWeek = "星期三"; 222 break; 223 case 5: 224 StringWeek = "星期四"; 225 break; 226 case 6: 227 StringWeek = "星期五"; 228 break; 229 case 7: 230 StringWeek = "星期六"; 231 break; 232 } 233 //并接成字符串 234 String str = ""+year+"-"+(month+1)+"-"+day+"-"+week+"-"+hour+"-"+minute; 235 System.out.println(str); 236 } 237 238 239 }