String字符串常见规则

本文深入探讨Java中String对象的创建方式,包括常量池的使用、字符串拼接优化及final字段处理。同时,详细解析Integer对象的常量池技术、自动装箱与拆箱过程,以及比较运算的细节。

1.只要使用 new 方法,便需要创建新的对象,创建两个对象,一个在堆中,一个在常量池中(若常量池中已存在该对象,则不再创建),这是两个不同的对象,指向堆中的和指向常量池中的不同.

String str2 = new String("cc");

当new String("cc")后,堆中创建了"cc",也会在常量池创建"cc"创建了2个字符串对象

2.直接使用双引号声明出来的 String 对象会直接存储在常量池中

3.如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。String.intern() 是一个 Native 方法,它的作用(在JDK1.6和1.7操作不同)是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,在jdk1.6中,将此String对象添加到常量池中,然后返回这个String对象的引用(此时引用的串在常量池)。在jdk1.7中,放入一个引用,指向堆中的String对象的地址,返回这个引用地址(此时引用的串在堆)

4.常量字符串的“+”操作,编译阶段直接会合成为一个字符串

如string str=”JA”+”VA”

常量池中,创建"JA"和"VA",连接过程编译器直接优化成"JAVA"(在编译阶段会直接合并成语句String str=”JAVA”),会去常量池中查找是否存在”JAVA”,如果没有,则在常量池中进行创建,如果有,则直接返回常量池中"JAVA"的引用

5.对于final字段,编译期直接进行了常量替换(而对于非final字段则是在运行期进行赋值处理的)。
final String str1=”ja”;
final String str2=”va”;
String str3=str1+str2;
在编译时,直接替换成了String str3=”ja”+”va”,根据第4条规则,再次替换成String str3=”JAVA”

6.常量字符串和变量拼接时(如:String str3=baseStr + “01”;)会调用stringBuilder.append()在堆上创建新的对象(此时并不会在常量池中创建对应的对象,只在堆中创建对象)。

 

 

 

Integer对象详解(摘自他人):

 

  1. Integer i1=40;Java 在编译的时候会直接将代码封装成 Integer i1=Integer.valueOf(40); 从而使用常量池(-128,127)中的对象。
  2. Integer i1 = new Integer(40) ;这种情况下会创建新的对象。
  3. flocat,double没有实现常量池技术,其他包装类都实现常量池技术

 

Integer 比较(==)更丰富的一个例子:

Integer i1 = 40;
Integer i2 = 40;
Integer i3 = 0;
Integer i4 = new Integer(40);
Integer i5 = new Integer(40);
Integer i6 = new Integer(0);
System.out.println("i1=i2   " + (i1 == i2));
System.out.println("i1=i2+i3   " + (i1 == i2 + i3));
System.out.println("i1=i4   " + (i1 == i4));
System.out.println("i4=i5   " + (i4 == i5));
System.out.println("i4=i5+i6   " + (i4 == i5 + i6));
System.out.println("40=i5+i6   " + (40 == i5 + i6));

结果:

i1=i2   true

i1=i2+i3   true

i1=i4   false

i4=i5   false

i4=i5+i6   true

40=i5+i6   true

解释:

语句 i4 == i5 + i6,因为 + 这个操作符不适用于 Integer 对象,首先 i5 和 i6 进行自动拆箱操作,进行数值相加,即 i4 == 40。然后Integer对象无法与数值进行直接比较,所以i4自动拆箱转为int值40,最终这条语句转为40 == 40进行数值比较。

### 比较字符串是否相同的方法 在编程中,比较两个字符串是否相同通常需要考虑多个因素,例如大小写敏感性、内存地址还是内容比较等。以下是几种常见的方法及其适用场景: #### 1. Java中的字符串比较 在Java中,可以使用以下几种方法来比较两个字符串是否相同: - **`equals()` 方法**:用于比较两个字符串的内容是否相同。如果两个字符串的字符序列完全一致,则返回 `true`。[^1] ```java String str1 = "Hello"; String str2 = "hello"; boolean areEqual = str1.equals(str2); // false ``` - **`equalsIgnoreCase()` 方法**:用于忽略大小写的情况下比较两个字符串的内容是否相同。[^3] ```java String MayDay = "MayDay"; String mayday = "mayday"; boolean areEqualIgnoreCase = MayDay.equalsIgnoreCase(mayday); // true ``` - **`==` 运算符**:用于比较两个字符串的引用是否相同,而不是它们的内容。即使两个字符串的内容相同,但如果它们存储在不同的内存地址中,`==` 运算符会返回 `false`。[^1] ```java String str1 = "Hello"; String str2 = "Hello"; boolean areSameReference = (str1 == str2); // true ``` #### 2. Python中的字符串比较 在Python中,可以通过以下方式比较两个字符串是否相同: - **`==` 和 `!=` 运算符**:直接比较两个字符串的内容是否相同或不同。[^2] ```python str1 = "Hello" str2 = "hello" are_equal = (str1 == str2) # False are_not_equal = (str1 != str2) # True ``` - 如果需要忽略大小写进行比较,可以先将字符串转换为统一的大小写形式(如小写),再进行比较: ```python str1 = "Hello" str2 = "hello" are_equal_ignore_case = (str1.lower() == str2.lower()) # True ``` #### 3. 自定义比较逻辑 在某些情况下,可能需要根据特定规则比较字符串是否相同。例如,在Java中可以通过重写 `equals()` 方法来自定义比较逻辑。[^5] ```java public class CustomString { private String value; public CustomString(String value) { this.value = value; } @Override public boolean equals(Object obj) { if (obj instanceof CustomString) { CustomString other = (CustomString) obj; return this.value.equalsIgnoreCase(other.value); // 忽略大小写比较 } return false; } } ``` #### 4. 手动逐字符比较 在某些特殊需求下,可能需要手动逐字符比较两个字符串是否相同。这种方法效率较低,但在某些特定场景下可能有用。[^4] ```java public static boolean compare(String str1, String str2) { if (str1.length() != str2.length()) { return false; } for (int i = 0; i < str1.length(); i++) { if (str1.charAt(i) != str2.charAt(i)) { return false; } } return true; } ``` ### 注意事项 - 使用 `==` 运算符时需注意其行为差异,它在Java中比较的是引用,而在Python中比较的是内容。 - 如果需要忽略大小写,应明确使用相关方法(如 `equalsIgnoreCase()` 或 `lower()`)。 - 在自定义对象中比较字符串时,建议重写 `equals()` 方法以实现更灵活的比较逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值