亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JAVA中常用的數(shù)據(jù)結(jié)構(gòu)和XML使用解析

 更新時(shí)間:2025年04月19日 16:25:06   作者:愛(ài)吃牛肉的大老虎  
這篇文章主要介紹了JAVA中常用的數(shù)據(jù)結(jié)構(gòu)和XML使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)

1.1 數(shù)組(Array)

  • 在程序設(shè)計(jì)中,為了處理方便,把具有相同類型的若干變量按有序的形式組織起來(lái)。這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。
  • 在C語(yǔ)言中,數(shù)組屬于構(gòu)造數(shù)據(jù)類型。一個(gè)數(shù)組可以分解為多個(gè)數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構(gòu)造類型。
  • 因此按數(shù)組元素的類型不同,數(shù)組又可分為 數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組 等各種類別

1.2 棧(Stack)

  • 棧是只能在某一端插入和刪除的特殊線性表。
  • 它按照先進(jìn)后出的原則存儲(chǔ)數(shù)據(jù),先進(jìn)入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時(shí)候從棧頂開始彈出數(shù)據(jù)(最后一個(gè)數(shù)據(jù)被第一個(gè)讀出來(lái))

1.3 對(duì)列(Queue)

  • 一種特殊的線性表,它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作。
  • 進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為對(duì)頭。
  • 隊(duì)列中沒(méi)有元素時(shí),稱為空隊(duì)列

