主頁 > 軟體設計 > 【Java】認識Sring、String的常見操作和StringBuffer 和StringBuilder的區別【字串詳解】

【Java】認識Sring、String的常見操作和StringBuffer 和StringBuilder的區別【字串詳解】

2021-09-26 13:53:02 軟體設計

目錄指引

      • 前言
      • 1. 定義字串
      • 2.字串比較相等
        • equals 使用注意事項
      • 3. 字串常量池( 多圖決議 )
          • 第一個列子決議:
          • 第二個列子決議:
          • 第三個列子決議:
          • 第四個列子決議:
          • 第五個列子決議:
          • 第六個列子決議:
          • 第七個列子決議:
          • 第八個列子決議:
          • 面試題:請解釋String類中兩種物件實體化的區別
      • 4. 理解字串不可變
      • 5.字符, 位元組與字串
        • 5.2 位元組與字串
        • 5.3 小結
      • 6. 字串常見操作
          • 6.1 字串比較
          • 6.2 字串查找
          • 6.3 字串替換
          • 6.4 字串拆分
          • 6.5 字串截取
          • 6.6 其他操作方法
      • 7. StringBuffer 和 StringBuilder

前言

本文介紹了字串的存盤常量池及字串常使用的方法,介紹了StringBuffer 和 StringBuilder,有什么地方寫的不好歡迎指正評論,謝謝!


1. 定義字串

首先C語言是沒有String型別的,我們來看一下Java當中String的構造 String 的方式,

String定義:

// 方式一
String str = "Hello Bit";
// 方式二
String str2 = new String("Hello Bit");
// 方式三
char[] array = {'a', 'b', 'c'};  //把陣列變成字串
String str3 = new String(array);

結果:
在這里插入圖片描述


我們可以去幫助檔案去深入了解一下Sting Java幫助手冊,

  1. 首先我們可以看見這個是在lang包底下:所以不需要導包
    在這里插入圖片描述
  2. 被final修飾不可以繼承(它繼承object類,所有的類都繼承object類)
    在這里插入圖片描述
  3. 所有的類要產生,就要有構造方法我們來看一下:(不一定學這么多,我們挑重點來講)
    在這里插入圖片描述
    以上就是定義的方式:我們以后都是直接賦值不要在使用new一個的方式,

我們來看一下 “方式三” 的一個底層實作圖:

char[] array = {'a', 'b', 'c'};  //把陣列變成字串
String str3 = new String(array);

在這里插入圖片描述
我們去看一下String類里面有什么:(有很多欄位方法)但是我們只看values[ ]
在這里插入圖片描述

string類里面有個value
在這里插入圖片描述

我們在來看一下String的方法:(可以看見這個value拷貝了一份會產生新的一個副本)
在這里插入圖片描述

在這里插入圖片描述

以上就是方式三在底層完成的一個操作.


2.字串比較相等

下面代碼輸出的是true 還是 false??
在這里插入圖片描述
結果:
在這里插入圖片描述
為什么呢?不是一樣的嗎?

  • 因為str1是參考型別存放的是地址
  • st2也是參考型別存放的也是地址
  • 所以不一樣(比較的是還是值一不一樣)但是值不是字串值,而是參考值,

那么想比較字串的內容一不一樣怎么比較呢?
使用:equals
在這里插入圖片描述
結果:
在這里插入圖片描述


equals 使用注意事項

現在需要比較 str 和 “Hello” 兩個字串是否相等, 我們該如何來寫呢?

String str = new String("Hello");
// 方式一
System.out.println(str.equals("Hello"));
// 方式二
System.out.println("Hello".equals(str));

在上面的代碼中, 哪種方式更好呢?
我們更推薦使用 “方式二”. 一旦 str 是 null, 方式一的代碼會拋出例外, 而方式二不會

String str = null;
// 方式一
System.out.println(str.equals("Hello"));  // 執行結果 拋出 java.lang.NullPointerException 異 常
// 方式二
System.out.println("Hello".equals(str));  // 執行結果 false

注意事項: “Hello” 這樣的字面值常量, 本質上也是一個 String 物件, 完全可以使用 equals 等 String 物件的方法.


