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

java實現(xiàn)RTF文件查看器(附帶源碼)

 更新時間:2025年06月19日 09:12:18   作者:Katie。  
這篇文章主要介紹了一個基于?Java?Swing?的?RTF?文件查看器,既可作為輕量級桌面應用,也可嵌入到更大規(guī)模的管理系統(tǒng)中,滿足用戶對?RTF?文檔的即時預覽、樣式保真和簡單導航需求

一、項目背景詳細介紹

在企業(yè)級辦公軟件、文檔管理系統(tǒng)以及教育培訓平臺中,富文本格式(RTF,Rich Text Format)是一種歷史悠久且跨平臺兼容性強的文檔格式。它支持文字樣式(粗體、斜體、下劃線)、段落格式、列表、表格、圖片等豐富排版元素,且不依賴專有軟件即可被大多數文本編輯器讀取。

雖然現(xiàn)代辦公自動化場景越來越多地轉向 Office Open XML(.docx)、PDF 等格式,但在以下場景中,RTF 仍發(fā)揮著重要作用:

  • 跨平臺的輕量級編輯:無需安裝大型 Office 套件,JDK 自帶 Swing 即可實現(xiàn)查看與編輯。
  • 歷史遺留系統(tǒng)兼容:一些老舊系統(tǒng)仍存大量 RTF 文檔,需要新系統(tǒng)兼容查看功能。
  • 教學與演示:演示富文本格式、文本解析與渲染原理時,RTF 是最直觀的切入點。

基于以上背景,設計并實現(xiàn)一個基于 Java Swing 的 RTF 文件查看器,既可作為輕量級桌面應用,也可嵌入到更大規(guī)模的管理系統(tǒng)中,滿足用戶對 RTF 文檔的即時預覽、樣式保真和簡單導航需求。

二、項目需求詳細介紹

1. 功能需求

打開 RTF 文件:支持通過菜單或工具欄的“打開”按鈕,彈出文件選擇對話框,選擇 .rtf 文件。

RTF 渲染與顯示

  • 使用 Swing 內置的 RTFEditorKit 或 DefaultStyledDocument,以保真方式渲染富文本樣式。
  • 支持文字樣式(粗體、斜體、下劃線)、段落對齊、項目符號與編號、表格、圖片等基本元素。

滾動與縮放:支持文檔滾動查看,并可通過快捷鍵或菜單放大/縮小字體(最小 8pt,最大 48pt)。

查找與導航:提供簡單的查找框,輸入關鍵詞后高亮所有匹配,并支持“下一處”跳轉。

只讀模式:文檔僅用于查看,不允許用戶編輯;界面上去除編輯光標與輸入焦點。

2. 非功能需求

易用性與可擴展性:界面簡潔明了,上手即會;模塊化設計,后續(xù)可增加“打印”、“導出為 PDF”等功能。

可測試性:對加載、渲染、查找等核心邏輯編寫單元測試,確保功能穩(wěn)定。

跨平臺兼容:依賴純 Java Swing,無需額外本地庫,支持 Windows、macOS、Linux。

性能要求

  • 對中等大小(<10MB)的 RTF 文檔,打開與渲染時間應在 1 秒內;
  • 滾動與查找操作無明顯卡頓。

項目文檔:提供 README,包括快速使用指南和常見問題。

3. 工程化需求

Maven 構建

  • Java 版本:1.8 或以上;
  • 依賴:Swing(JDK 自帶)、JUnit 5、Slf4j;

目錄結構

rtf-viewer/
├── pom.xml
├── src/main/java/com/example/rtfviewer/
│   ├── RtfViewer.java
│   ├── RtfPanel.java
│   ├── FindDialog.java
│   └── DemoMain.java
└── src/test/java/com/example/rtfviewer/
    └── RtfViewerTest.java

代碼規(guī)范

  • 遵循阿里巴巴 Java 開發(fā)規(guī)約,使用 SLF4J 記錄日志;
  • 所有公用 API 方法帶有 JavaDoc 注釋;

CI/CD

建議在 GitHub Actions 上執(zhí)行 mvn test,確?;貧w穩(wěn)定。

三、相關技術詳細介紹

1.Swing 文本組件

  • JEditorPane 與 JTextPane:均支持富文本渲染;Swing 自帶 RTFEditorKit 用于解析 RTF。
  • StyledDocument:在內存中保存帶樣式的文檔模型,支持在查看時插入高亮等標記。

