尚學堂-Day015

  • 容器
    • Collection
    • List
    • Set
    • Map

一、容器概念

數組是相同數據類型的有序集合,可以在其中放置對象或基本數據類型。數組是一種簡單的線性序列,可以快速的訪問數組元素,效率高。

但是數組有一個問題,那就是一旦長度確定就不能改變,因此不靈活。所以出現了容器(數組也是一種容器),容器的長度可以隨着元素的個數增加或減少。

  • Collection接口是一組允許重複的對象
    • List接口繼承Collection,有序允許重複,以元素安插的次序來放置元素,不會重新排序。
    • Set接口繼承Collection,無序不允許重複,使用自己內部的一個排列機制。
  • Map接口時一組成對的鍵值對象。Map中不能有重複的Key,擁有自己的內部排列機制
  • 元素中的元素類型都爲引用類型,不能放置原生數據類型(自動裝箱),使用泛型保留類型

二、Collection接口

該接口有兩個子接口:

  • List中的數據有順序,可重複

  • Set中的數組沒有順序,不可重複

1、常用方法

方法 返回值 作用
add(E e) boolean 添加元素
size() int 返回容器大小
contains(Object o) boolean 包含(引用類型重寫equals)
isEmpty() boolean 容器是否爲空
equals(Object o) boolean 刪除元素(重寫equals)
clear() void 清空容器
toArray() Object[] 所有元素存放數組中
toArray(T[] a) <T>T[] 所有元素存放數組中(泛型)
retainAll(Collection c) boolean 求兩個容器的交集
iterator() Iterator 遍歷

2、<>泛型

在運行時才確定類型

泛型的好處

  • 增強程序的可讀性和穩定性
  • 使用泛型,保留了容器中元素的類型,安全省心的使用容器。注意:沒必要引用泛型的複雜性。

3、stream流

JDK8之後添加了一個新的抽象稱爲流stream

Collection中提供了一個stream()方法,用來獲取集合的流

三、List接口

List接口,位置有序允許元素重複。多了一些關於位置(順序)的方法

1、ArrayList

ArrayList 是 List 的子類,它和 HashSet 想法,允許存放重複元素,因此有序。集合中元 素被訪問的順序取決於集合的類型。如果對 ArrayList 進行訪問,迭代器將從索引 0 開始, 每迭代一次,索引值加 1。然而,如果訪問HashSet 中的元素,每個元素將會按照某種隨機 的次序出 現。雖然可以確定在迭代過程中能夠遍歷到集合中的所有元素,但卻無法預知元 素被訪問的次序。

1.1、構建方式

List<String> list = new ArrayList<>();
ArrayList<String> list1 = new ArrayList<>();

1.2、常用方法

List<String> list = new ArrayList<>();
list.add("張三");				// 添加元素
list.add("李四");				// 添加元素
list.add("王二");				// 添加元素
list.add("麻子");				// 添加元素
list.add(0,"啊哈哈");			// 指定位置添加元素
System.out.println(list.get(0));	// 獲取指定位置的元素
System.out.println(list.indexOf("張三"));		// 元素第一次出現的位置
System.out.println(list.lastIndexOf("張三"));		// 元素最後第一次出現的位置
System.out.println(list.set(1, "張三三"));	// 修改指定位置的元素,並返回修改前的元素
System.out.println(list.remove(1));			// 刪除指定位置的元素,並返回刪除前的元素
List<String> lists = list.subList(1, 3);	// 獲取子集合
System.out.println(lists);
System.out.println(list.contains("張三"));	// 是否存在某個元素
運行結果
啊哈哈
1
1
張三
張三三
[李四, 王二]
false

1.3、List集合遍歷

List<String> list = new ArrayList<>();
list.add("張三");
list.add("李四");	
list.add("王二");	
list.add("麻子");	
list.add(0,"啊哈哈");

// 方式一
for(int i=0;i<list.size();i++) {
    System.out.print(list.get(i)+"\t");
}
System.out.println();
// 方式二
for(String str:list) {
    System.out.print(str+"\t");
}
System.out.println();
// 方式三
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    System.out.print(it.next()+"\t");
}
System.out.println();
// 方式四
list.stream().forEach((x)->System.out.print(x+"\t"));
運行結果
啊哈哈 張三 李四 王二 麻子
啊哈哈 張三 李四 王二 麻子
啊哈哈 張三 李四 王二 麻子
啊哈哈 張三 李四 王二 麻子

2、LinkedList

2.1、構建方式

	List<String> list = new LinkedList<>();
	LinkedList<String> list1 = new LinkedList<>();

2.2、常用方法

List<String> list = new LinkedList<>();
list.add("張三");				// 添加元素
list.add("李四");				// 添加元素
list.add("王二");				// 添加元素
list.add("麻子");				// 添加元素
list.add(0,"啊哈哈");			// 指定位置添加元素
System.out.println(list.get(0));	// 獲取指定位置的元素
System.out.println(list.indexOf("張三"));		// 元素第一次出現的位置
System.out.println(list.lastIndexOf("張三"));		// 元素最後第一次出現的位置
System.out.println(list.set(1, "張三三"));	// 修改指定位置的元素,並返回修改前的元素
System.out.println(list.remove(1));			// 刪除指定位置的元素,並返回刪除前的元素
List<String> lists = list.subList(1, 3);	// 獲取子集合
System.out.println(lists);
System.out.println(list.contains("張三"));	// 是否存在某個元素
運行結果
啊哈哈
1
1
張三
張三三
[李四, 王二]
false

2.3、遍歷

