本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於字串的相關問題,字串是由零個或多個字元組成的有限序列,又名字串,下面一起來看一下,希望對大家有幫助。
推薦學習:《java影片教學》
字串(string)是由零個或多個字元組成的有限序列,又稱為字串。
我們可以從這段段落基本概念知道:
在Java中沒有內建的字串類型,每個用雙引號括起來的字串都是Java中String類別的一個實例。
也就是說Java中String並不是資料類型,在Java中所有的字串都是String的實例化對象。
Java中的String
Java中的String類別代表字串,Java 程式中的所有字串文字(例如「abc」)都為此類的實例。
也就是說,Java程式中所有的雙引號字串,都是 String 類別的物件。 String 類別在 java.lang 套件下,所以使用的時候不需要導包!
在Java中String最重要的特點就是:
String 類別是不可改變的,所以你一旦建立了String 對象,那麼它的值就無法改變了。我們將這種特性稱為String的不可變性。
字串的不可變性
不可變性:當你給一個字串重新賦值之後,老值並沒有在記憶體中銷毀,而是重新開闢一塊空間來儲存新值。
也就是說一旦一個String物件在記憶體中創建,它將是不可改變的,所有的String類別中方法並不是改變String物件自己,而是重新建立一個新的String物件
。
例如:
String s="dcm";String s="ddccmm"
當s的值改變之後,ddccmm這個值並沒有覆蓋dcm,只是重新開發了一個新的空間去儲存ddccmm然後將s指向它。
如果我們在實際開發中對很含有大量字元的字串進行遍歷賦值修改,會對記憶體產生許多無法釋放的字串對象,造成記憶體垃圾。
正因為String物件的不可變性,如果需要對字串進行大量的修改、新增字元、刪除字元等操作盡量不要使用String對象,因為這樣會頻繁的建立新的物件導致程式的執行效率下降。
這時我們可以使用Java中另外一個字串類別StringBuilder。
我們在做題的時候關於字串一般用的都是String類,但是考慮到我們有時候也會用到StringBuilder類這裡我就對StringBuilder類進行稍微細緻一點的講解。
StringBuilder
是一個可變的字串類,我們可以把它看成是一個容器,這裡的可變指StringBuilde
r物件中的內容是可變的。
2.1 StringBuilder類別常用的方法
# 可以看出來,建構一個StringBuilder
的物件只能使用它的建構方法來構造,不像String
一樣可以直接String s= "123"
來建立
因為StringBuilder
類別物件是可變的,所以當我們對一個字串需要進行改變比較多的時候一般定義為StringBuilder
類別。
2.2 String和StringBuilder的區別
#String
物件是不可改變的。每次使用String
類別中的方法之一時,都要在記憶體中建立一個新的字串對象,這就需要為該新對象分配新的空間。
StringBuilder
物件是動態對象,允許擴充它所封裝的字串中字元的數量,但是您可以為它可容納的最大字元數指定一個值,當修改StringBuilder
時,在達到容量之前,它不會為其自己重新分配空間。當達到容量時,將自動分配新的空間且容量翻倍。也就是說當字串進行改變時,都是對目前物件的狀態進行更新的。
可以使用重載的建構子之一來指定 StringBuilder
類別的容量。
2.3 String類別與StringBuilder類別的相互轉換
#String類別轉換為StringBuilder類別
public class String{ public static void main(String[] args){ String s = "baibai"; StringBuilder s1 = new StringBuilder(s); System.out.println(s1); }}
#StringBuilder類別轉換為String類別
public class String { public static void main(String[] args){ StringBuilder s1 = new StringBuilder(); //连续连接 s1.append("abc").append("efg"); String s = s1.toString(); System.out.println(s); }}
#3.1初始化String物件的兩種方法:
//方法一:直接创建 String s1= "大聪明 超牛的"; //方法二:对象创建 String s2 = new String("大聪明 超牛的"); String s3 = new String();//也可以创建一个空串
雖然兩種方法看起來是一樣的但是本質上是不一樣的。
String 建立的字串儲存在公共池中,而 new 建立的字串物件則在堆上。那存放在公共池(常量池)與堆中有什麼不一樣嗎?
我們來舉例:
String s1 = "大聪明 超牛的"; // String 直接创建 String s2 = "大聪明 超牛的"; // String 直接创建 String s3 = s1; // 相同引用 String s4 = new String("大聪明 超牛的"); // String 对象创建 String s5 = new String("大聪明 超牛的"); // String 对象创建 System.out.println(System.identityHashCode(s1)); System.out.println(System.identityHashCode(s2)); System.out.println(System.identityHashCode(s3)); System.out.println(System.identityHashCode(s4)); System.out.println(System.identityHashCode(s5));
輸出:
可見前三個字串的位址相同,後兩個各不相同!
這是因為直接建立的字串時,會先在公共池中找有沒有這樣的字串,如果有那就將引用直接指向它,而不去開發新的空間。這裡s1,s2,s3這三個引用指向了公共池中的同一塊記憶體。
物件創建時,每次都會在堆上開新的空間來存放字串,也就是說s4,s5分別指向在堆上的兩塊不同的內存,只不過這兩塊內存裡面都儲存著相同的東西。
這裡再次強調一下,我們在做題的時候遇到關於字串相關題目我們幾乎都是使用String類別來解決問題,除了在字符串進行大量更改時我們可能會暫時用到StringBuilder類別。
這裡的暫時就是我們在對字串更改等操作之後一般還是要把字串轉換為String類別的。
所以我們要學習的API主要還是String類別的API。對應刷題我StringBuilder的API我們只需要學習上面提到的兩個就夠了。
String 類別在 java.lang 套件下,所以使用的時候不需要導包!
4.1 基本資料型別轉換成字串
有三種方法:
(1)基本类型数据的值+“” (最常用,最简单);
(2)使用包装类中的静态方法static String toString(int i)
返回一个表示指定整数的String 对象。如:在Integer中:Integer.toString(6)
;
(3)使用String类中的静态方法static String valueOf(int i)
返回int 参数的字符串表示形式。如:String.valueOf(6)
;
String 类别中已经提供了将基本数据型态转换成String 的 static 方法也就是 String.valueOf() 这个参数多载的方法 :
String.valueOf(boolean b) //将 boolean 变量 b 转换成字符串 String.valueOf(char c) //将 char 变量 c 转换成字符串 String.valueOf(char[] data) //将 char 数组 data 转换成字符串 String.valueOf(char[] data, int offset, int count) //将char数组data中由data[offset]开始取 count个元素转换成字符串 String.valueOf(double d) //将 double 变量 d 转换成字符串 String.valueOf(float f) //将 float 变量 f 转换成字符串 String.valueOf(int i) //将 int 变量 i 转换成字符串 String.valueOf(long l) //将 long 变量 l 转换成字符串 String.valueOf(Object obj) //将 obj 对象转换成 字符串, 等于 obj.toString()
因为是静态方法所以不需要实例化。
4.2 字符串转换为基本数据类型
一般使用包装类的静态方法
parseXX("字符串")
要将 String 转换成基本数据类型大多需要使用基本数据型态的包装类别,如:String 转换成 byte可以使用 Byte.parseByte(String s)
Byte.parseByte(String s) //将 s 转换成 byte Byte.parseByte(String s, int radix) //以 radix 为基底 将 s 转换为 byte Double.parseDouble(String s) //将 s 转换成 double Float.parseFloat(String s) //将 s 转换成 float Integer.parseInt(String s) //将 s 转换成 int Long.parseLong(String s) //将 s 转换成 long
注意这里也是静态方法,只不过都是对应包装类的静态方法
4.3 使用length()
得到一个字符串的字符个数
int len = String.length();
4.4 使用toCharArray()
将一个字符串转换成字符数组
Char[] arr = String.toCharArray();
4.5 判断两个字符串的内容是否相等返回true/false
String1.equals(String2);//区分大小写 String1.equalsIgnoreCase(String2);//不区分大小写
4.6 与位置相关的字符串
charAt(int)//得到指定下标位置对应的字符 indexOf(String)//得到指定内容第一次出现的下标 lastIndexOf(String)//得到指定内容最后一次出现的下标
4.7 将一个字符串按照指定内容劈开split(String)
,返回字符串数组。
String s = "wa,dcm,nb!"; String[] str = s.split(",");//返回结果中str[1]=dcm
4.8 contains(String)
判断一个字符串里面是否包含指定的内容,返回true/false
Boolean a = String1.contains(String2)
4.9 使用substring()
截取字符串,返回子串
String.substring(int)//从指定下标开始一直截取到字符串的最后 String.substring(int,int)//从下标x截取到下标y-1对应的元素
4.10 字符串大小写转换
String.toUpperCase() //将一个字符串全部转换成大写 String.toLowerCase()//将一个字符串全部转换成小写
4.11 使用replace()
进行字符串内容替换
String.replace(String,String) //将某个内容全部替换成指定内容 String.replaceAll(String,String) //将某个内容全部替换成指定内容,支持正则 String.repalceFirst(String,String) //将第一次出现的某个内容替换成指定的内容
387. 字符串中的第一个唯一字符
题解:
把字符串的单个字符转化为对应数组下标,遍历一遍字符串获得26个字母分别出现几次。然后在遍历一遍字符串看哪个字符先出现次数为1,就输出对应下标。
class Solution { public int firstUniqChar(String s) { int len = s.length(); int[] vis = new int[26]; int temp = -1; for(int i = 0; i <p>或者我们也可以把字符串先转换为字符数组来解题,原理都是一样的!</p><pre class="brush:php;toolbar:false">class Solution { public int firstUniqChar(String s) { int[] arr = new int[26]; char[] chars = s.toCharArray(); for (int i = 0; i <p>推荐学习:《<a href="https://www.php.cn/course/list/36.html" target="_blank">java视频教程</a>》</p>
以上是快速上手Java資料結構之字串的詳細內容。更多資訊請關注PHP中文網其他相關文章!