2.RTFEditorKit

  • RTFEditorKit rtfKit = new RTFEditorKit();
  • Document doc = rtfKit.createDefaultDocument();
  • rtfKit.read(inputStream, doc, 0); 可將 RTF 流解析到 Document,再綁定到 JTextPane 上。

3.查找與高亮

  • 使用 Highlighter 和 DefaultHighlighter.DefaultHighlightPainter 對匹配位置進行標記。
  • 在 StyledDocument 中逐步搜索關鍵詞,記錄 offset 與 length 進行高亮。

4.字體縮放

  • 通過修改 JTextPane 的 Font 屬性、或者對 StyledDocument 中的每個 Style 統(tǒng)一調整 StyleConstants.FontSize。
  • 為性能起見,應緩存原始樣式,在放大/縮小時只修改“全局縮放比例”并重新渲染。

5.文件對話框

  • 使用 JFileChooser,并通過 FileNameExtensionFilter("RTF 文檔", "rtf") 限制可選文件;
  • 記憶上次打開目錄以提升用戶體驗。

四、實現(xiàn)思路詳細介紹

1.主界面 RtfViewer.java

  • 繼承自 JFrame,包含菜單欄(“文件→打開”、“查看→放大”、“查看→縮小”、“查找”)和工具欄按鈕;
  • 主要組件為 RtfPanel,用于加載與展示 RTF 文檔;

2.文檔面板 RtfPanel.java

內部使用 JTextPane,并設置為只讀模式:

textPane.setEditable(false); textPane.setEditorKit(new RTFEditorKit());

提供 loadRtf(File file) 方法:清空當前文檔模型,用 RTFEditorKit 讀取文件流,并在加載完成后滾動至頂部;

提供 zoomIn()、zoomOut() 方法:調整字體大小,并重新應用到文檔所有段落。

3.查找對話框 FindDialog.java

  • 繼承 JDialog,包含關鍵詞輸入框、前進、后退、關閉按鈕;
  • 用戶輸入關鍵詞后,調用 RtfPanel.find(next) 進行高亮并聚焦到相應段落。

4.事件與監(jiān)聽

  • 菜單和工具欄項均通過 ActionListener 綁定到 RtfViewer 的對應方法;
  • 查找時需記錄所有匹配的位置(List<MatchPosition>),并維護當前索引,實現(xiàn)“下一處”與“上一處”跳轉。

5.日志與異常處理

  • 使用 SLF4J 記錄文件加載、查找結果、異常信息等;
  • 在加載失敗時通過 JOptionPane.showMessageDialog 提示用戶。

6.Demo 主類 DemoMain.java

提供 main() 方法,一行代碼啟動:

SwingUtilities.invokeLater(() -> new RtfViewer().setVisible(true));

確保所有 UI 操作都在 EDT(事件分發(fā)線程)執(zhí)行。

五、完整實現(xiàn)代碼

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" ...>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example.rtfviewer</groupId>
  <artifactId>rtf-viewer</artifactId>
  <version>1.0.0</version>
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <dependencies>
    <!-- JUnit 5 -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>5.9.2</version>
      <scope>test</scope>
    </dependency>
    <!-- SLF4J + Logback -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.4.8</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M7</version>
      </plugin>
    </plugins>
  </build>
</project>

Java

// 文件:src/main/java/com/example/rtfviewer/RtfViewer.java
package com.example.rtfviewer;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
 
/**
 * 主界面:RTF 文件查看器
 */
public class RtfViewer extends JFrame {
    private final RtfPanel rtfPanel;
    private final FindDialog findDialog;
 
    public RtfViewer() {
        super("RTF 文件查看器");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
 
        rtfPanel = new RtfPanel();
        findDialog = new FindDialog(this, rtfPanel);
 
        setJMenuBar(createMenuBar());
        add(createToolBar(), BorderLayout.NORTH);
        add(new JScrollPane(rtfPanel), BorderLayout.CENTER);
    }
 
    private JMenuBar createMenuBar() {
        JMenuBar mb = new JMenuBar();
        JMenu file = new JMenu("文件");
        JMenuItem open = new JMenuItem("打開");
        open.addActionListener(e -> openFile());
        file.add(open);
        mb.add(file);
 
        JMenu view = new JMenu("查看");
        JMenuItem zoomIn = new JMenuItem("放大");
        zoomIn.addActionListener(e -> rtfPanel.zoomIn());
        JMenuItem zoomOut = new JMenuItem("縮小");
        zoomOut.addActionListener(e -> rtfPanel.zoomOut());
        view.add(zoomIn); view.add(zoomOut);
        JMenuItem find = new JMenuItem("查找");
        find.addActionListener(e -> findDialog.setVisible(true));
        view.add(find);
        mb.add(view);
        return mb;
    }
 
