String相关

http://lichenhao.javaeye.com/blog/499147

 

Java代码 复制代码
  1. public class StringTest {   
  2.   
  3.     /**  
  4.      * @param args  
  5.      */  
  6.     public static void main(String[] args) {   
  7.         //先在String pool中查找,没有则创建,并且在堆中创建对象,返回堆中对象地址   
  8.         String s = new String("123");   
  9.         //先在String pool中查找,有则返回对象的地址   
  10.         String s1 = "123";   
  11.         //先在String pool中查找,有,只在堆中创建对象   
  12.         String s2 = new String("123");   
  13.            
  14.         System.out.println(s==s1);   
  15.         System.out.println(s==s2);   
  16.         System.out.println(s1==s2);   
  17.            
  18.         /*  
  19.          * intern  
  20. public String intern()返回字符串对象的规范化表示形式。   
  21. 一个初始为空的字符串池,它由类 String 私有地维护。   
  22.  
  23. 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。   
  24.  
  25. 它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。   
  26.  
  27. 所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。   
  28.  
  29.  
  30. 返回:  
  31. 一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。  
  32.  
  33.          */  
  34.            
  35.         System.out.println(s==s.intern()); //false   
  36.         System.out.println(s1==s1.intern()); //true   
  37.         System.out.println(s.intern()==s2.intern()); //true 都指向的是字符串池的引用   
  38.            
  39.         System.out.println("-------------------------");   
  40.            
  41.         String hello = "hello";   
  42.         String he = "he";   
  43.         String llo = "llo";   
  44.         System.out.println(hello=="he"+"llo"); //true "he"+"llo"  “+”java判断pool中是否存在hello,有则返回字符串池中的对象   
  45.         System.out.println(hello == "he" + llo); //false "he" + llo 在堆中新创建对象   
  46.     }   
  47.   
  48. }  
public class StringTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//先在String pool中查找,没有则创建,并且在堆中创建对象,返回堆中对象地址
		String s = new String("123");
		//先在String pool中查找,有则返回对象的地址
		String s1 = "123";
		//先在String pool中查找,有,只在堆中创建对象
		String s2 = new String("123");
		
		System.out.println(s==s1);
		System.out.println(s==s2);
		System.out.println(s1==s2);
		
		/*
		 * intern
public String intern()返回字符串对象的规范化表示形式。 
一个初始为空的字符串池,它由类 String 私有地维护。 

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 

它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 

所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。 


返回:
一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。

		 */
		
		System.out.println(s==s.intern()); //false
		System.out.println(s1==s1.intern()); //true
		System.out.println(s.intern()==s2.intern()); //true 都指向的是字符串池的引用
		
		System.out.println("-------------------------");
		
		String hello = "hello";
		String he = "he";
		String llo = "llo";
		System.out.println(hello=="he"+"llo"); //true "he"+"llo"  “+”java判断pool中是否存在hello,有则返回字符串池中的对象
		System.out.println(hello == "he" + llo); //false "he" + llo 在堆中新创建对象
	}

}
源码分析 
  1.执行第一行后,内存中有几个对象?
2个即堆中的对象和String pool中的对象,内容都是abc,因为存在String pool.String类是不可变类,内容确定就不能改变,new关键字在生成对象时,首先在pool中查找是否有相同的内容,如果没有则在pool中创建对象并赋值,然后在堆中创建对象,值相同,本例中都为abc字符串,s为堆中对象的引用。
2.判断s==s1,s==s2,s1==s2?
执行第二行后,内存中未创建新的对象,首先在String pool中查找是否有相同内容的对象,因为在第一行语句中已经创建内容为abc字符串,所以不再创建对象,s1为pool中值为abc的对象的引用。
执行第三句后,堆中又新增有一个值为abc的对象,pool中不变,s2为其引用。
因为s,s1,s2为不同的引用,所以不相等。
ps:==判断是否指向同一个对象,八个原生数据类型判断值是否相同。

判断s==s.intern()
false,intern方法为在方法调用时,如果pool中包含一个字符串和对象中的字符串相等(equal),则返回pool中的对象地址,否则在pool中增加一个内容相同的对象,并返回原对象地址。

 