3. 字串常量池( 多圖決議 )

字串常量池:存盤的就是字串,

在JVM底層實際上會自動維護一個物件池(字串常量池)

  • 如果現在采用了直接賦值的模式進行String類的物件實體化操作,那么該實體化物件(字串內容)將自動保存到這個物件池之中.
  • 如果下次繼續使用直接賦值的模式宣告String類物件,此時物件池之中如若有指定內容,將直接進行參考,
  • 如若沒有,則開辟新的字串物件而后將其保存在物件池之中以供下次使用

大概圖示:( 在JVM 并沒有劃磁區域說xxx區域就是字串常量池

在這里插入圖片描述
Stringpool 其實底層就是一個哈希表(不深入可百度)


理解 “池” (pool)

“池” 是編程中的一種常見的, 重要的提升效率的方式, 我們會在未來的學習中遇到各種 “記憶體池”, “執行緒池”, “資料
庫連接池” …
然而池這樣的概念不是計算機獨有, 也是來自于生活中. 舉個栗子:
現實生活中有一種女神, 稱為 “綠茶”, 在和高富帥談著物件的同時, 還可能和別的屌絲搞曖昧. 這時候這個屌絲被
稱為 “備胎”. 那么為啥要有備胎? 因為一旦和高富帥分手了, 就可以立刻找備胎接盤, 這樣 效率比較高.
如果這個女神, 同時在和很多個屌絲搞曖昧, 那么這些備胎就稱為 備胎池.


第一個列子決議:

還是來看一下下面的代碼在記憶體中的存放操作:

在這里插入圖片描述

如下圖:根據上面的字串常量池的介紹,我們知道字串參考起來的,會放在常量池里面:

在這里插入圖片描述

那么str2的字串內容在哪里呢??

-我們都知道字串存放在常量池里面,但是現在str也是hello,那么new string會先去常量池里面找有沒有一樣的,有一樣的就參考常量池里面的,就不需要在放進去新建一個:
在這里插入圖片描述

最終str1是指向常量池里面的,str2是指向堆里面的,所以是false,

會發現其實常量池幫我們節省了空間,不需要同樣東西存兩份,這個就是常量池的意義,


第二個列子決議:

看下面代碼思考是否相等?

在這里插入圖片描述
結果:
在這里插入圖片描述

決議:這2個在java當中都是字串常量,編譯器編譯的時候會自動被拼接,變成linbo
在這里插入圖片描述
記憶體圖:

在這里插入圖片描述
不相信?我們來編譯一下看看:(第二個字串已經變成 linbo)

在這里插入圖片描述
常量在編譯的時候已經被運算了,

變數:就是在編譯的時候 不知道里面的值,在運行的時候 才知道里面的值

在來列子:被final修飾變成常量
在這里插入圖片描述
結果
在這里插入圖片描述
反編譯:已經變成30

在這里插入圖片描述


第三個列子決議:

思考下面代碼得到什么:?
在這里插入圖片描述

結果:
在這里插入圖片描述

決議:str3指向的其實是lin 和 bo的一個拼接,在堆中產生新的物件,所以是false;
在這里插入圖片描述


第四個列子決議:

思考下面結果:
在這里插入圖片描述
結果:
在這里插入圖片描述

決議:可以看見str2(str2要拼接所以指向新物件)指向的是堆里面的物件,而str1是指向常量池的物件,所以是false
在這里插入圖片描述


第五個列子決議:

思考下面的代碼:
在這里插入圖片描述
結果:
在這里插入圖片描述
決議:str2依然是指向拼接的新物件,而str1是指向常量池所以false;

在這里插入圖片描述


第六個列子決議:

inter():手動將字串入池,

思考下面的代碼:
在這里插入圖片描述
結果:
在這里插入圖片描述

決議:inter方法就是拿到物件里面的值去哈希表里面找,如果已經有了,就不放進去了 ,所以是false;

在這里插入圖片描述

第七個列子決議:

思考下面代碼:
在這里插入圖片描述
結果:
在這里插入圖片描述
決議:s3.inter 放進了(放的是地址)常量池,然后s4的11 指向 s3的11 ,所以就是true
在這里插入圖片描述


第八個列子決議:

思考下面代碼:
在這里插入圖片描述
結果:
在這里插入圖片描述
決議:s3變成11,但是在此之前s4的11是沒有的,所以放進常量池,然后說s3.inter,看看常量池有沒有,常量池是有的,所以沒有放進去所以s4是指向常量池的,s3是指向堆中的物件,所以不一樣,
在這里插入圖片描述
以上就是所有的字串內容相不相等的練習,相信看完這些你會對字串的比較有個全新的認知,


字串傳參注意事項:
不是傳參考就可以改變原來的值,看下面代碼:

在這里插入圖片描述
結果:
在這里插入圖片描述
決議:形參的改變并不影響實參,只是改變了指向

在這里插入圖片描述

面試題:請解釋String類中兩種物件實體化的區別
  1. 直接賦值:只會開辟一塊堆記憶體空間,并且該字串物件可以自動保存在物件池中以供下次使用,
  2. 構造方法:會開辟兩塊堆記憶體空間,不會自動保存在物件池中,可以使用intern()方法手工入池,

綜上, 我們一般采取直接賦值的方式創建 String 物件


4. 理解字串不可變

字串是一種不可變物件. 它的內容不可改變.

String 類的內部實作也是基于 char[] 來實作的, 但是 String 類并沒有提供 set 方法之類的來修改內部的字符陣列

String str = "hello" ; 
str = str + " world" ; 
str += "!!!" ; 
System.out.println(str); 
// 執行結果
hello world!!!

圖文決議:先hello 和world拼接 變成hello world ,然后在和!!!拼接變成hell world,
產生了5個物件,為什么這樣呢?就是因為那些字串不可以改變(不可以直接在后面加)
在這里插入圖片描述


那么如果實在需要修改字串, 例如, 現有字串 str = “Hello” , 想改成 str = “hello” , 該怎么辦?

a) 常見辦法: 借助原字串, 創建新的字串