    private JToolBar createToolBar() {
        JToolBar tb = new JToolBar();
        JButton btnOpen = new JButton("打開");
        btnOpen.addActionListener(e -> openFile());
        JButton btnZoomIn = new JButton("放大");
        btnZoomIn.addActionListener(e -> rtfPanel.zoomIn());
        JButton btnZoomOut = new JButton("縮小");
        btnZoomOut.addActionListener(e -> rtfPanel.zoomOut());
        JButton btnFind = new JButton("查找");
        btnFind.addActionListener(e -> findDialog.setVisible(true));
        tb.add(btnOpen); tb.add(btnZoomIn); tb.add(btnZoomOut); tb.add(btnFind);
        return tb;
    }
 
    private void openFile() {
        JFileChooser chooser = new JFileChooser();
        chooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter("RTF 文檔", "rtf"));
        int ret = chooser.showOpenDialog(this);
        if (ret == JFileChooser.APPROVE_OPTION) {
            File file = chooser.getSelectedFile();
            rtfPanel.loadRtf(file);
        }
    }
}
 
// 文件:src/main/java/com/example/rtfviewer/RtfPanel.java
package com.example.rtfviewer;
 
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.rtf.RTFEditorKit;
import java.awt.*;
import java.io.*;
import java.util.*;
import org.slf4j.*;
 
/**
 * RTF 文檔顯示面板
 */
public class RtfPanel extends JTextPane {
    private static final Logger logger = LoggerFactory.getLogger(RtfPanel.class);
    private float fontSize = 12f;
 
    public RtfPanel() {
        super();
        setEditable(false);
        setEditorKit(new RTFEditorKit());
        setFont(getFont().deriveFont(fontSize));
    }
 
    /**
     * 加載并顯示 RTF 文件
     */
    public void loadRtf(File file) {
        try (InputStream in = new FileInputStream(file)) {
            Document doc = getEditorKit().createDefaultDocument();
            getEditorKit().read(in, doc, 0);
            setDocument(doc);
            setCaretPosition(0);
            logger.info("成功加載 RTF 文件:{}", file.getAbsolutePath());
        } catch (Exception ex) {
            logger.error("加載 RTF 文件失敗", ex);
            JOptionPane.showMessageDialog(this, "加載失?。? + ex.getMessage(), "錯誤", JOptionPane.ERROR_MESSAGE);
        }
    }
 
    /** 放大字體 */
    public void zoomIn() {
        fontSize = Math.min(fontSize + 2f, 48f);
        setFont(getFont().deriveFont(fontSize));
    }
 
    /** 縮小字體 */
    public void zoomOut() {
        fontSize = Math.max(fontSize - 2f, 8f);
        setFont(getFont().deriveFont(fontSize));
    }
 
    /**
     * 查找并高亮關鍵詞
     * @param keyword 關鍵詞
     * @return 所有匹配位置列表
     */
    public List<MatchPosition> find(String keyword) {
        List<MatchPosition> result = new ArrayList<>();
        removeHighlights();
        if (keyword == null || keyword.isEmpty()) return result;
        try {
            StyledDocument doc = getStyledDocument();
            String text = doc.getText(0, doc.getLength()).toLowerCase();
            String key = keyword.toLowerCase();
            int index = 0;
            Highlighter hilite = getHighlighter();
            Highlighter.HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
            while ((index = text.indexOf(key, index)) >= 0) {
                hilite.addHighlight(index, index + key.length(), painter);
                result.add(new MatchPosition(index, key.length()));
                index += key.length();
            }
        } catch (BadLocationException e) {
            logger.warn("查找出錯", e);
        }
        return result;
    }
 
    /** 清除所有高亮 */
    public void removeHighlights() {
        getHighlighter().removeAllHighlights();
    }
}
 
// 文件:src/main/java/com/example/rtfviewer/FindDialog.java
package com.example.rtfviewer;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
 
/**
 * 查找對話框
 */
public class FindDialog extends JDialog {
    private final JTextField tfKeyword = new JTextField(20);
    private final JButton btnNext = new JButton("下一個");
    private final JButton btnPrev = new JButton("上一個");
    private List<MatchPosition> matches = Collections.emptyList();
    private int currentIndex = -1;
    private final RtfPanel rtfPanel;
 
