集合
集合概述
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277765.html
標籤:其他
上一篇:JAVA初窺-DAY13
