String的不变模式:
对于基本数据类型String而言,它的实例可以在运行期间保持状态永远不会被改变
1.不变模式:
一个字符串对象创建后,他的值不会被改变
String str1="hello";//创建了一个对象 他的值永远不会改变
System.out.println(str1);
str1+=" world!";//两个字符串对象粘粘,系统其实创建了一个新的对象,把Str1的指向改了,指向新的对象;hello就 //变成了垃圾;
System.out.println(str1);
//如果一直这样创建会影响系统的效率;要频繁的改变字符串对象的值就用StringBuffer来描述;
StringBuffer sb=new StringBuffer("[");
sb.append("hehe");
sb.append("]");//append();不会制造垃圾,真正在改sb的值;
System.out.println(sb);
二、对象池
Object obj = new Object();
obj是对象的引用,它位于栈中, new Object() 才是对象,它位于堆中。(对象入堆,变量入栈)
可以这样理解obj是拴在气球上的绳子,new Object() 是气球,我们通过对象的引用访问对象,就像我们那着绳子气球才不会跑掉。
创建String 的方式有两种:
1, String str=new String("abc");
2, String s="def";
虽然两种方法返回的都是String对象的一个引用,但是java虚拟机jvm对这两种对象的处理的方式不同,对于第一种
jvm会立即在heap中创建一个对象,然后返回这个对象的引用给客户;对于第二种,jvm会首先在String对象池中通过
String的equals方法查找是对象池中是否存放该String对象,如果有则会返回已有的对象的引用给客户而不是在heap
中创建一个新的对象,如果对象池中没有该String对象, jvm就会在heap中创建一个新的对象,将他的引用返回给客
户 ,同时将这个引用添加到String pool中、
使用第一种方法创建的对象,jvm不会将String对象放进对象池中,除非调用String 的intern方法
package learn;
public class AutoBox {
public static void main(String[] args) {
Integer integer=12;
System.out.println(integer+13);
Integer i1=13;
Integer i2=13;
Integer i3=137;
Integer i4=137;
System.out.println(i1==i2);
test();
}
public static void test(){
String str=new String("abc");//jvm在堆上创建一个对象
//jvm在String pool中找不到值为'abc‘的字符串,因此在堆上创建一个String对象,并将这个对象
//存放到String pool中,此时堆上有两个String对象
String s="abc";
if(str==s){
System.out.println("str==s");
}else{
System.out.println("not");
}
String s3="abc";
//这个时候,jvm发现String pool中已经存在值为“abc"的字符串,因此直接返回s 的引用给 s3
//也就是说s和s3指向同一个对象
if(s==s3){
System.out.println("s==s3");
}else{
System.out.println("s!=s3");
}
}
}
也就是说,对于一个字符串,任何操作返回的对象都是一个新的对象,而不是字符串的本身
分享到:
相关推荐
字符串的模式匹配算法在计算机科学中占据着重要的地位,它主要应用于文本搜索、数据分析和文本处理等领域。KMP(Knuth-Morris-Pratt)算法是其中一种高效的算法,尤其适用于处理具有重复子串的模式匹配问题。接下来...
- 使用正则表达式的用法:`Split(string[], StringSplitOptions)`,允许使用复杂的模式来分割字符串。 3. **字符串文字的@"abc"与"abc"** - `@"abc"`是C#中的verbatim字符串,它不转义特殊字符,如`\n`会被视为...
一旦找到,就使用替换函数(如Python的`str.replace()`或C++的`std::string::replace()`)替换为新的字符串。整个过程可能需要处理文件过大导致的内存限制问题,因此可能会采用流式读写或分块处理的方式来优化。 在...
本段VB代码实现了一个功能:在给定的字符串(`instring`)中查找位于指定前缀(`after`)与后缀(`before`)之间的子字符串。该函数允许用户设定是否从字符串的开头重新开始搜索(`rewind`)。此功能适用于需要从...
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: ...
本节将详细介绍十六进制字符串的按位异或运算以及如何在Java中实现这一运算。 十六进制字符串是由0到9和A到F(或a到f)组成的字符序列,每个字符代表4位二进制数。例如,十六进制数"AB"在二进制下表示为10101011。...
VB还提供了高级字符串处理功能,如`Split()`用于分割字符串,`Join()`用于合并数组成字符串,以及`String()`构造函数创建重复字符的字符串。 这个“整理输入字符串”的VB小工程可能包含了上述一种或多种技术,用于...
- `parseFloat()`:与`parseInt()`类似,但`parseFloat()`用于将字符串转换为浮点数,它只解析十进制形式的浮点数,没有基模式。遇到非数字字符时,它停止解析并返回已解析的浮点数。 ```javascript parseFloat(...
### KMP(字符串匹配)算法总结 #### 第一部分:KMP算法初解 ##### 1、普通字符串匹配BF算法与KMP算法的时间复杂度比较 KMP算法是一种高效的字符串匹配算法,它对基本的BF算法进行了优化。对于给定的原始串`S`和...
如果没有返回值,则原字符串不变;如果返回一个字符串,则用这个字符串替换掉匹配到的子串。 - 在某些情况下,如果正则表达式模式中包含了捕获组,则可以通过回调函数的参数访问这些捕获组匹配到的值。 ### 正则...
**Sunday字符串匹配算法详解** Sunday算法,全称为Sunday's Simple String Matching Algorithm,是由E. W. Dijkstra在1976年提出的一种高效字符串匹配算法。这个算法在单字符串匹配领域具有较高的性能,其主要特点...
部分匹配表,也称为失配表,记录了模式串(要查找的字符串)在出现部分匹配后的下一个字符应该与文本中的哪个位置进行比较。这样,当文本中的某个字符与模式串中的字符不匹配时,算法可以快速决定模式串应向前移动...
KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中查找子串(模式)出现位置的高效算法。这个算法是由D.E.Knuth、V.R.Pratt和J.H.Morris三位科学家独立发现的,因此得名。KMP算法避免了在模式匹配过程中不必要的...
在需要对字符串进行操作时,如截取、检索、替换等,都是通过调用字符串的方法生成一个新的字符串实例,原始字符串保持不变。 字符串的不可变性是指,字符串一旦创建,不能被更改。任何对字符串的操作都会返回一个新...
ValueString允许您将对象序列化为区域性不变的字符串,并将其解析为实现Parse / TryParse模式的任何类型。 当需要从文化中立的(不变的)字符串中初始化类型化的实例时使用该实例,该实例通常是从简单的配置文件或...
相反,`stripTrailing()`方法仅移除字符串末尾的空白,保持开头的空白不变。这对于清除列表或表格的最后一行的多余空格是有帮助的。 示例代码中,`writeHeader`方法利用了`String.repeat(int)`来创建一个等于号...
KMP(Knuth-Morris-Pratt)算法是一种在文本中高效查找子串出现位置的字符串搜索算法。它由D.E.Knuth、V.R.Morris和J.Pratt三位学者于1970年提出。KMP算法的核心是构建一个部分匹配表(也称为失败函数),用于在主串...
在计算机科学中,字符串搜索算法是处理文本和数据的重要工具,其中KMP(Knuth-Morris-Pratt)算法因其高效性和实用性而备受青睐。KMP算法是由Donald Knuth、Vaughan Pratt和James H. Morris三位学者在1970年代共同...
- 给定两个字符串:`S`为源字符串,`P`为模式字符串。 - 目标:寻找`P`在`S`中首次出现的位置索引。 2. **BF算法**: - 时间复杂度:O(|S|*|P|)。 - 空间复杂度:O(1)。 - 失配处理:当模式`P`与源字符串`S`的...
对于驼峰命名的字符串处理,PHP还提供了其他一些函数,比如`ucwords()`,它将字符串中每个单词的首字母转换为大写,而其余部分保持不变。这对于处理下划线分隔的字符串并转换为驼峰命名非常有用。另外,`strtolower...