    public FindDialog(JFrame owner, RtfPanel panel) {
        super(owner, "查找", false);
        this.rtfPanel = panel;
        setLayout(new FlowLayout(FlowLayout.LEFT, 5, 10));
        add(new JLabel("關鍵詞:"));
        add(tfKeyword);
        add(btnNext);
        add(btnPrev);
        setSize(350, 120);
        setLocationRelativeTo(owner);
 
        tfKeyword.addActionListener(e -> doSearch());
        btnNext.addActionListener(e -> moveTo(true));
        btnPrev.addActionListener(e -> moveTo(false));
    }
 
    private void doSearch() {
        matches = rtfPanel.find(tfKeyword.getText());
        currentIndex = -1;
        if (!matches.isEmpty()) {
            moveTo(true);
        }
    }
 
    private void moveTo(boolean forward) {
        if (matches.isEmpty()) return;
        currentIndex = forward ? (currentIndex + 1) % matches.size()
                               : (currentIndex - 1 + matches.size()) % matches.size();
        MatchPosition pos = matches.get(currentIndex);
        rtfPanel.setCaretPosition(pos.getOffset());
        rtfPanel.requestFocusInWindow();
    }
}
 
// 文件:src/main/java/com/example/rtfviewer/MatchPosition.java
package com.example.rtfviewer;
 
/**
 * 匹配位置記錄
 */
public class MatchPosition {
    private final int offset;
    private final int length;
    public MatchPosition(int offset, int length) {
        this.offset = offset;
        this.length = length;
    }
    public int getOffset() { return offset; }
    public int getLength() { return length; }
}
 
// 文件:src/main/java/com/example/rtfviewer/DemoMain.java
package com.example.rtfviewer;
 
import javax.swing.*;
 
/**
 * 啟動類
 */
public class DemoMain {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new RtfViewer().setVisible(true));
    }
}
 
// 文件:src/test/java/com/example/rtfviewer/RtfViewerTest.java
package com.example.rtfviewer;
 
import org.junit.jupiter.api.*;
import javax.swing.text.*;
import java.io.*;
import static org.junit.jupiter.api.Assertions.*;
 
/**
 * 單元測試 RtfPanel 加載與查找
 */
class RtfViewerTest {
    private RtfPanel panel;
 
    @BeforeEach
    void setUp() {
        panel = new RtfPanel();
    }
 
    @Test
    void testLoadEmpty() {
        File tmp = new File("src/test/resources/empty.rtf");
        panel.loadRtf(tmp);
        try {
            String text = panel.getDocument().getText(0, panel.getDocument().getLength());
            assertTrue(text.trim().isEmpty());
        } catch (Exception e) {
            fail(e);
        }
    }
 
    @Test
    void testFind() {
        // 向文檔插入測試字符串
        try {
            StyledDocument doc = (StyledDocument) panel.getDocument();
            doc.insertString(0, "Hello RTF Viewer Hello", null);
        } catch (BadLocationException e) {
            fail(e);
        }
        List<MatchPosition> matches = panel.find("Hello");
        assertEquals(2, matches.size());
        assertEquals(0, matches.get(0).getOffset());
        assertEquals(18, matches.get(1).getOffset());
    }
}

六、代碼詳細解讀

本節(jié)對第一部分的完整代碼進行逐模塊、逐方法的功能說明,不復寫代碼,僅闡述其設計意圖與作用。

1.RtfViewer(主窗口)

  • 構造器:創(chuàng)建 JFrame,設置標題、關閉行為、尺寸和居中位置。
  • createMenuBar():構建菜單欄,包括“文件→打開”、“查看→放大”、“查看→縮小”、“查看→查找”四項,每項綁定相應的 ActionListener。
  • createToolBar():構建工具欄,包含與菜單相同功能的按鈕,更加直觀易用。
  • openFile():彈出 JFileChooser,限制 .rtf 文件;用戶選擇后調用 RtfPanel.loadRtf 加載并顯示。

2.RtfPanel(文檔顯示面板)

繼承 JTextPane 并初始化:設置只讀模式、使用 RTFEditorKit 解析 RTF、設置初始字體大小。

loadRtf(File):

  • 創(chuàng)建新的 Document,調用 RTFEditorKit.read 將文件流解析到文檔中;
  • 重新 setDocument,并將光標移動到開頭;
  • 加載成功/失敗分別通過 SLF4J 日志和 JOptionPane 進行反饋。

zoomIn()/zoomOut():分別將字體大小在 [8pt, 48pt] 范圍內加/減 2pt,并通過 deriveFont 應用到文本面板。