List<String> list = new LinkedList<>();
list.add("張三");
list.add("李四");	
list.add("王二");	
list.add("麻子");	
list.add(0,"啊哈哈");

// 方式一
for(int i=0;i<list.size();i++) {
    System.out.print(list.get(i)+"\t");
}
System.out.println();
// 方式二
for(String str:list) {
    System.out.print(str+"\t");
}
System.out.println();
// 方式三
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    System.out.print(it.next()+"\t");
}
System.out.println();
// 方式四
list.stream().forEach((x)->System.out.print(x+"\t"));
運行結果
啊哈哈 張三 李四 王二 麻子
啊哈哈 張三 李四 王二 麻子
啊哈哈 張三 李四 王二 麻子
啊哈哈 張三 李四 王二 麻子

3、LIst集合中存放自定義類型

public class Person {
	private String name;
	public Person() {
		
	}
	Person(String name){
		this.name = name;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		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;
		Person other = (Person) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}	
}
public class Test4 {
	public static void main(String[] args) {
		List<Person> list = new ArrayList<>();
		list.add(new Person("張三"));
		list.add(new Person("李四"));
	}
}

自定義的類需要重寫hashCode()和equals()方法

四、Set接口

HashSet是 Set 接口的一個子類,主要的特點是:裏面不能存放重複元素,而且採用散 列的存儲方法,所以沒有順序。這裏所說的沒有順序是指:元素插入的順序與輸出的順序不 一致。 使用重寫 equals 和 hashcode 來實現自定義的類型的去重。

1、構建方式

Set<Integer> set = new HashSet<Integer>();

2、特點

public static void main(String[] args) {
	Set<Integer> set = new HashSet<Integer>();
	set.add(3);
	set.add(9);
	set.add(6);
	set.add(1);
	set.add(2);
	set.add(4);
	set.add(4);
	System.out.println(set);
}
運行結果
[1, 2, 3, 4, 6, 9]

set集合是無序的,且不能重複

3、常用方法

	Set<Integer> set = new HashSet<Integer>();
	set.add(3);
	set.add(9);
	set.add(6);
	set.add(1);
	set.add(2);
	set.add(4);
	set.add(4);
	set.remove(4);	// 刪除元素
	System.out.println(set);
	System.out.println(set.contains(4));	// 是否存在元素
	System.out.println(set.size());			// 集合長度
	set.clear();		// 清空集合

4、遍歷

	Set<Integer> set = new HashSet<Integer>();
	set.add(3);
	set.add(9);
	set.add(6);
	set.add(1);
	set.add(2);
	set.add(4);
	set.add(4);
	
	// 方式一
	for(int i:set) {
		System.out.print(i+"\t");
	}
	System.out.println();
	// 方式二
	Iterator<Integer> i = set.iterator();
	while(i.hasNext()) {
		System.out.print(i.next()+"\t");
	}
	System.out.println();
	// 方式三
	set.stream().forEach((x)->System.out.print(x+"\t"));
運行結果
1 2 3 4 6 9
1 2 3 4 6 9
1 2 3 4 6 9

5、存放自定義類型

public static void main(String[] args) {
    Set<Person> set = new HashSet<Person>();
    set.add(new Person("張三"));
    set.add(new Person("李四"));
}

五、Map接口

實現Map接口的類用來存儲鍵(key)-值(value) 對。

Map 接口的實現類有HashMap和TreeMap等。

Map類中存儲的鍵-值對通過鍵來標識,所以鍵值不能重複。

HashMap: 線程不安全,效率高. 允許key或value爲null

**HashTable:**線程安全,效率低. 不允許key或value爲null

Properties: HashTable的子類,key和value都是string

1、構建方式

Map<String,String> map = new HashMap<>();

2、常用方法

		Map<String,String> map = new HashMap<>();
		map.put("a", "張三");		// 添加鍵值對
		map.put("b", "李四");
		System.out.println(map);
		map.remove("a");		// 通過key刪除鍵值對
		System.out.println(map.get("b"));	// 通過key獲取value值
運行結果
{a=張三, b=李四}
李四

3、遍歷

Map<String,String> map = new HashMap<>();
map.put(“a”, “AA”);
map.put(“b”, “BB”);
map.put(“c”, “CC”);
map.put(“d”, “DD”);
map.put(“e”, “EE”);
map.put(“f”, “FF”);

	// 方式一
	Set<String> set = map.keySet();		// 和set一樣
	for(String str:set) {
		System.out.print(map.get(str)+"\t");
	}
	System.out.println();
	// 方式二
	Collection<String> values = map.values();	// 另外兩小種:iterator()、stream()
	for(String str:values) {
		System.out.print(str+"\t");
	}
	System.out.println();
	// 方式三
	Set<Entry<String, String>> set1 = map.entrySet();
	for(Entry<String, String> s:set1) {
		System.out.println(s.getKey()+"--->"+s.getValue());
	}
運行結果
AA BB CC DD EE FF
AA BB CC DD EE FF
a—>AA
b—>BB
c—>CC
d—>DD
e—>EE
f—>FF

4、Properties

Properties爲Hashtable的子類,要求鍵與值只能爲字符串 ,不能爲null,長與 配置文件(與外界交互 的信息) 即內存與存儲介質(文件、數據庫、網絡、服務器內存等)交互。

userName=root
userPwd=123456
user=\u554A\u54C8\u54C8
public class Demo004 {
	public static void main(String[] args) throws IOException {
		Properties pro = new Properties();
		pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
		System.out.println(pro.get("userName"));
		System.out.println(pro.get("userPwd"));
		System.out.println(pro.get("user"));
	}
}
運行結果
root
123456
啊哈哈
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章