在存儲(chǔ)的時(shí)候通趁瞻蹋考慮的對象是數(shù)組
或者集合
,但在java中數(shù)組存在一些弊端,一旦創(chuàng)建,其長度不可變,在數(shù)組中真實(shí)存儲(chǔ)的對象個(gè)數(shù)是個(gè)未知數(shù).
一 : Collection接口
其子接口有List
與 Set
.
List
接口其主要面向存儲(chǔ)有序的,可以重復(fù)的元素
List
接口的主要實(shí)現(xiàn)類是 ArrayList
與linkedList
ArrayList是List
接口的主要實(shí)現(xiàn)類,LinkedList
面向比較頻繁的操作如刪除操作,因?yàn)槠鋵?shí)現(xiàn)方式主要是鏈表.
Set
接口主要面向的是存儲(chǔ)無序的,不可重復(fù)的元素
Set
接口的主要實(shí)現(xiàn)類為HashSet,LinkedHashSet,TreeSet,Hashtable(子類 : Properties)
Collection接口提供一些通用的方法,下面一一介紹一下
-
Size();
返回集合中元素的個(gè)數(shù)
Collection coll = new ArrayList();
System.out.println(coll.size());
-
add(Oject obj);
向集合中添加元素
Collection coll = new ArrayList();
coll.add(123);//123 自動(dòng)轉(zhuǎn)換成包裝類
coll.add("AA");
coll.add(new Date());
coll.add("BB");
System.out.println(coll);
打印結(jié)果
[123, AA, Tue Jul 17 16:59:47 CST 2018, BB]
-
addAll
向集合中添加另一個(gè)集合
Collection coll = new ArrayList();
coll.add("AA");
Collection coll1 = Arrays.asList(1,2,3);
coll.addAll(coll1);
-
isEmpty()
判斷集合是否為空
Collection coll = new ArrayList();
System.out.println(coll.isEmpty());
-
clear() 清空集合元素
Collection coll = new ArrayList();
coll.add("AA");
coll.clear();
-
contains(Object obj)
判斷集合是否包含指定的obj元素,如果包含返回true,否則返回false.
如果存入集合中的元素是自定義類的對象,自定義類要重寫equals()
方法,添加進(jìn)List集合的元素(或者對象)所在類一定要重寫equals()
方法
Collection coll = new ArrayList();
coll.add(123);//123 自動(dòng)轉(zhuǎn)換成包裝類
coll.add("AA");
boolean b1 = coll.contains(123);
判斷是否包含自定義對象
Person p = new Person();
boolean b2 = coll.contains(p);
自定義類Person類
要重寫 equals()
方法
class Person{
//屬性部分
private String name;
private int age;
public Person() {
super();
}
//構(gòu)造方法
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//set/get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重寫toString
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
//重寫equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
-
containsAll(coll)
判斷是否包含所有元素
Collection coll1 = new ArrayList();
coll1.add(123);
coll1.add("AA");
boolean b3 = coll.containsAll(coll1);
-
retainAll(coll)
求當(dāng)前集合與參數(shù)集合的共有元素,返回給當(dāng)前集合
Collection coll = new ArrayList();
coll.add(123);//123 自動(dòng)轉(zhuǎn)換成包裝類
coll.add("AA");
Collection coll1 = new ArrayList();
coll1.add(234);
coll1.add("AA");
coll.retainAll(coll1);
System.out.println(coll);
-
remove(Object obj)
刪除集合中obj元素,若刪除成功返回True,否則返回false
Collection coll = new ArrayList();
coll.add(123);//123 自動(dòng)轉(zhuǎn)換成包裝類
coll.add("AA");
boolean b = coll.remove("123");
System.out.println(b);
-
removeAll(Collection coll)
從當(dāng)前集合中刪除包含coll中元素
coll.removeAll(coll1);
System.out.println(coll);
-
equals(Object obj)
判斷集合中的所有元素是否完全相同
Collection coll = new ArrayList();
coll.add(123);//123 自動(dòng)轉(zhuǎn)換成包裝類
coll.add("AA");
Collection coll1 = new ArrayList();
coll1.add(234);
coll1.add("AA");
System.out.println(coll1.equals(coll2));
-
hashCode();
返回集合哈希值
Collection coll1 = new ArrayList();
coll1.add(234);
System.out.println(coll1.hashCode());
-
toArray()
將集合轉(zhuǎn)化成數(shù)組
Collection coll = new ArrayList();
coll.add(123);//123 自動(dòng)轉(zhuǎn)換成包裝類
coll.add("AA");
Object[] obj = coll.toArray();
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
}
-
iterator()
返回一個(gè)Iterator接口實(shí)現(xiàn)類的對象.實(shí)現(xiàn)集合的遍歷
Iterator iterator = coll.iterator();
System.out.println(iterator.next());
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
list接口
ArrayList
list的主要實(shí)現(xiàn)類
-
在指定的索引位置index添加元素
List list = new ArrayList();
list.add(123);
list.add(456);
//在指定的索引位置index添加元素
list.add(0,55);
-
獲取指定索引的元素
List list = new ArrayList();
list.add(123);
list.add(456);
Object obj = list.get(1);
-
刪除指定索引位置的元素
List list = new ArrayList();
list.add(123);
list.add(456);
list.remove(0);
-
設(shè)置指定索引位置的元素
List list = new ArrayList();
list.add(123);
list.add(456);
list.set(0, 111);
-
返回obj在集合中首次出現(xiàn)的位置 沒有的話返回-1
List list = new ArrayList();
list.add(123);
list.add(456);
list.indexOf(123);
-
返回obj在集合中最后一次出現(xiàn)的位置 沒有的話返回-1
List list = new ArrayList();
list.add(123);
list.add(456);
list.lastIndexOf(456);
-
返回從fromIndex 到toIndex結(jié)束的一個(gè)子list
List list = new ArrayList();
list.add(123);
list.add(456);
list.add(new String("aa"));
list.add(new String("bb"));
list.subList(0, 3);//不含末尾,包含頭 左閉右開
LinkedList
主要使用鏈表實(shí)現(xiàn),適用于頻繁的操作,其操作放與ArrayList
相同
LinkedList list = new LinkedList();
list.add(123);
list.add(456);
list.add("雪芙");
list.add("百百");
list.set(1, 111);
list.remove(0);
list.get(0);
/增強(qiáng)for循環(huán)/
for(Object o:list) {
System.out.println(o);
}
set接口
Set
接口,存儲(chǔ)無序的,不可重復(fù)的元素,Set中常用的方法都是Collection下定義的.
Set
存儲(chǔ)的元素是無序的,不可重復(fù)的!
1.無序性,無序性!= 隨機(jī)性 ,真正的無序性指的的是元素在底層存儲(chǔ)的位置是無序的
2.不可重復(fù)性,當(dāng)向Set
中添加進(jìn)相同的元素的時(shí)候,后面的這個(gè)不能添加進(jìn)去.
3.要求添加進(jìn)Set的元素所在的類,一定要重寫equals()
和 hasCode()
方法,進(jìn)而保證Set中元素的不可重復(fù)性!
Set
中的元素的存儲(chǔ)方式
: 使用了哈希算法,當(dāng)向Set中添加對象時(shí),首先調(diào)用此對象所在類的hashCode()
方法,計(jì)算此對象的哈希值,此哈希值決定了此對象在Set中的存儲(chǔ)位置,若此位置之前沒有對象存儲(chǔ),則這個(gè)對象直接存到此位置.若此位置已經(jīng)有對象存儲(chǔ),再通過equals()
比較這兩個(gè)對象是否相同,如果相同,后一個(gè)對象就不能再添加進(jìn)來
要求:hashCode()
方法要與equals
方法一致
子接口
- HashSet(主要實(shí)現(xiàn)類)
- LinkedHashSet
- TreeSet
-
HashSet
public void testHashSet() {
Set set = new HashSet();
set.add(123);
set.add(456);
set.add("xf");
set.add("xf");
set.add(null);
Personzz p1 = new Personzz("雪芙", 23);
Personzz p2 = new Personzz("雨辰", 22);
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
set.add(p1);
set.add(p2);
System.out.println(set.size());
System.out.println(set);
}
class Personzz {
String name;
Integer age;
public Personzz(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {// return age.hashcode()+name.hashcode(); 沒有自帶的健壯性好
final int prime = 31;// 質(zhì)數(shù)
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Personzz other = (Personzz) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
打印結(jié)果
1232761
1236019
6
[null, com.TianTianBaby.java.Personzz@12dc33, 456, 123, com.TianTianBaby.java.Personzz@12cf79, xf]
-
LinkedHashSet
使用鏈表維護(hù)了一個(gè)添加進(jìn)集合的順序,導(dǎo)致我們遍歷LinkedHashSet
集合元素時(shí),是按照添加進(jìn)去的順序遍歷的.
LinkedHashSet
插入性能略低于HashSet
因?yàn)殒湵硪绕茐闹暗倪B接,但在迭代訪問Set里的全部元素時(shí)有很好的性能.
public void tesLinkedHashSet() {
Set set = new LinkedHashSet();
set.add(123);
set.add(456);
set.add("xf");
set.add("xf");
set.add(null);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
打印結(jié)果
123
456
xf
null
-
TreeSet
①.向TreeSet
中添加的元素必須是同一個(gè)類型的
②.可以按照添加進(jìn)集合中的元素的指定的順序遍歷,像String,包裝類等默認(rèn)按照從小到大的順序遍歷
public void testTreeSet1() {
Set set = new TreeSet();
// 當(dāng)Person類沒有實(shí)現(xiàn)Compareable接口時(shí),當(dāng)向TreeSet中添加Peronzz對象時(shí),報(bào)
// ClassCastException
set.add(new Personzz("岑", 22));
set.add(new Personzz("岑1", 23));
set.add(new Personzz("岑2", 24));
set.add(new Personzz("岑3", 24));
for (Object str : set) {
System.out.println(str);
}
}
打印結(jié)果
com.TianTianBaby.java.Personzz@62fc
com.TianTianBaby.java.Personzz@b3c4a
com.TianTianBaby.java.Personzz@b3c6a
com.TianTianBaby.java.Personzz@b3c6b
③.自然排序,當(dāng)向TreeSet中添加自定義類的對象時(shí),有兩種排序方法
自然排序 :要求自定義類實(shí)現(xiàn)java.lang.Comparable
接口并且重寫Compareable(Object obj)
在此方法中,指明按照自定義類的哪個(gè)屬性進(jìn)行排序.
class Personzz implements Comparable {
String name;
Integer age;
public Personzz(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Personzz(String name) {
super();
this.name = name;
}
@Override
public int hashCode() {// return age.hashcode()+name.hashcode(); 沒有自帶的健壯性好
final int prime = 31;// 質(zhì)數(shù)
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Personzz other = (Personzz) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
// 當(dāng)向TreeSet中添加Person類的對象時(shí),依據(jù)此方法,確定按照那個(gè)屬性排列
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
if (o instanceof Personzz) {
Personzz p = (Personzz) o;
// return this.name.compareTo(p.name) ;
// return this.age.compareTo(p.age);
// return -this.age.compareTo(p.age);//倒序
int i = this.age.compareTo(p.age);
if (i == 0) {
return this.name.compareTo(p.name);
} else {
return i;
}
}
return 0;
}
}
總結(jié) : 向TreeSet中添加元素時(shí),首先按照CompareTo
()方法進(jìn)行比較,一旦返回0,雖然僅是兩個(gè)對象的屬性值相同,但程序會(huì)認(rèn)為這兩個(gè)對象是相同的,進(jìn)而后一個(gè)對象不能添加進(jìn)來,所以CompareTo()
與hasCode()
以equals()
三者保持一致!
④.定制排序
無法操作類,Compare()與hashCode()以及equals()三者保持一致
public void testTreeSet2() {
// 1.創(chuàng)建一個(gè)實(shí)現(xiàn)了Comparater接口的類對象
Comparator com = new Comparator() {
// 向TreeSet中添加Customer類的對象,在此compare()方法中,指明的是按照customer的哪個(gè)屬性排序的
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Customer && o2 instanceof Customer) {
Customer c1 = (Customer) o1;
Customer c2 = (Customer) o2;
int i = c1.getId().compareTo(c2.getId());
if (i == 0) {
return c1.getName().compareTo(c2.getName());
}
//正序
return 1;
}
return 0;
}
};
// 2.將此對象作為形參傳遞給TreeSet的構(gòu)造器中
TreeSet set = new TreeSet(com);
// 3.向TreeSet中添加Comparator接口中的compare方法中涉及的類的對象
set.add(new Customer("AA", 1003));
set.add(new Customer("BB", 1004));
set.add(new Customer("CC", 1005));
set.add(new Customer("DD", 1006));
set.add(new Customer("EE", 1006));
for (Object str : set) {
Customer cus = (Customer)str;
System.out.println(cus.getName());
}
}
打印結(jié)果
AA
BB
CC
DD
EE
Customer 類
public class Customer {
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Customer(String name, Integer id) {
super();
this.name = name;
this.id = id;
}
}
匿名方法
public void testTreeSet3() {
// 1.創(chuàng)建一個(gè)實(shí)現(xiàn)了Comparater接口的類對象
// 2.將此對象作為形參傳遞給TreeSet的構(gòu)造器中
TreeSet set = new TreeSet(new Comparator() {
// 向TreeSet中添加Customer類的對象,在此compare()方法中,指明的是按照customer的哪個(gè)屬性排序的
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Customer && o2 instanceof Customer) {
Customer c1 = (Customer) o1;
Customer c2 = (Customer) o2;
int i = c1.getId().compareTo(c2.getId());
if (i == 0) {
return c1.getName().compareTo(c2.getName());
}
return 1;
}
return 0;
}
});
// 3.向TreeSet中添加Comparator接口中的compare方法中涉及的類的對象
set.add(new Customer("AA", 1003));
set.add(new Customer("BB", 1004));
set.add(new Customer("CC", 1005));
set.add(new Customer("DD", 1006));
set.add(new Customer("EE", 1006));
for (Object str : set) {
System.out.println(str);
}
}
二 : MAP接口
-
HashMap
key
是用set來存放的,不可重復(fù),value
是用Collection來存放的,可重復(fù) 一個(gè)key-value是一個(gè)Entry
,所有的Entry是用Set存放的,也是不可重復(fù)的.
向HashMap中添加元素時(shí),會(huì)調(diào)用key所在類的equals()方法,判斷兩個(gè)key是否相同,若相同則只能添加進(jìn)后添加
的那個(gè)元素.
public void test1() {
Map map = new HashMap();
//向Map中添加一個(gè)元素
map.put("雪芙", 35);
map.put("雨辰", 32);
map.put("代勁", 38);
map.put(null, null);
map.put("雨辰", 35);
map.put(new Personzz("馨日",23), 30);
map.put(new Personzz("馨月",23), 34);
System.out.println(map.size());
System.out.println(map);
//按照指定的key刪除key-value對
map.remove("代勁");
//putAll 將一個(gè)新的Map中所有元素添加進(jìn)來
//clear清空
//get獲取指定Key的Value值若無此Key 返回null
map.get("雨辰");
}
Map的遍歷方法
public void test2() {
Map map = new HashMap();
//向Map中添加一個(gè)元素
map.put("雪芙", 35);
map.put("雨辰", 32);
map.put("代勁", 38);
map.put(null, null);
}
LinkedHashMap 與 HashMap操作一樣
public void test3() {
Map map = new LinkedHashMap();
//向Map中添加一個(gè)元素
map.put("雪芙", 35);
map.put("雨辰", 32);
map.put("代勁", 38);
map.put(null, null);
map.put(new Personzz("馨日",23), 30);
Set set1 = map.keySet();
for(Object obj:set1) {
System.out.println(obj+"--->>>"+map.get(obj));
}
}
- 遍歷key集
Set set = map.keySet();
for(Object obj : set) {
System.out.println(obj);
}
打印結(jié)果
null
代勁
雨辰
雪芙
- 遍歷value集
Collection values = map.values();
Iterator i = values.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
打印結(jié)果
null
38
32
35
- 遍歷Key-value對
方式一
Set set1 = map.keySet();
for(Object obj:set1) {
System.out.println(obj+"--->>>"+map.get(obj));
}
打印
null--->>>null
代勁--->>>38
雨辰--->>>32
雪芙--->>>35
方式二
Set set2 = map.entrySet();
for(Object obj:set2) {
Map.Entry entry = (Map.Entry)obj;
System.out.println(entry.getKey()+"----->"+entry.getValue());
System.out.println(entry);
}
打印
null----->null
null=null
代勁----->38
代勁=38
雨辰----->32
雨辰=32
雪芙----->35
雪芙=35
TreeMap 自然排序 與TreeSet方法相同
public void test4() {
Map map = new TreeMap();
//向Map中添加一個(gè)元素
map.put(new Personzz("aa",23), 30);
map.put(new Personzz("bb",22), 30);
map.put(new Personzz("cc",21), 30);
map.put(new Personzz("dd",21), 30);
Set set1 = map.keySet();
for(Object obj:set1) {
System.out.println(obj+"--->>>"+map.get(obj));
}
}
TreeMap 定制排序
public void test5() {
Comparator com = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Customer && o2 instanceof Customer) {
Customer c1 = (Customer) o1;
Customer c2 = (Customer) o2;
int i = c1.getId().compareTo(c2.getId());
if (i == 0) {
return c1.getName().compareTo(c2.getName());
}
return 1;
}
return 0;
}
};
TreeMap map = new TreeMap(com);
map.put(new Customer("aa" , 1001), 80);
map.put(new Customer("bb", 1002), 81);
map.put(new Customer("cc", 1003), 82);
map.put(new Customer("dd", 1004), 83);
Set set1 = map.keySet();
for(Object obj:set1) {
System.out.println(obj+"--->>>"+map.get(obj));
}
}
使用properties處理屬性文件
public void test6() throws FileNotFoundException, IOException {
Properties pros = new Properties();
pros.load(new FileInputStream(new File("jdbc.properties")));
String str = pros.getProperty("user");
String password = pros.getProperty("password");
System.out.println(str);
System.out.println(password);
}
Enumeration接口
Enumeration 接口是Iterator迭代器的古老版本
public class TestEnumeration {
public static void main(String[] args) {
Enumeration enu = new StringTokenizer("ab-c*-df-g","-");
while(enu.hasMoreElements()) {
System.out.println(enu.nextElement());
}
}
}
打印
ab
c*
df
g
四 : Collections
操作Collection
以及Map
的工具類
使用方法
public void testCollections1() {
List list = new ArrayList();
list.add(123);
list.add(456);
list.add(789);
list.add(15);
System.out.println(list);
//反轉(zhuǎn)
Collections.reverse(list);
System.out.println(list);
//隨機(jī)排序
Collections.shuffle(list);
//根據(jù)元素的自然排序指定List集合元素按升序排序
Collections.sort(list);
//根據(jù)指定的Compartor產(chǎn)生的順序?qū)ist集合元素進(jìn)行排序
// Collections.sort(list, c);
//swap(List,int i,int j)將指定List集合中的i處元素和j處元素進(jìn)行交換
Collections.swap(list, 0, 3);
}
public void testCollections2() {
List list = new ArrayList();
list.add(123);
list.add(456);
list.add(789);
list.add(15);
Collections.max(list);
Collections.min(list);
//返回指定集合中指定元素的出現(xiàn)次數(shù)
int count = Collections.frequency(list, 15);
System.out.println(count);
//實(shí)現(xiàn)List的復(fù)制
//void copy(List dest,list src)將src中的內(nèi)容復(fù)制到desc中
// List list1 = new ArrayList();//錯(cuò)誤的實(shí)現(xiàn)方式
List list1 = Arrays.asList(new Object[list.size()]);
Collections.copy(list1, list);
System.out.println(list1);
//boolean replaceAll(List list,object oldVal ,object newVal)
//使用新值替換List舊值
//線程安全的 該方法可使將指定集合包裝成線程同步的集合,從而可以解決多線程并發(fā)訪問集合時(shí)
//的線程安全問題
List list2 = Collections.synchronizedList(list);
System.out.println(list2);
}