主頁 > 後端開發 > day50-正則運算式01

day50-正則運算式01

2022-10-23 06:59:23 後端開發

正則運算式01

5.1正則運算式的作用

正則運算式的便利

在一篇文章中,想要提取相應的字符,比如提取文章中的所有英文單詞,提取文章中的所有數字等,

  1. 傳統方法是:使用遍歷的方式,對文本中的每一個字符進行ASCII碼的對比,如果ASCII碼處于英文字符的范圍,就將其截取下來,再看后面是否有連續的字符,將連續的字符拼接成一個單詞,這種方式代碼量大,且效率不高,
  2. 使用正則運算式
package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//體驗正則運算式的便利
public class Regexp_ {
    public static void main(String[] args) {
        //假設有如下文本
        String content = "1995年,互聯網的蓬勃發展給了Oak機會,業界為了使死板、單調的靜態網頁能夠“靈活”起來," +
                "急需一種軟體技術來開發一種程式,這種程式可以通過網路傳播并且能夠跨平臺運行,于是,世界各大IT企" +
                "業為此紛紛投入了大量的人力、物力和財力,這個時候,Sun公司想起了那個被擱置起來很久的Oak,并且" +
                "重新審視了那個用軟體撰寫的試驗平臺,由于它是按照嵌入式系統硬體平臺體系結構進行撰寫的,所以非常" +
                "小,特別適用于網路上的傳輸系統,而Oak也是一種精簡的語言,程式非常小,適合在網路上傳輸,Sun公" +
                "司首先推出了可以嵌入網頁并且可以隨同網頁在網路上傳輸的Applet(Applet是一種將小程式嵌入到網" +
                "頁中進行執行的技術),并將Oak更名為Java,5月23日,Sun公司在Sun world會議上正式發布Java和" +
                "HotJava瀏覽器,IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微軟等各大公司都紛紛停止" +
                "了自己的相關開發專案,競相購買了Java使用許可證,并為自己的產品開發了相應的Java平臺,";

        String content2 = "無類域間路由(CIDR,Classless Inter-Domain Routing)地址根據網路拓撲來分配,可以" +
                "將連續的一組網路地址分配給一家公司,并使整組地址作為一個網路地址(比如使用超網技術),在外部路由表上" +
                "只有一個路由表項,這樣既解決了地址匱乏問題,又解決了路由表膨脹的問題,另外,CIDR還將整個世界分為四" +
                "個地區,給每個地區分配了一段連續的C類地址,分別是:歐洲(194.0.0.0~195.255.255.255)、北美(19" +
                "8.0.0.0~199.255.255.255)、中南美(200.0.0.0~201.255.255.255)和亞太(202.0.0.0~203.2" +
                "55.255.255),這樣,當一個亞太地區以外的路由器收到前8位為202或203的資料報時,它只需要將其放到通向亞" +
                "太地區的路由即可,而對后24位的路由則可以在資料報到達亞太地區后再進行處理,這樣就大大緩解了路由表膨脹的問題";

        //正則運算式來完成
        // (1)先創建一個Pattern物件,模式物件,可以理解成就是一個正則運算式物件
        //Pattern pattern = Pattern.compile("[a-zA-Z]+");//提取文章中的所有英文單詞
        //Pattern pattern = Pattern.compile("[0-9]+");//提取文章中的所有數字
        //Pattern pattern = Pattern.compile("([0-9]+)|([a-zA-Z]+)");//提取文章中的所有的英文單詞和數字
        Pattern pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+");//提取文章中的ip地址

        // (2)創建一個匹配器物件
        // 理解:就是 matcher 匹配器按照pattern(模式/樣式),到content文本中去匹配
        // 找到就回傳true,否則就回傳false(如果回傳false就不再匹配了)
        Matcher matcher = pattern.matcher(content2);
        // (3)可以開始回圈匹配
        while (matcher.find()) {
            //匹配到的內容和文本,放到 m.group(0)
            System.out.println("找到:" + matcher.group(0));
        }
    }
}

提取所有英文單詞:

image-20221022153358877 image-20221022153426008

提取所有數字:

image-20221022154139428

提取ip地址:

image-20221022161053093

正則運算式是處理文本的利器

  • 再提出幾個問題
    • 在程式中如何驗證用戶輸入的郵件資訊是否符合電子郵件的格式?
    • 如何驗證輸入的電話號碼是符合手機號格式?