String str = "Hello";
str = "h" + str.substring(1);
System.out.println(str);
// 執行結果
hello

b) 特殊辦法(選學): 使用 “反射” 這樣的操作可以破壞封裝, 訪問一個類內部的 private

IDEA 中 ctrl + 左鍵 跳轉到 String 類的定義, 可以看到內部包含了一個 char[] , 保存了字串的內容.在這里插入圖片描述

String str = "Hello";
// 獲取 String 類中的 value 欄位. 這個 value 和 String 原始碼中的 value 是匹配的. 
Field valueField = String.class.getDeclaredField("value");
// 將這個欄位的訪問屬性設為 true
valueField.setAccessible(true);
// 把 str 中的 value 屬性獲取到. 
char[] value = (char[]) valueField.get(str);
// 修改 value 的值
value[0] = 'h';
System.out.println(str);
// 執行結果
hello

關于反射:(暫時不深入)

反射是面向物件編程的一種重要特性, 有些編程語言也稱為 “自省”.
指的是程式運行程序中, 獲取/修改某個物件的詳細資訊(型別資訊, 屬性資訊等), 相當于讓一個物件更好的 “認清自己” .

為什么 String 要不可變?(不可變物件的好處是什么?) (選學)

  1. 方便實作字串物件池. 如果 String 可變, 那么物件池就需要考慮何時深拷貝字串的問題了.
  2. 不可變物件是執行緒安全的.
  3. 不可變物件更方便快取 hash code, 作為 key 時可以更高效的保存到 HashMap 中

注意事項: 如下代碼不應該在你的開發中出, 會產生大量的臨時物件, 效率比較低.

String str = "hello" ; 
for(int x = 0; x < 1000; x++) {
    str += x ; 
}
System.out.println(str)

后面講stringbuffer 和 stringbuilder會講


5.字符, 位元組與字串

在這里插入圖片描述
代碼:str: 第二個引數是偏移量,第三個引數是第幾個:

意思:從偏移量為1 ,取兩個 字符來構造String物件 ,所以是bc

a是0,b是1

 public static void main(String[] args) {
        char[] value = {'a','b','c','d','e'};
        String str = new String(value,1,2);
        System.out.println(str);  //bc

    }
    

在這里插入圖片描述

