string存儲
1. golang+存儲string到longtext欄位
首先,我們需要在表中定義一個長文本欄位,例如:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
description LONGTEXT
);
然後,我們可以使用"gorm"庫來將字元串存儲到長文本欄位中。
首先,我們需要創建一個User結構飢並並蔽灶體,如下所示:
go
type User struct {
ID uint gorm:"primary_key"
Name string gorm:"not null"
Description string gorm:"type:longtext"
}
然後,我們可以使用"gorm"庫中的Create函爛跡數來將字元串存儲到長文本欄位中,如下所示:
go
user := User{Name: "John Doe", Description: "This is a long text string."}
db.Create(&user)
這將使資料庫將字元串存儲到長文本欄位中。
2. java中String類型存儲位置
一、new String都是在堆上創建字元串對象。
當調用 intern() 方法時,
編譯器會將字元串添加到常量池中(stringTable維護),
並返回指向該常量的引用。
二、通過字面量賦值創建字元串(如:String str=」twm」)時,
會先在常量池中查找是否存在相同的字元串,若存在,
則將棧中的引用直接指向該字元串;若不存在,則在常量池中生成一個字元串,
再將棧中的引用指向該字元串。
三、常量字元串的「+」操作,
編譯階段直接會合成為一個字元串。
如string str=」JA」+」VA」,
在編譯階段會直接合並成語句String str=」JAVA」,
於是會去常量池中查找是否存在」JAVA」,從而進行創建或引用。
四、對於final欄位,編譯期直接進行了常量替換(而對於非final欄位則是在運行期進行賦值處理的)。
final String str1=」ja」;
final String str2=」va」;
String str3=str1+str2;
在編譯時,直接替換成了String str3=」ja」+」va」,根據第三條規則,
再次替換成String str3=」JAVA」
五、常量字元串和變數拼接時(如:String str3=baseStr + 「01」;)
會調用stringBuilder.append()在堆上創建新的對象。
六、JDK 1.7後,intern方法還是會先去查詢常量池中是否有已經存在,
如果存在,則返回常量池中的引用,這一點與之前沒有區別,
區別在於,如果在常量池找不到對應的字元串,則不會再將字元串拷貝到常量池,
而只是在常量池中生成一個對原字元串的引用。簡單的說,就是往常量池放的東西變了
原來在常量池中找不到時,復制一個副本放到常量池,1.7後則是將在堆上的地址引用復制到常量池。
舉例說明:
String str2 = new String(「str」)+new String(「01」);
str2.intern();
String str1 = 「str01」;
System.out.println(str2==str1);
在JDK 1.7下,當執行str2.intern();時,
因為常量池中沒有「str01」這個字元串,所以會在常量池中生成一個對堆中的「str01」的引用
(注意這里是引用 ,就是這個區別於JDK 1.6的地方。在JDK1.6下是生成原字元串的拷貝),
而在進行String str1 = 「str01」;字面量賦值的時候,常量池中已經存在一個引用,
所以直接返回了該引用,因此str1和str2都指向堆中的同一個字元串,返回true。
String str2 = new String(「str」)+new String(「01」);
String str1 = 「str01」;
str2.intern();
System.out.println(str2==str1);
將中間兩行調換位置以後,因為在進行字面量賦值(String str1 = 「str01″)的時候,
常量池中不存在,所以str1指向的常量池中的位置,而str2指向的是堆中的對象,
再進行intern方法時,對str1和str2已經沒有影響了,所以返回false。
3. String類型所接收的字元串在哪進行存儲
String類型表示字元串可以分為兩種方式:
直接使用字元串變數接收一個字元串常量;這個字元串常量是在常量池中存儲的;
使用new關鍵字創建字元串對象,則在堆中存儲。