為了解決上述問題,java提供了正則運算式技術(regular expression / regexp),專門用于處理類似的文本問題簡單地說,正則運算式是對字串執行 模式匹配 的技術,

5.2基本介紹

  • 介紹
  1. 一個正則運算式,就是用某種模式去匹配字串的一個公式,

    它們看上去奇怪而復雜,但經過練習后,你就會發現這些復雜的運算式寫起來還是相當簡單的,而且,一旦弄懂它們,就能將數小時辛苦而且容易出錯的文本處理作業縮短在幾分鐘甚至幾秒內完成,

  2. 正則運算式不是java獨有的,實際上很多編程語言都支持正則運算式進行字串操作,且它們的匹配規則大同小異,

5.3底層實作

實體分析:

給出一段字串文本,請找出所有四個數字連在一起的子串===>分析底層實作

package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//分析java的正則運算式的底層實作**
public class RegTheory {
    public static void main(String[] args) {
        String content="1998年12月8日,第二代Java平臺的企業版J2EE發布,1999年6月,Sun公司發布了" +
                "第二代Java平臺(簡稱為Java2)的3個版本:J2ME(Java2 Micro Edition,Java2平臺的微型" +
                "版),應用于移動、無線9889+及有限資源的環境;J2SE(Java 2 Standard Edition,Java 2平臺的" +
                "標準版),應用于桌面環境;J2EE(Java 2Enterprise Edition,Java 2平臺的企業版),應" +
                "用于基于Java的應用服務器,Java 2平臺的發布,是Java發展程序中最重要的一個里程碑,標志著J" +
                "ava的應用開始普及,3443";

        //請找出所有四個數字連在一起的子串
        //說明:
        // 1.\\d表示一個任意的數字
        String regStr="\\d\\d\\d\\d";
        //2.創建一個模式物件
        Pattern pattern = Pattern.compile(regStr);
        //3.創建匹配器
        //說明:創建匹配器matcher,按照前面寫的 正則運算式的規則 去匹配 content字串
        Matcher matcher = pattern.matcher(content);
        //4.開始匹配
        while (matcher.find()){
            System.out.println("匹配:"+matcher.group(0));
        }
    }
}
image-20221022165943002

5.3.1match.find()

  • match.find()完成的任務:
  1. 根據指定的規則,定位滿足規則的子字串(比如1998)

  2. 找到后,將"1998"子字串開始的索引記錄到 matcher物件的屬性 int[] groups陣列中的groups[0];把該子串的結束索引再+1的值記錄到 groups[1]

    此時groups[0]=0,groups[1]=4

image-20221022172106161
  1. 同時記錄oldLast的值為 子串的結束索引+1 即4,這樣做的原因是:下次執行find方法時,就從該下標4開始匹配

    image-20221022172130450

5.3.2matcher.group(0)

//原始碼:
public String group(int group) {
      if (first < 0)
          throw new IllegalStateException("No match found");
      if (group < 0 || group > groupCount())
          throw new IndexOutOfBoundsException("No group " + group);
      if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
          return null;
      return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
}

根據傳入的引數group=0,計算groups[0 * 2] 和 groups[0 * 2 + 1] 的記錄的位置,從content截取子字串回傳

此時groups[0]=0,groups[1]=4,注意:截取的位置為[0,4) ,包含 0 但是不包含索引為 4 的位置


  • 如果再次指向find方法,仍然按照上面的分析去執行:

    比如下一個匹配的子字串是“1999”,首先,將該字串的開始索引的值,以及結束索引加1的值記錄到matcher屬性的groups陣列中(會先將上次存盤在groups陣列中的數值清空)

    然后記錄oldLast的值為 子串的結束索引+1,下次執行find方法時,就從該下標35開始匹配

    groups[0]=31,groups[1]=35,oldLsat=35

    image-20221022172732999 image-20221022173129622

    然后執行matcher.group(0)方法,根據傳入的引數group=0,計算groups[0 * 2] 和 groups[0 * 2 + 1] 的記錄的位置,即[31,35),從content截取子字串回傳

5.3.3分組

什么是分組?

在正則運算式中有括號(),表示分組,第一個括號()表示第一組,第二個括號()表示第二組....

實體代碼:

package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//分析java的正則運算式的底層實作**
public class RegTheory {
    public static void main(String[] args) {
        String content="1998年12月8日,第二代Java平臺的企業版J2EE發布,1999年6月,Sun公司發布了" +
                "第二代Java平臺(簡稱為Java2)的3個版本:J2ME(Java2 Micro Edition,Java2平臺的微型" +
                "版),應用于移動、無線及9889有限資源的環境;J2SE(Java 2 Standard Edition,Java 2平臺的" +
                "標準版),應用于桌面環境;J2EE(Java 2Enterprise Edition,Java 2平臺的企業版),應" +
                "用于基于Java的應用服務器,Java 2平臺的發布,是Java發展程序中最重要的一個里程碑,標志著J" +
                "ava的應用開始普及,3443";

        //請找出所有四個數字連在一起的子串
        //說明:
        // 1.\\d表示一個任意的數字
        String regStr="(\\d\\d)(\\d\\d)";
        //2.創建一個模式物件
        Pattern pattern = Pattern.compile(regStr);
        //3.創建匹配器
        //說明:創建匹配器matcher,按照前面寫的 正則運算式的規則 去匹配 content字串
        Matcher matcher = pattern.matcher(content);
        //4.開始匹配

        while (matcher.find()){
            System.out.println("匹配:"+matcher.group(0));
            System.out.println("第1組括號()匹配到的值="+matcher.group(1));
            System.out.println("第2組括號()匹配到的值="+matcher.group(2));
        }
    }
}

以上面的代碼為例:

  • match.find():

1.根據指定的規則,定位滿足規則的子字串(比如"1998")

2.1找到后,將"1998"子字串開始的索引位置記錄到 matcher物件的屬性 int[] groups陣列中,把該子串的結束索引+1的值記錄到 groups[1] 中

此時 groups[0]=0 ;groups[1] = 4

2.2 記錄第一組括號()匹配到的字串("19")的位置 : groups[2]=0 , groups[3]=2

2.3 記錄第二組括號()匹配到的字串("98")的位置 : groups[4]=2 , groups[5]=4

如果有更多的分組就以此類推

索引下標是指:匹配的字串在整文本或字串中的位置,索引下標從0開始

驗證:

在程式中打上斷點,點擊debug除錯:

image-20221022182722396

可以看到剛開始時,groups陣列的所有值都是-1

image-20221022180849409

點擊step over,可以看到groups陣列的變化如下:

image-20221022182336862
//原始碼:
public String group(int group) {
      if (first < 0)
          throw new IllegalStateException("No match found");
      if (group < 0 || group > groupCount())
          throw new IndexOutOfBoundsException("No group " + group);
      if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
          return null;
      return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
}

在原始碼中,回傳陳述句 return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();

中,[group * 2] 和 [group * 2 + 1]計算的就是groups陣列的下標位置

如果我們想要取出第一組括號匹配的子字串,即groups下標為[2]和[3],只需要將傳入的引數改為1即可

groups[1 * 2]=groups[2] , groups[1 * 2 + 1]=groups[3]

取出第二組括號匹配的字串同理,將傳入的引數改為2即可

groups[2 * 2]=groups[4] , groups[2 * 2 + 1]=groups[5]

image-20221022183846495

小結:

  1. 如果正則運算式有括號(),即分組
  2. 取出匹配的字串規則如下:
  3. matcher.group(0) 表示匹配到的子字串
  4. matcher.group(1) 表示匹配到的子字串的第1組字串
  5. matcher.group(2) 表示匹配到的子字串的第2組字串
  6. 以此類推,注意分組的數不能越界

5.4正則運算式語法

  • 基本介紹

    如果想要靈活地運用正則運算式,必須了解其中各種元字符(Metacharacter)的功能,元字符從功能上大致分為:

    1. 限定符
    2. 選擇匹配符
    3. 分組組合和反向參考符
    4. 特殊字符
    5. 字符匹配符
    6. 定位符

5.4.1元字符-轉義符 \\\

\\符號的說明:在我們使用正則運算式去檢索某些特殊字符時,需要用到轉義符號\\,否則檢索不到結果,甚至會報錯,

注意:在Java的正則運算式中,兩個\\表示其他語言中的一個\

需要用到轉義符號的字符有如下:

. * + () $ / \ ? [] ^ {}

例子:

package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//演示轉義字符的使用
public class RegExp02 {
    public static void main(String[] args) {
        String content = "abc$(a.bc(123(";
        //匹配 ( ==> \\(
        //匹配 ( ==> \\.
        //String regStr = "\\(";
        String regStr = "\\.";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            System.out.println("找到:" + matcher.group(0));
        }
    }
}
image-20221022190923789 image-20221022191645072