代碼:從1位置處取一個
在這里插入圖片描述
結果:h是0 e是1;
在這里插入圖片描述


在這里插入圖片描述

代碼:將字串已字符陣列方式進行存盤
在這里插入圖片描述

結果:
在這里插入圖片描述


代碼示例: 給定字串一個字串, 判斷其是否全部由數字所組成.

思路: 將字串變為字符陣列而后判斷每一位字符是否是" 0 “~”‘9’"之間的內容,如果是則為數字.

public static void main(String[] args) { 
 String str = "1a23456" ; 
 System.out.println(isNumber(str)? "字串由數字所組成!" : "字串中有非數字成員!"); 

 } 
 public static boolean isNumber(String str) { 
 if(str==null)return false;
 if(str.lenth()==0)return false;
 char[] data = str.toCharArray() ; //轉變陣列
 for (int i = 0; i < data.length; i++) { 
 if (data[i]<'0' || data[i]>'9') { 
 return false ; 
 } 
 } 
 return true ; 
 }

5.2 位元組與字串

在這里插入圖片描述

代碼:把位元組(ASCII),轉換為合適的字符輸出
在這里插入圖片描述
結果:
在這里插入圖片描述


代碼:String上面有橫線是干嘛的??
在這里插入圖片描述
點進去看看: 有這個代表被棄用在這里插入圖片描述


在這里插入圖片描述

代碼:把字串變成位元組陣列 回傳出來
在這里插入圖片描述

結果:
在這里插入圖片描述


在這里插入圖片描述

代碼:
在這里插入圖片描述
結果:
在這里插入圖片描述

但是漢字有問題:
在這里插入圖片描述

結果:
在這里插入圖片描述

utf-8:
在這里插入圖片描述
結果:
在這里插入圖片描述
不經常使用這個


5.3 小結

那么何時使用 byte[], 何時使用 char[] 呢?

  • byte[] 是把 String 按照一個位元組一個位元組的方式處理, 這種適合在網路傳輸, 資料存盤這樣的場景下使用. 更適合針對二進制資料來操作
  • char[] 是吧 String 按照一個字符一個字符的方式處理, 更適合針對文本資料來操作, 尤其是包含中文的時候.

6. 字串常見操作

6.1 字串比較

在這里插入圖片描述

代碼: 比較參考的物件是否相等

public static void main(String[] args) {
        String str = "hello";
        String str2 = new String("hello");
        System.out.println(str.equals(str2));  //結果true
    }

在這里插入圖片描述
代碼:忽略大小寫的情況

public static void main(String[] args) {
        String str = "hello";
        String str2 = new String("Hello");
        System.out.println(str.equalsIgnoreCase(str2));  //結果 true
    }

在這里插入圖片描述
代碼:比較大小回傳數字 str>str2 正數 ,str==str2 0 ,< 回傳負數(比較的是ASCII碼)

public static void main(String[] args) {
        String str = "hello";
        String str2 = new String("Hello");
        System.out.println(str.compareTo(str2));  //回傳 32 
    }

如果第一個一樣(從前往后比較),比較第二個字符,有一個字符大小不同,那么代表整個字串大小


6.2 字串查找

在這里插入圖片描述
代碼:判斷字串是否存在

public static void main(String[] args) {
        String str = "abcdefg";
       boolean flag = str.contains(str);
        System.out.println(flag); //true
    }

列子2:

public static void main(String[] args) {
        String str = "abcdefg";
       boolean flag = str.contains("cdef");
        System.out.println(flag); //true
    }

在這里插入圖片描述

代碼:查找cdef 在 str里面有沒有 ,看第一個字符的位置(沒有回傳-1)

 public static void main(String[] args) {
        String str = "abcdefg";
        System.out.println(str.indexOf("cdef")); // 回傳下標2  
    }

有點類似kmp演算法


在這里插入圖片描述
代碼:從指定位置找

public static void main(String[] args) {
        String str = "abcdefg";
        System.out.println(str.indexOf("bcdef",0)); // 1
    }

注意:位置的范圍


在這里插入圖片描述
代碼:從后往前找