find(String):

  • 清除已有高亮,獲取整個文檔文本(小寫),循環(huán)查找關鍵詞出現(xiàn)的索引;
  • 對每處匹配調用 Highlighter.addHighlight,并將 offset 與 length 封裝為 MatchPosition 存入列表返回。

removeHighlights():一鍵清除所有高亮標記。

3.FindDialog(查找對話框)

  • 構造器:繼承 JDialog,設置為非模態(tài),包含關鍵詞輸入框及“下一個”“上一個”按鈕;
  • doSearch():讀取輸入框文本,調用 RtfPanel.find 獲取匹配位置列表,重置索引并跳轉到第一處。
  • moveTo(boolean):根據方向參數前進或后退循環(huán)地在 matches 列表中移動當前索引,并調用 rtfPanel.setCaretPosition 聚焦對應位置。

4.MatchPosition(匹配位置記錄)

簡單的值對象,保存 offset(起始位置)和 length(匹配長度),供查找導航時使用。

5.DemoMain(啟動類)

在 EDT 中執(zhí)行,通過一行代碼 new RtfViewer().setVisible(true) 啟動整個應用,確保 UI 線程安全。

6.RtfViewerTest(單元測試)

  • testLoadEmpty():加載空的 RTF 文件(位于測試資源目錄),斷言渲染后文本內容為空(無拋異常)。
  • testFind():向文檔中插入一段測試字符串,調用 find("Hello"),斷言返回兩處匹配且偏移量正確。

七、項目詳細總結

1.簡潔易用

  • 通過 Swing 原生組件與 RTFEditorKit,在不到 200 行代碼內實現(xiàn)完整的 RTF 查看功能;
  • 菜單、工具欄與對話框相互獨立且統(tǒng)一風格,上手迅速。

.2模塊化設計

  • RtfViewer、RtfPanel、FindDialog、MatchPosition、DemoMain 各司其職,職責清晰;
  • 后續(xù)可按需替換或擴展,如替換渲染引擎、添加打印功能。