1.4 鏈表(Linked List)

  • 一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的
  • 鏈表由一系列結(jié)點(diǎn)(鏈表中的每一個(gè)元素稱為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。每個(gè)結(jié)點(diǎn)包括兩個(gè)部分:
  • 一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域

1.5 樹(Tree)

樹是包含n(n>0)個(gè)結(jié)點(diǎn)的有窮集合K,且在K中定義了一個(gè)關(guān)系N,N滿足以下條件:

  • 有且僅有一個(gè)結(jié)點(diǎn)K0,它對(duì)于關(guān)系N來(lái)說(shuō)沒(méi)有前驅(qū),稱K0為樹的根結(jié)點(diǎn),簡(jiǎn)稱為根(root
  • 除K0外,K中的每個(gè)結(jié)點(diǎn),對(duì)于關(guān)系N來(lái)說(shuō)有且僅有一個(gè)前驅(qū)
  • K中各結(jié)點(diǎn),對(duì)關(guān)系N來(lái)說(shuō)可以有m個(gè)后繼(m>=0

1.6 堆(Heap)

  • 在計(jì)算機(jī)科學(xué)中,堆是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都有一個(gè)值。
  • 通常我們所說(shuō)的對(duì)的數(shù)據(jù)結(jié)構(gòu),是指二叉堆。
  • 堆的特點(diǎn)是根結(jié)點(diǎn)的值最?。ɑ蜃畲螅腋Y(jié)點(diǎn)的兩個(gè)子樹也是一個(gè)堆

1.7 圖(Graph)

  • 圖是由結(jié)點(diǎn)的有窮集合V和邊的集合E組成。
  • 其中,為了與樹形結(jié)構(gòu)加以區(qū)別,在圖結(jié)構(gòu)中常常將結(jié)點(diǎn)稱為頂點(diǎn),邊是頂點(diǎn)的有序偶對(duì),若兩個(gè)頂點(diǎn)之間存在一條邊,就表示這兩個(gè)頂點(diǎn)具有相鄰關(guān)系

1.8 散列表(Hash)

  • 若結(jié)構(gòu)中存在關(guān)鍵字和K相等的記錄,則必定在f(K)的存儲(chǔ)位置上。
  • 由此,不需比較便可直接取得所查詢的記錄,稱這個(gè)對(duì)應(yīng)關(guān)系f為散列函數(shù)(Hash function),按這個(gè)思想建立的表為散列表

2 XML解析

2.1 簡(jiǎn)介

XML,一種可擴(kuò)展標(biāo)記語(yǔ)言,通常被開發(fā)人員用來(lái)傳輸和存儲(chǔ)數(shù)據(jù),定義也比較簡(jiǎn)單,通常如下方式開頭,用來(lái)表述文檔的一些信息

經(jīng)過(guò)整理,通過(guò) Java 程序解析 XML 文件,目前比較主流的有以下四種方式:

  • DOM 解析
  • SAX 解析
  • JDOM 解析
  • DOM4J 解析

下面我們以如下的 XML 文件為例,分別介紹每種方式的解析實(shí)現(xiàn)。

<?xml version="1.0" encoding="utf-8" ?>
<class>
    <student id="1">
        <name>張三</name>
        <gender>男</gender>
        <age>26</age>
    </student>
    <student id="2">
        <name>里斯</name>
        <gender>男</gender>
        <age>36</age>
    </student>
 <student id="3">
        <name>王五</name>
        <gender>女</gender>
        <age>24</age>
    </student>
</class>

2.2 DOM解析

DOM 的全稱是:Document Object Model,是 Java 中最早支持的一種 XML 解析方式,可以不用依賴任何第三方包,通過(guò) JDK 提供的 w3c 包里面的 api,即可實(shí)現(xiàn)快速解析,代碼編程簡(jiǎn)單。

XML文檔的已解析版本定義了一組接口。解析器讀入整個(gè)文檔,然后構(gòu)建一個(gè)駐留內(nèi)存的樹結(jié)構(gòu),然后代碼就可以使用DOM接口來(lái)操作這個(gè)樹結(jié)構(gòu)

  • 優(yōu)點(diǎn):整個(gè)文檔樹在內(nèi)存中,便于操作,支持刪除、修改、重新排列等多種功能
  • 缺點(diǎn):將整個(gè)文檔調(diào)入內(nèi)存中(包括無(wú)用的節(jié)點(diǎn)),浪費(fèi)時(shí)間和空間
  • 使用場(chǎng)合:一旦解析了文檔還需多次訪問(wèn)這些數(shù)據(jù),硬件資源充足(內(nèi)存、CPU

實(shí)現(xiàn)過(guò)程如下:

import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;

public class DomDemo {
    
    public static void main(String[] args) {
        // 1.獲取xml文件流
        InputStream inputStream = DomDemo.class.getClassLoader().getResourceAsStream("demo.xml");
        // 2.創(chuàng)建DocumentBuilderFactory對(duì)象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 3.創(chuàng)建DocumentBuilder對(duì)象
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document d = builder.parse(inputStream);
            NodeList stdList = d.getElementsByTagName("student");
            for (int i = 0; i <stdList.getLength() ; i++) {
                Node std = stdList.item(i);
                // 遍歷標(biāo)簽屬性
                NamedNodeMap attrs = std.getAttributes();
                for(int j=0; j< attrs.getLength(); j++){
                    Node attr = attrs.item(j);
                    System.out.println(attr.getNodeName()+":"+attr.getNodeValue());
                }
                // 遍歷標(biāo)簽子節(jié)點(diǎn)
                NodeList childNodes = std.getChildNodes();
                for (int k = 0; k <childNodes.getLength() ; k++) {
                    if (childNodes.item(k).getNodeType()== Node.ELEMENT_NODE) {
                        System.out.println(childNodes.item(k).getNodeName() + ":" + childNodes.item(k).getTextContent());
                    }
                }
                System.out.println("==============");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


運(yùn)行結(jié)果如下:
id:1
name:張三
gender:男
age:26
==============
id:2
name:里斯
gender:男
age:36
==============
id:3
name:王五
gender:女
age:24
==============

2.3 SAX解析

SAX 的全稱是:Simple API for XML,也是 JDK 提供的另一種 XML 解析方式。

相比于 DOM,SAX 每次解析只在內(nèi)存中加載 XML 文件的一小部分,即使針對(duì)較大的 XML 文件,它也不需要占用太多的內(nèi)存,也不會(huì)存在內(nèi)存溢出的問(wèn)題。

優(yōu)點(diǎn)如下:

  • 采用事件驅(qū)動(dòng)模式一段一段的來(lái)解析數(shù)據(jù),占用內(nèi)存小
  • 只在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),不需要保存在內(nèi)存中
  • 效率和性能較高,能解析大于系統(tǒng)內(nèi)存的文檔
  • SAX解析器代碼比DOM解析器代碼小

當(dāng)然也有缺點(diǎn):

  • 與 DOM 解析器相比,使用 SAX 解析器讀取 XML 文件時(shí),解析邏輯比較復(fù)雜
  • 同時(shí)無(wú)法定位文檔層次,很難同時(shí)訪問(wèn)同一文檔的不同部分?jǐn)?shù)據(jù),不支持 XPath
  • 不是持久的,事件過(guò)后若沒(méi)保存數(shù)據(jù),那么數(shù)據(jù)就丟了。無(wú)狀態(tài)性,從事件中只能得到文本,但不知該文本屬于哪個(gè)元素

使用場(chǎng)合:Applet,只需XML文檔的少量?jī)?nèi)容,很少回頭訪問(wèn),機(jī)器內(nèi)存少

實(shí)現(xiàn)過(guò)程如下:

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SAXDemoHandel extends DefaultHandler {

    private String value;

    private Map<String, String> student;

    private List<Map<String, String>> students = new ArrayList<>();

    public List<Map<String, String>> getStudents() {
        return students;
    }

    /**
     * xml 解析開始
     * @throws SAXException
     */
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        System.out.println("xml 解析開始");
    }

    /**
     * xml 解析結(jié)束
     * @throws SAXException
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("xml 解析結(jié)束");
    }

    /**
     * 解析 XML 元素開始
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        System.out.println("開始遍歷節(jié)點(diǎn):" +  qName);

        if (qName.equals("student")){
            student = new HashMap<>();
            for(int i=0; i<attributes.getLength();i++){
                student.put(attributes.getQName(i), attributes.getValue(i));
            }
        }
    }

    /**
     * 解析 XML 元素結(jié)束
     * @param uri
     * @param localName
     * @param qName
     * @throws SAXException
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        System.out.println("節(jié)點(diǎn)遍歷結(jié)束:" +  qName);

        if(qName.equals("student")){
            students.add(student);
            student = null;
        } else if(qName.equals("name") || qName.equals("gender") || qName.equals("age")){
            student.put(qName, value);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);

        // 獲取節(jié)點(diǎn)值數(shù)組
        value = new String(ch,start,length).trim();
        if (!value.equals("")) {
            System.out.println(value);
        }
    }
}
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

public class SAXDemo {

    public static void main(String[] args) throws Exception {
        // 1.獲取xml文件流
        InputStream inputStream = SAXDemo.class.getClassLoader().getResourceAsStream("demo.xml");
        // 2.獲取SAXParserFactory實(shí)例
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 3.獲取SAXparser實(shí)例
        SAXParser saxParser = factory.newSAXParser();
        // 4.創(chuàng)建Handel對(duì)象
        SAXDemoHandel handel = new SAXDemoHandel();
        // 5.解析XML文件
        saxParser.parse(inputStream, handel);
        // 6.獲取讀取結(jié)果
        List<Map<String, String>> students = handel.getStudents();
        for (Map<String, String> student : students) {
            System.out.println(student.toString());
        }
    }
}
運(yùn)行結(jié)果如下:

{gender=男, name=張三, id=1}
{gender=男, name=里斯, id=2}
{gender=女, name=王五, id=3}

2.4 JDOM解析

JDOMJava 生態(tài)中一個(gè)非常優(yōu)秀的 XML 開源文檔解析庫(kù),可以把它看成是 DOMSAX 的結(jié)合版,同時(shí)在設(shè)計(jì)上彌補(bǔ)了 DOM 及 SAX 在實(shí)際應(yīng)用當(dāng)中的不足之處。

優(yōu)點(diǎn)如下:

  • 基于樹的模型處理 XML 文件,數(shù)據(jù)會(huì)加載在內(nèi)存中
  • 沒(méi)有向下兼容的限制,因此比 DOM 簡(jiǎn)單
  • 速度快,缺陷少
  • 具有 SAX 的解析特征
  • API 比 DOM 更容易理解
  • 20-80原則,極大地減少了代碼量

當(dāng)然也有缺點(diǎn):

  • 能處理大于內(nèi)存的 XML 文檔
  • 不支持與 DOM 中相應(yīng)遍歷包

使用場(chǎng)合:要實(shí)現(xiàn)的功能簡(jiǎn)單,如解析、創(chuàng)建等,但在底層,JDOM還是使用SAX,DOM,Xanan文檔

pom依賴

<!--jdom -->
<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom</artifactId>
    <version>1.1.3</version>
</dependency>

實(shí)現(xiàn)過(guò)程如下:

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import java.io.InputStream;
import java.util.List;


public class JdomDemo {

    public static void main(String[] args) throws Exception {
        // 1.獲取xml文件流
        InputStream inputStream = JdomDemo.class.getClassLoader().getResourceAsStream("demo.xml");
        // 2.創(chuàng)建SAXBuilder對(duì)象
        SAXBuilder saxBuilder = new SAXBuilder();
        // 3.將輸入流加載到build中
        Document document = saxBuilder.build(inputStream);
        // 4.獲取根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        // 5.獲取子節(jié)點(diǎn)
        List<Element> children = rootElement.getChildren();
        for (Element child : children) {
            List<Attribute> attributes = child.getAttributes();
            // 遍歷標(biāo)簽屬性
            for (Attribute attr : attributes) {
                System.out.println(attr.getName()+":"+attr.getValue());
            }
            // 遍歷標(biāo)簽子節(jié)點(diǎn)
            List<Element> childrenList = child.getChildren();
            for (Element  o: childrenList) {
                System.out.println(o.getName() + ":" + o.getValue());
            }
            System.out.println("==============");
        }
    }
}
運(yùn)行結(jié)果如下:

id:1
name:張三
gender:男
age:26
==============
id:2
name:里斯
gender:男
age:36
==============
id:3
name:王五
gender:女
age:24
==============

2.5 DOM4J解析

DOM4J 也是 Java 生態(tài)中一款非常非常優(yōu)秀的 XML 開源文檔解析庫(kù),是 JDOM 的升級(jí)品。

最初,它是 JDOM 的一種分支,后來(lái)合并了許多超出基本 XML 文檔表示的功能,最后單獨(dú)作為一工具對(duì)外發(fā)布。

優(yōu)點(diǎn)如下:

  • 性能優(yōu)異,功能強(qiáng)大,極端易使用
  • 開發(fā)簡(jiǎn)便,同時(shí)也提供了一些提高性能的代替方法
  • 支持 XPath

唯一的缺點(diǎn):

  • API 過(guò)于復(fù)雜

pom依賴

 <!-- dom4j -->
 <dependency>
     <groupId>dom4j</groupId>
     <artifactId>dom4j</artifactId>
     <version>1.6.1</version>
</dependency>

實(shí)現(xiàn)過(guò)程如下:

public class Dom4jDemo {

    public static void main(String[] args) throws Exception {
        // 1.獲取xml文件流
        InputStream inputStream = Dom4jDemo.class.getClassLoader().getResourceAsStream("demo.xml");
        // 2.創(chuàng)建Reader對(duì)象
        SAXReader reader = new SAXReader();
        // 3.加載xml
        Document document = reader.read(inputStream);
        // 4.獲取根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        // 5.遍歷元素
        Iterator iterator = rootElement.elementIterator();
        while (iterator.hasNext()){
            Element stu = (Element) iterator.next();
            // 遍歷標(biāo)簽屬性
            List<Attribute> attributes = stu.attributes();
            for (Attribute attribute : attributes) {
                System.out.println(attribute.getName() + ":" + attribute.getValue());
            }

            // 遍歷標(biāo)簽子節(jié)點(diǎn)
            Iterator iterator1 = stu.elementIterator();
            while (iterator1.hasNext()){
                Element stuChild = (Element) iterator1.next();
                System.out.println(stuChild.getName()+":"+stuChild.getStringValue());
            }
            System.out.println("==============");
        }
    }
}
運(yùn)行結(jié)果如下:

id:1
name:張三
gender:男
age:26
==============
id:2
name:里斯
gender:男
age:36
==============
id:3
name:王五
gender:女
age:24
==============

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java對(duì)象轉(zhuǎn)json JsonFormat注解

    Java對(duì)象轉(zhuǎn)json JsonFormat注解

    這篇文章主要介紹了Java對(duì)象轉(zhuǎn)json JsonFormat注解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • JAVA Iterator 轉(zhuǎn)成 List 的操作

    JAVA Iterator 轉(zhuǎn)成 List 的操作

    這篇文章主要介紹了JAVA Iterator 轉(zhuǎn)成 List 的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Java發(fā)送郵件javax.mail的實(shí)現(xiàn)方法

    Java發(fā)送郵件javax.mail的實(shí)現(xiàn)方法

    這篇文章主要為大家介紹了Java發(fā)送郵件javax.mail的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,代碼都有詳細(xì)的注釋,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 基于IDEA,Eclipse搭建Spring Boot項(xiàng)目過(guò)程圖解

    基于IDEA,Eclipse搭建Spring Boot項(xiàng)目過(guò)程圖解

    這篇文章主要介紹了基于IDEA,Eclipse搭建Spring Boot項(xiàng)目過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java?安全?ysoserial?CommonsCollections6?分析

    java?安全?ysoserial?CommonsCollections6?分析

    這篇文章主要介紹了java?安全?ysoserial?CommonsCollections6示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • java代碼如何讀取bootstrap.yml配置信息

    java代碼如何讀取bootstrap.yml配置信息

    這篇文章主要介紹了java代碼如何讀取bootstrap.yml配置信息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • spring源碼閱讀--aop實(shí)現(xiàn)原理講解

    spring源碼閱讀--aop實(shí)現(xiàn)原理講解

    這篇文章主要介紹了spring源碼閱讀--aop實(shí)現(xiàn)原理講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • idea中如何集成http請(qǐng)求

    idea中如何集成http請(qǐng)求

    這篇文章主要介紹了idea中如何集成http請(qǐng)求問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Java Web會(huì)話技術(shù)Session的簡(jiǎn)單使用

    Java Web會(huì)話技術(shù)Session的簡(jiǎn)單使用

    在請(qǐng)求需要傳遞的信息比較多,使用Cookie技術(shù)就會(huì)增大請(qǐng)求的難度。而Session可以存儲(chǔ)對(duì)象、數(shù)組等信息,并且Session是存儲(chǔ)到服務(wù)器端的,在客戶端請(qǐng)求時(shí)只需要將session id一并攜帶給服務(wù)器端。本文將簡(jiǎn)單的介紹如何使用Session
    2021-05-05
  • Maven項(xiàng)目打包成war包部署到Tomcat的方法

    Maven項(xiàng)目打包成war包部署到Tomcat的方法

    這篇文章主要介紹了Maven項(xiàng)目打包成war包部署到Tomcat的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論