public static void main(String[] args) {
        String str = "abcdefg";
        System.out.println(str.lastIndexOf("bcdef")); // 1
    }

在這里插入圖片描述
代碼:從指定的位置往前找

public static void main(String[] args) {
        String str = "abcdefbcdefg";
        System.out.println(str.lastIndexOf("bcdef",10)); // 6
    }

在這里插入圖片描述

回傳的是后面往前面的第一個bcdef


在這里插入圖片描述
代碼:判斷是否以xx 開始的

 public static void main(String[] args) {
        String str = "abcdefbcdefg";
        System.out.println(str.startsWith("a")); // true
    }
 public static void main(String[] args) {
        String str = "abcdefbcdefg";
        System.out.println(str.startsWith("acdf")); // false
    }

在這里插入圖片描述
代碼:從指定位置開始 從b開始判斷是不是a開頭

 public static void main(String[] args) {
        String str = "abcdefbcdefg";
        System.out.println(str.startsWith("a",1)); // false
    }

在這里插入圖片描述

代碼:true

public static void main(String[] args) {
            String str = "abcdefbcdefg";
            System.out.println(str.endsWith("efg")); // true
        }

代碼:false

 public static void main(String[] args) {
            String str = "abcdefbcdefg";
            System.out.println(str.endsWith("efgc")); // false
        }

6.3 字串替換

在這里插入圖片描述
代碼:所以的a 變成z

public static void main(String[] args) {
            String str = "abcdefbcdaaa";
            System.out.println(str.replaceAll("a","z")); // zbcdefbcdzzz
        }

在這里插入圖片描述

代碼:替換了第一個

public static void main(String[] args) {
            String str = "abcdefbcdaaa";
            System.out.println(str.replaceFirst("a","z")); // zbcdefbcdaaa

        }

注意事項: 由于字串是不可變物件, 替換不修改當前字串, 而是產生一個新的字串


6.4 字串拆分

在這里插入圖片描述
代碼:

public static void main(String[] args) {
        String str = "ab abc abcd";
       String[] strings = str.split(" "); //以空格分割
        for (String s:strings) {
            System.out.println(s);
        }
}
結果:
ab
abc
abcd

在這里插入圖片描述

代碼二:

public static void main(String[] args) {
        String str = "ab abc abcd";
       String[] strings = str.split(" ",2); //以空格分割  最多分2組
        for (String s:strings) {
            System.out.println(s);
        }
    }
    //結果
    ab
	abc abcd


拆分是特別常用的操作. 一定要重點掌握. 另外有些特殊字符作為分割符可能無法正確切分, 需要加上轉義

代碼示例: 拆分IP地址

String str = "192.168.1.1" ; 
String[] result = str.split("\\.") ; 
for(String s: result) { 
 System.out.println(s); 
}

注意事項:

  1. 字符"|","*","+“都得加上轉義字符,前面加上”".
  2. 而如果是"",那么就得寫成"\".
  3. 如果一個字串中有多個分隔符,可以用"|"作為連字符.(代碼如下)
public static void main(String[] args) {
        String str = "ab#ab-cab cd";
       String[] strings = str.split("#|-| "); //以空格分割

        for (String s:strings) {
            System.out.println(s);
        }
    }

結果:
在這里插入圖片描述


代碼示例: 多次拆分

public static void main(String[] args) {
        String str = "name=zhangsan&age=18" ;
        String[] result = str.split("&") ;
        for (int i = 0; i < result.length; i++) {
            String[] temp = result[i].split("=") ;
            System.out.println(temp[0]+" = "+temp[1]);
        }
    }
    

結果:
在這里插入圖片描述


6.5 字串截取

在這里插入圖片描述
代碼:從2下標開始截取

public static void main(String[] args) {
        String str = "hello";
        String ret = str.substring(2);
        System.out.println(ret);//llo
    }

在這里插入圖片描述

public static void main(String[] args) {
        String str = "hellobit";
        String ret = str.substring(2,4);
        System.out.println(ret);//ll [2,4)表示包含 2 號下標的字符, 不包含 4 號下標
    }

注意事項:

  1. 索引從0開始
  2. 注意前閉后開區間的寫法, substring(0, 5) 表示包含 0 號下標的字符, 不包含 5 號下標