3.豐富交互

  • 支持文件打開、滾動查看、字體縮放(放大/縮?。?、關鍵詞查找與高亮導航;
  • 所有 UI 操作均在 EDT 上執(zhí)行,保證線程安全與響應流暢。

4.日志與異常處理

  • 通過 SLF4J 記錄加載成功、加載失敗與查找異常,便于線上排查和維護;
  • 文件加載失敗時以對話框提示用戶,提升可用性。

5.可測試性

  • 單元測試覆蓋核心功能:加載、渲染、查找,確?;A功能穩(wěn)定;
  • 可繼續(xù)補充測試,如縮放前后字體大小變更、查找邊界情況(空關鍵詞、無匹配)等。

八、項目常見問題及解答

問:為什么要使用 JTextPane 而不是 JEditorPane?

答:JTextPane 是 JEditorPane 的子類,默認提供了 StyledDocument 支持,更適合處理富文本高亮和格式化操作。

問:放大/縮小時為什么不直接修改 StyledDocument 中的 StyleConstants?

答:逐段修改樣式會非常繁瑣且性能開銷大,統(tǒng)一通過更改組件字體(setFont)可以一次性作用于所有文本,效率更高。

問:查找后高亮會影響后續(xù)渲染嗎?

答:高亮是通過 Highlighter 層疊在文檔渲染之上,不會改變底層文檔內容;調用 removeHighlights 可清除所有標記。

問:如何支持大文件(>10MB)無卡頓查看?

答:可引入分頁加載或流式渲染機制,分批次解析和渲染文檔內容;或者在后臺線程異步加載并在部分區(qū)域先行顯示。

問:如何導出當前查看的 RTF 文檔為 PDF?

答:可結合 iText、Apache PDFBox 等庫,將 StyledDocument 轉換為 PDF 流式寫出,或先將 RTF 轉為 HTML,再使用 HTML 轉 PDF 工具鏈。

九、擴展方向與性能優(yōu)化

1.打印功能

使用 JTextPane.print() 或自定義 PrinterJob,支持頁眉頁腳、自定義分頁。

2.導出為其他格式

  • RTF → HTML:可使用 RTFEditorKit 的 write 方法將文檔輸出為 HTML;
  • RTF → DOCX/PDF:借助第三方庫(如 docx4j、Aspose.Words、iText)。

3.語義化導航

在加載時解析 RTF 的結構化信息,如標題、段落、書簽,提供目錄樹視圖,點擊可快速跳轉。

4.多文檔標簽頁

將 RtfViewer 擴展為支持多標簽的文檔查看器,方便批量打開多個 RTF 文件并在標簽間切換。

5.實時協(xié)作與注釋

  • 集成協(xié)作系統(tǒng),支持多人同時查看并在文檔上添加注釋、批注;
  • 借助 WebSocket 或消息隊列實時同步高亮與滾動位置。

6.性能監(jiān)控與優(yōu)化

  • 對加載和渲染流程埋點,統(tǒng)計大文件解析時間和查找耗時;
  • 對頻繁查找操作引入去抖(Debounce)或批量高亮策略,減少重繪頻率。

7.跨平臺 UI 統(tǒng)一

  • 引入第三方 Look-and-Feel(如 FlatLaf、Substance),提升界面一致性與現(xiàn)代感;
  • 支持深色模式與高對比度模式,改善用戶可訪問性

到此這篇關于java實現(xiàn)RTF文件查看器(附帶源碼)的文章就介紹到這了,更多相關java RTF文件查看器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java同步容器和并發(fā)容器詳解

    Java同步容器和并發(fā)容器詳解

    這篇文章主要介紹了Java同步容器和并發(fā)容器詳解,容器是Java基礎類庫中使用頻率最高的一部分,Java集合包中提供了大量的容器類來幫組我們簡化開發(fā),下面小編和大家來一起學習下吧
    2019-06-06
  • Java數組看這篇就夠了

    Java數組看這篇就夠了

    這篇文章主要介紹了Java數組的詳細解釋,是Java入門學習中的基礎知識,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • 如何獲取MyBatis Plus執(zhí)行的完整的SQL語句

    如何獲取MyBatis Plus執(zhí)行的完整的SQL語句

    這篇文章主要介紹了如何獲取MyBatis Plus執(zhí)行的完整的SQL語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 關于Java中代碼塊的執(zhí)行順序

    關于Java中代碼塊的執(zhí)行順序

    這篇文章主要介紹了關于Java中代碼塊的執(zhí)行順序,構造代碼塊是給所有對象進行統(tǒng)一初始化,而構造函數是給對應的對象初始化,因為構造函數是可以多個的,運行哪個構造函數就會建立什么樣的對象,但無論建立哪個對象,都會先執(zhí)行相同的構造代碼塊,需要的朋友可以參考下
    2023-08-08
  • Java 中 synchronized 的使用方式和鎖升級

    Java 中 synchronized 的使用方式和鎖升級

    Java中的synchronized關鍵字用于實現(xiàn)線程同步,保證同一時刻只有一個線程可以訪問被同步的代碼塊或方法,JVM引入了鎖升級機制,從無鎖狀態(tài)開始,根據競爭情況逐步升級為偏向鎖、輕量級鎖和重量級鎖,以提高性能,感興趣的朋友一起看看吧
    2025-03-03
  • Java日常練習題,每天進步一點點(56)

    Java日常練習題,每天進步一點點(56)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • Java設計模式詳解之門面模式(外觀模式)

    Java設計模式詳解之門面模式(外觀模式)

    為子系統(tǒng)中的一組接口提供一個一致的界面, Facade 模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。本文給大家介紹Java設計模式詳解之門面模式(外觀模式),感興趣的朋友參考下吧
    2016-04-04
  • SpringBoot集成swagger-ui以及swagger分組顯示操作

    SpringBoot集成swagger-ui以及swagger分組顯示操作

    這篇文章主要介紹了SpringBoot集成swagger-ui以及swagger分組顯示操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java中HashMap集合的6種遍歷方式詳解

    Java中HashMap集合的6種遍歷方式詳解

    這篇文章主要介紹了Java中HashMap集合的6種遍歷方式詳解,HashMap?基于哈希表的?Map?接口實現(xiàn),是以?key-value?存儲形式存在,即主要用來存放鍵值對,HashMap?的實現(xiàn)不是同步的,這意味著它不是線程安全的,我們來看一下其遍歷方式,需要的朋友可以參考下
    2023-12-12
  • Java布隆過濾器的應用實例

    Java布隆過濾器的應用實例

    這篇文章主要介紹了Java布隆過濾器的應用實例,在程序的世界中,布隆過濾器是程序員的一把利器,利用它可以快速地解決項目中一些比較棘手的問題,如網頁?URL?去重、垃圾郵件識別、大集合中重復元素的判斷和緩存穿透等問題,需要的朋友可以參考下
    2023-11-11

最新評論