Java中的`String`类用于处理字符串,以下是一些常见的用法: 1. **创建字符串**:可以直接使用双引号创建字符串,也可以使用`new`关键字创建。例如: ```java String s1 = "Hello"; String s2 = new String("World"); ``` 2. **比较字符串**: - `equals()`方法:用于比较字符串对象中的字符是否相同。例如: ```java String s1 = "Hello"; String s2 = new String(s1); boolean isEqual = s1.equals(s2); // 返回true ``` - `==`运算符:比较两个对象是否引用同一实例。例如: ```java String s1 = "Hello"; String s2 = new String(s1); boolean isSameInstance = s1 == s2; // 返回false ``` 3. **获取字符串长度**:使用`length()`方法获取字符串的长度。例如: ```java String s = "Hello"; int length = s.length(); // 返回5 ``` 4. **拼接字符串**:使用`concat()`方法或`+`运算符拼接字符串。例如: ```java String s1 = "Hello"; String s2 = " World"; String s3 = s1.concat(s2); // 或者 String s3 = s1 + s2; ``` 5. **获取指定位置的字符**:使用`charAt()`方法获取字符串中指定位置的字符。例如: ```java String s = "Hello"; char c = s.charAt(1); // 返回'e' ``` 6. **查找子字符串的位置**:使用`indexOf()`方法查找子字符串在原字符串中第一次出现的位置。例如: ```java String s = "Hello World"; int index = s.indexOf("World"); // 返回6 ``` 7. **截取子字符串**: - `substring(int beginIndex)`:从指定位置开始截取到字符串末尾。例如: ```java String s = "Hello World"; String sub = s.substring(6); // 返回"World" ``` - `substring(int beginIndex, int endIndex)`:从指定开始位置截取到指定结束位置(不包含结束位置的字符)。例如: ```java String s = "Hello World"; String sub = s.substring(0, 5); // 返回"Hello" ``` 8. **将字符串转换为字符数组**:使用`toCharArray()`方法将字符串转换为字符数组。例如: ```java String s = "Hello"; char[] charArray = s.toCharArray(); ``` 9. **将字符串转换为字节数组**:使用`getBytes()`方法将字符串转换为字节数组。例如: ```java String s = "Hello"; byte[] byteArray = s.getBytes(); ``` 10. **分割字符串**:使用`split()`方法根据指定的正则表达式分割字符串。例如: ```java String s = "Hello,World"; String[] parts = s.split(","); // 返回["Hello", "World"] ``` 11. **判断字符串是否包含指定字符序列**:使用`contains()`方法判断字符串是否包含指定的字符序列。例如: ```java String s = "Hello World"; boolean contains = s.contains("World"); // 返回true ``` 12. **替换字符串中的指定内容**:使用`replace()`方法替换字符串中的指定字符序列。例如: ```java String s = "Hello World"; String newStr = s.replace("World", "Java"); // 返回"Hello Java" ``` 13. **转换大小写**: - `toLowerCase()`:将字符串转换为小写。例如: ```java String s = "Hello"; String lowerCase = s.toLowerCase(); // 返回"hello" ``` - `toUpperCase()`:将字符串转换为大写。例如: ```java String s = "Hello"; String upperCase = s.toUpperCase(); // 返回"HELLO" ``` 14. **去除字符串首尾的空白字符**:使用`trim()`方法去除字符串首尾的空白字符。例如: ```java String s = " Hello "; String trimmed = s.trim(); // 返回"Hello" ``` 15. **判断字符串是否以指定后缀结尾**:使用`endsWith()`方法判断字符串是否以指定的后缀结尾。例如: ```java String s = "Hello.java"; boolean endsWith = s.endsWith(".java"); // 返回true ``` 16. **判断字符串是否为空**:使用`isEmpty()`方法判断字符串是否为空。例如: ```java String s = ""; boolean isEmpty = s.isEmpty(); // 返回true ``` 17. **判断字符串是否以指定前缀开头**: - `startsWith(String prefix)`:判断字符串是否以指定的前缀开头。例如: ```java String s = "Hello World"; boolean startsWith = s.startsWith("Hello"); // 返回true ``` - `startsWith(String prefix, int toffset)`:从指定位置开始判断字符串是否以指定的前缀开头。例如: ```java String s = "Hello World"; boolean startsWith = s.startsWith("World", 6); // 返回true ``` 18. **忽略大小写比较字符串**:使用`equalsIgnoreCase()`方法忽略大小写比较两个字符串。例如: ```java String s1 = "Hello"; String s2 = "hello"; boolean equalsIgnoreCase = s1.equalsIgnoreCase(s2); // 返回true ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值