5.4.2元字符-字符匹配符

image-20221022200646508

image-20221022200918872

  • 應用實體
  1. [a-z]說明:

    [a-z]表示可以匹配 a-z 之間任意的一個字符

    [A-Z] 表示可以匹配 A-Z 之間任意的一個字符

    [0-9] 表示可以匹配 0-9 之間任意的一個字符

    比如[a-z]、[A-Z]去匹配“a11c8”會得到什么結果?結果是:a、c

  2. java正則運算式默認是區分大小寫的,如何實作不區分大小寫?

    • (?i)abc表示abc都不區分大小寫
    • a(?i)bc表示bc不區分大小寫
    • a((?i)b)c表示只有b不區分大小寫
    • Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
  3. [^a-z]說明:

    [^a-z]表示可以匹配不是a-z中的任意一個字符

    [^A-Z]表示可以匹配不是A-Z中的任意一個字符

    [^0-9]表示可以匹配不是0-1中的任意一個字符

    如果用 [^a-z]去匹配“a11c8”會得到什么結果?結果:1、1、8

    用 [^a-z]{2}又會得到什么結果?結果是:11

  4. [abcd]表示可以匹配abcd中的任意一個字符

  5. [^abcd]表示可以匹配不是abcd中的任意一個字符

  6. \\d表示可以匹配0-9的任意一個數字,相當于[0-9]

  7. \\D表示可以匹配不是0-9的任意一個數字,相當于[^0-9],即匹配非數字字符

  8. \\w表示可以匹配任意英文字符、數字和下劃線,相當于[a-zA-Z0-9_]

  9. \\W相當于[^a-zA-Z0-9_],與\\w相反

  10. \\s匹配任何空白字符(空格,制表符等)

  11. \\S匹配任何非空白字符,與\\s相反

  12. .匹配除\n\r之外的所有字符,如果要匹配.本身則需要使用\\

package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//演示字符匹配符的使用
public class RegExp03 {
    public static void main(String[] args) {
        String content = "a1 1\r@c^8ab_c\nA BC\r\n";
        //String regStr = "[a-z]";//匹配 a-z 之間任意的一個字符
        //String regStr = "[A-Z]";//匹配 A-Z 之間任意的一個字符
        //String regStr = "[0-9]";//匹配 0-9 之間任意的一個字符
        //String regStr = "abc";//匹配 abc 字串[默認區分大小寫]
        //String regStr = "(?i)abc";//匹配 abc 字串[不區分大小寫]
        //String regStr = "[^a-z]";//匹配不在 a-z 之間任意的一個字符
        //String regStr = "[^0-9]";//匹配不在 0-9 之間任意的一個字符
        //String regStr = "[abcd]";//匹配在 abcd 中任意的一個字符
        //String regStr = "\\D";//匹配不在 0-9 中的任意的一個字符[匹配非數字字符]
        //String regStr = "\\w";//匹配任意英文字符、數字和下劃線
        //String regStr = "\\W";//\[^a-zA-Z0-9_]
        //String regStr = "\\s";//匹配任何空白字符(空格,制表符等)
        //String regStr = "\\S";//匹配任何非空白字符
        String regStr = ".";//.匹配除\n之外的所有字符,如果要匹配.本身則需要使用\\

        //說明:當創建Pattern物件時,指定Pattern.CASE_INSENSITIVE,表示匹配是不區分字母大小寫的
        //Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            System.out.println("找到:" + matcher.group(0));
        }
    }
}

5.4.3元字符-選擇匹配符

在匹配某個字串的時候是選擇性的,即:既可以匹配這個,又可以匹配那個,這時需要用到選擇匹配符號|

image-20221022212114116

例子:

package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExp04 {
    public static void main(String[] args) {
        String content ="hangshunping 韓 寒冷";
        String regStr="han|韓|寒";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            System.out.println("找到:" + matcher.group(0));
        }
    }
}
image-20221022212647231

5.4.4元字符-限定符

用于指定其前面的字符和組合項連續出現多少次

image-20221022212909851

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518942.html

標籤:其他

上一篇:pandas里的缺失值(理解與相關方法)

下一篇:30 個 Python 技巧,加速你的資料分析處理速度

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more