6.6 其他操作方法

在這里插入圖片描述
代碼:不使用的時候

public static void main(String[] args) {
        String str = "  a  hello";
        System.out.println(str);

    }

結果:
在這里插入圖片描述

使用的情況:

public static void main(String[] args) {
        String str = "  a  hello";
        System.out.println(str.trim());

    }

結果:去掉了2邊的空格 但是不可以去中間的
在這里插入圖片描述


在這里插入圖片描述
代碼:小寫轉大寫

 public static void main(String[] args) {
        String str = "abcde";
        System.out.println(str.toUpperCase());//ABCDE

    }

代碼:
在這里插入圖片描述

public static void main(String[] args) {
        String str = "ABCDE";
        System.out.println(str.toLowerCase()); //abcde


    }
//都是新物件

在這里插入圖片描述
代碼:

public static void main(String[] args) {
        String str = "ABCDE";
        System.out.println(str.length()); //5
    }

lenth()!=arr.lenth


在這里插入圖片描述

 public static void main(String[] args) {
        String str = "ABCDE";
        String str2 = "";

        System.out.println(str.isEmpty()); //false
        System.out.println(str2.isEmpty()); //true

    }

7. StringBuffer 和 StringBuilder

首先來回顧下String類的特點:

任何的字串常量都是String物件,而且String的常量一旦宣告不可改變,如果改變物件內容,改變的是其參考的指向而已,

通常來講String的操作比較簡單,但是由于String的不可更改特性,為了方便字串的修改,提供StringBuffer和StringBuilder類,

StringBuffer 和 StringBuilder 大部分功能是相同的,我們文章上主要介紹 StringBuffer
在String中使用"+"來進行字串連接,但是這個操作在StringBuffer類中需要更改為append()方法:


先來看一下StringBuffer和String的區別

  • 賦值上的區別 StringBuffer不可以直接賦值
    在這里插入圖片描述

那么需要給它賦值怎么辦?
可以直接new一個給它

在這里插入圖片描述


  • 拼接上面的不同 StringBuffer沒有+號 append 添加

在這里插入圖片描述

結果:
在這里插入圖片描述


  • 除了append()方法外,StringBuffer也有一些String類沒有的方法

    • 字串反轉:
      在這里插入圖片描述

深入來看一下 這個代碼:

在這里插入圖片描述

這個代碼我們說不要這樣使用:因為這樣會產生很多的一個物件,浪費記憶體

在這里插入圖片描述
大家可以看見上面 每次都會new一次物件,這樣回圈10次了,

我們可以改一下:
在這里插入圖片描述

這樣就產生了一個new 回圈里面沒有那么多new了 節約了記憶體 達到了一樣的效果

在這里插入圖片描述

有時候說 String是不可變的 StringBuffer是可變的 為什么呢?

因為String拼接都是新物件

StringBuffer每次拼接回傳的是當前物件
在這里插入圖片描述


而且StringBuffer 和 StringBuilder的區別就是 synchronized 關鍵字

StringBuffer :
在這里插入圖片描述

StringBuilder:
在這里插入圖片描述
那么這個synchronized 關鍵字是干嘛的呢??

其實簡單說就是保證執行緒安全的,

所以說 Stringbuffer適合多執行緒模式下,StringBuilder適合單執行緒模式下


注意:String和StringBuffer類不能直接轉換,如果要想互相轉換,可以采用如下原則:

String變為StringBuffer:利用StringBuffer的構造方法或append()方法
在這里插入圖片描述

StringBuffer變為String:呼叫toString()方法

在這里插入圖片描述


面試題:請解釋String、StringBuffer、StringBuilder的區別:

  • String的內容不可修改,StringBuffer與StringBuilder的內容可以修改.
  • StringBuffer與StringBuilder大部分功能是相似的
  • StringBuffer采用同步處理,屬于執行緒安全操作;而StringBuilder未采用同步處理,屬于執行緒不安全操作

以上就是我們全部內容了,講的比較詳細,當然有什么不對的地方可以指出來,一起進步感謝觀看!!!

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

標籤:其他

上一篇:Python學習寶典官方推薦 |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)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more