集合概述
java集合就像一個容器,這些對象可以是任意的數據類型,且長度可變。集合按照其存儲結構可以分爲兩大類,即單列集合Collection,和雙列集合Map。
這兩種集合特點如下:
(1)Collection:單列集合接口,用於存儲一系列元素。
Collection集合有兩個重要的子接口,分別是List和Set。其中List集合的特點是元素有序,可重複;Set集合的特點是元素無序並且不可重複。List接口的主要實現類有ArrayList和ListedList;Set接口的主要實現類有HashSet和TreeSet。
(2)Map:雙列集合的根接口,用於存儲具有鍵(Key),值(Value)映射關係的元素。
Map集合中每個元素都包含一對鍵值,並且Key是唯一的,在使用Map集合時可以通過指的Key找到對應的Value。Map接口的主要實現類有HashMap和TreeMap。
List接口
List接口繼承於Collection接口,在List集合中允許出現重複的元素,在程序中可以通過索引來訪問集合中的指定元素,另外List集合還有一個特點就是存取有序。
ArrayList集合
ArrayList內部封裝了一個長度可變的數組對象(初始容量爲8,按1.5倍擴容),在ArrayList中進行增刪改查效率會比較低,但是在遍歷和查找元素時顯得非常高效。
LinkedList集合
爲了克服ArrayList增刪效率低的問題,可以用LinkedList,該集合內有一個雙向循環鏈表,增刪效率較高。
Collection集合遍歷
Iterator遍歷集合
Iterator對象被稱爲迭代器,用來訪問Collection中的元素。在使用迭代器對集合元素迭代是,如果調用了remove的方法去刪除元素,,會出現異常。原因是集合中刪除元素會導致迭代器語氣的迭代次數發生改變,導致迭代器的結果不準確。
public class Test1 {
public static void main(String[] args) {
// 創建ArrayList對象
ArrayList list = new ArrayList();
// 添加元素
list.add("data_1");
list.add("data_2");
list.add("data_3");
Iterator iterator = list.iterator();
while (iterator.hasNext()){
//hasNext()判斷集合中是否存在下一個元素
Object object = iterator.next();
//如果存在,則調用next()將其取出,否則說明已經到達了集合末尾,停止遍歷
System.out.println(object);
}
}
}
//輸出結果爲
data_1
data_2
data_3
foreach遍歷集合
foreach是一種簡介的for循環,也被稱爲增強for循環。foreach循環用於遍歷數組或集合中的元素,具體語法格式如下
for( 容器中的元素類型 臨時變量 : 容器變量 ){
//執行語句
}
public class Test1 {
public static void main(String[] args) {
// 創建ArrayList對象
ArrayList list = new ArrayList();
// 添加元素
list.add("data_1");
list.add("data_2");
list.add("data_3");
for (Object object : list) {
System.out.println(object);
}
}
}
foreach也存在侷限性,當時用foreach循環時,不能對集合中元素進行修改。
JDK8的forEach遍歷集合
在JDK8中,根據Lambda表達式的特性還增加了一個forEach方法來遍歷集合,演示如下
public class Test1 {
public static void main(String[] args) {
// 創建ArrayList對象
ArrayList list = new ArrayList();
// 添加元素
list.add("data_1");
list.add("data_2");
list.add("data_3");
list.forEach(obj-> System.out.println("迭代器集合元素"+obj));
}
}
//輸出結果爲
迭代器集合元素data_1
迭代器集合元素data_2
迭代器集合元素data_3
Set接口
Set接口簡介
Set接口中的元素無序,並且保證存入的元素不會重複。Set接口主要有兩個實現類,分別是HashSet和TreeSet,其中HashSet是根據對象的哈希值來確定元素集合中的存儲位置,因此具有良好的存取和查找性能。TreeSet則以二叉樹的方式來存儲元素,它可以實現對集合中的元素排序。
HashSet集合
HashSet是set接口的一個實現類,它所存儲的元素是不可重複的,並且元素都是無序的。當想HashSet集合中添加元素時,首先會調用hashcode方法來確定元素的存儲位置,然後再調用元素對象的equals()方法來確保該位置沒有重複元素。
public class Test1 {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add("Jack");
hashSet.add("Rose");
hashSet.add("Eve");
hashSet.add("Rose");
hashSet.forEach(obj-> System.out.println(obj));
}
}
//輸出結果爲
Eve
Rose
Jack
向集合中存入元素時,爲了保證HashSet正常工作,要求在存入對象是,需要重寫Object類中的hashCode()和equals()方法。上個例子將字符串存入HashSet時,String類已經默認重寫了hashCode的方法,但是有時候傳入自定義類型的對象存入HashSet,需要重寫方法。
package Demo01;
import java.util.ArrayList;
import java.util.*;
/**
* @author Dell
*/
public class Test1 {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add(new Student("2","zhang"));
hashSet.add(new Student("8","name"));
hashSet.add(new Student("4","jack"));
hashSet.add(new Student("6","row"));
hashSet.forEach();
}
}
class Student{
String id;
String name;
public Student(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString(){
return id+" "+name;
}
@Override
public int hashCode(){
return id.hashCode();
}
@Override
public boolean equals(Object object){
if(this == object){ //判斷是否是同一個對象
return true; //如果是,返回true
}
if(!(object instanceof Student)){ //判斷對象是爲Student類型
return false; //如果不是,返回false
}
Student student = (Student) object; //將對象強轉爲Student類型
boolean b = this.id.equals(student.id); //判斷id值是否相同
return b; //返回判斷結果
}
}
//輸出結果爲
[2 zhang, 4 jack, 6 row, 8 name]
TreeSet接口
TreeSet採用平衡二叉樹來存儲元素,這樣的結構可以保證TreeSet集合中沒有重複的元素,且可以排序。集合中的元素在進行比較時,都會調用compareTo()方法,該方法是Comparable定義的。在向TreeSet傳入自定義數據時,沒有實現Comparable接口。爲了解決這個問題java提供了兩種方法分別爲自然排序和定製排序。
//自然排序
package Demo01;
import java.util.ArrayList;
import java.util.*;
/**
* @author Dell
*/
public class Test1 {
public static void main(String[] args) {
TreeSet treeSet = new TreeSet();
treeSet.add(new Teacher("jack",18));
treeSet.add(new Teacher("rose",19));
treeSet.add(new Teacher("tom",19));
treeSet.add(new Teacher("rose",19));
System.out.println(treeSet);
}
}
// 定義Teacher類實現Comparable接口
class Teacher implements Comparable{
String name;
int age;
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString(){
return name +":"+age;
}
// 重寫Comparable接口的compareTo()的方法
@Override
public int compareTo(Object obj){
Teacher teacher = (Teacher) obj;
// 定義比較方式,先比較年齡,再比較名稱name
if(this.age- teacher.age>0){
return 1;
}
if(this.age- teacher.age==0){
return this.name.compareTo(teacher.name);
}
return -1;
}
}
//輸出結果爲
[jack:18, rose:19, tom:19]
Teacher類實現了Comparable接口,並重寫compareTo()方法。在compareTo()方法中,首先針對age值進行修改,根據比較結果返回-1和1,當age相同時,再對name進行比較。教師Teacher對象首先按照年齡升序排序,年齡相同時會按照姓名進行升序排序,並且TreeSet集合會將重複的元素去掉。
//定製排序
package Demo01;
import java.util.*;
/**
* @author Dell
*/
public class Test1 {
public static void main(String[] args) {
// 1.創建集合時,傳入Comparator接口實現定製排序規則
TreeSet treeSet = new TreeSet(new MyComparator());
treeSet.add("jack");
treeSet.add("hello");
treeSet.add("tom");
System.out.println(treeSet);
// 2.創建集合時,使用Lambda表達式定製排序規則
TreeSet treeSet1 = new TreeSet((obj1,obj2)->{
String s1 = (String) obj1;
String s2 = (String) obj2;
return s1.length() - s2.length();
});
treeSet1.add("jack");
treeSet1.add("tom");
treeSet1.add("hello");
System.out.println(treeSet1);
}
}
class MyComparator implements Comparator{
@Override
public int compare(Object obj1, Object obj2){ //定製排序方式
String str1 = (String) obj1;
String str2 = (String) obj2;
int temp = str1.length()-str2.length();
return temp;
}
}
Map接口
Map接口簡介
Map接口是一個雙列集合,它的每個元素都包含一個鍵對象Key和值對象Value,鍵和值對象之間存在一種對應關係,稱爲映射。Map中key和value可以是任意數據類型,並且鍵對象Key不允許重複,在訪問Map集合中的元素時,只要指定了Key,就能找到對應的Value。
HashMap集合
HashMap集合時Map接口的一個實現類,它用於存儲鍵值映射關係,該集合的鍵和值允許爲空,但鍵不能重複,且集合中的元素是無序的。
Map集合遍歷
Iterator迭代器遍歷Map集合
使用Iterator遍歷集合需要先將Map集合轉換爲Iterator接口對象,然後進行遍歷。由於Map集合中元素是有鍵值對構成的,所以使用Iterator遍歷,有兩種方法,即keySet()和entrySet()
keySet()方法需要將Map集合中所有的鍵對象轉換爲Set單列集合,接着將含鍵對象的Set集合轉換爲Iterator接口對象,然後遍歷Map集合中所有的鍵,再根據鍵獲取相應的值。
//該方法是keySet()方法
import java.util.*;
/**
* @author Dell
*/
public class Test1 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("3", "Jack");
map.put("1", "Rock");
map.put("2", "Tom");
Set keySet = map.keySet();//獲取鍵的集合
Iterator iterator = keySet.iterator();//迭代鍵的集合
while (iterator.hasNext()) {
Object key = map.keySet();
Object value = map.get(key);//獲取每個鍵所對應的值
System.out.println(key + ":" + value);
}
}
}
entrySet()方法將原有的Map集合中的鍵值對作爲一個整體返回Set集合,接着將包含鍵值對對象的Set集合轉換爲Iterator接口對象,然後獲取集合中的所有鍵值對映射關係,在從映射關係中取出鍵和值。
//該方法是entrySet()方法
package Demo01;
import java.util.*;
/**
* @author Dell
*/
public class Test1 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("3", "Jack");
map.put("1", "Rock");
map.put("2", "Tom");
Set entrySet = map.entrySet();
Iterator iterator = entrySet.iterator();//獲取Iterator對象
while (iterator.hasNext()){
Map.Entry entry = (Map.Entry)(iterator.next());//獲取集合中鍵值對映射關係
Object key = entry.getKey();//獲取Entry中的鍵
Object value = entry.getValue();//獲取Entry中的值
System.out.println(key + ":" + value);
}
}
}
使用forEach方法遍歷Map集合
public class Test1 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("3", "Jack");
map.put("1", "Rock");
map.put("2", "Tom");
map.forEach((key, value) -> System.out.println(key + ":" + value));
}
}
在map集合中還提供了一個values()的方法,通過這個方法,可以直接獲取Map中存儲所有值的Collection集合
public class Test1 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("3", "Jack");
map.put("1", "Rock");
map.put("2", "Tom");
Collection values = map.values();//獲取map集合中values值集合對象
values.forEach(v-> System.out.println(v));
}
}
使用LinkedHashMap集合保證元素添加順序
創建LinkedHashMap集合,可保證存取順序一致。
Properties集合
Properties集合是HashTable的子類,Properties主要用來存儲字符串類型的鍵和值。
在文件目錄中添加配置文件 文件名爲test.properties
下面來展示如何對properties配置文件進行讀取和寫入操作
Background = black
name = zhang
age = 19
package Demo01;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
public class Test1 {
public static void main(String[] args) throws Exception {
// 1.通過properties進行屬性文件讀取操作
Properties pps = new Properties();
// 加載要讀取的文件test.properties
pps.load(new FileInputStream("test.properties"));
// 遍歷test.properties鍵值對元素信息
pps.forEach((k,v)-> System.out.println(k +":"+ v));
// 2.通過properties進行屬性文件寫入操作
// 指定要寫入操作的文件名稱和位置
FileOutputStream out = new FileOutputStream("test.properties");
// 向properties類文件進行希爾鍵值對信息
pps.setProperty("charset","UTF-8");
// 將此properties集合中新增的鍵值對信息寫入配置文件中
pps.store(out,"新增charset編碼");
}
}
//第一次輸出結果爲
background:black
name:zhang
age:19
//第二次輸出結果爲
charset:UTF-8
background:black
name:zhang
age:19
最後
在文章的最後作者爲大家整理了很多資料!包括java核心知識點+全套架構師學習資料和視頻+一線大廠面試寶典+面試簡歷模板+阿里美團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring源碼合集+Java架構實戰電子書等等!
有需要的朋友關注公衆號:前程有光,自行下載即可!