两种创建字符串方法的比较------面试题

本文深入探讨了Java中字符串的创建方式,包括使用new关键字与直接赋值的区别,以及它们在内存中的表现形式。通过实例讲解了字符串常量池的工作原理,并详细介绍了字符串类的各种常用方法,如equals、compareTo、concat等,帮助读者全面掌握字符串的高效操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class StringText {

	public static void main(String[] args) {


		/**
		 * new一个对象时,在堆中开辟出新的地址,在数据,
		 * 共享区查找需要创建对象的内容,如果有直接将堆中new
		 * 的地址指向数据共享区的数据,如果没有先在数据共享区
		 * 创建该数据,将堆中的地址指向创建数据的地址;
		 * 用“==”比较的时候内容都是不相等的
		 * 而创建一个对象时,直接定义,是在数据共享区创建的
		 * 对象,再定义一个对象时,首先在数据共享区查找和该
		 * 对象的内容是否相同,相同的话,那么把该对象的内容
		 * 地址,给新的对象,这样两个对象指向的就是同一个内
		 * 存空间,如果没有该内容,才会在数据共享区创建一个
		 * 新的地址,存放该对象的内容;
		 * 这就是“new”和不new的本质区别
		 */
		String str1="abc";
		String str2="abc";
		str1="cde";
		System.out.println(str1);
		String str3=new String("abc");
		String str4=new String("abc");
		System.out.println(str1==str2);
		System.out.println(str3==str4);
		System.out.println(str1==str3);
		System.out.println(str1.equals(str2));
		System.out.println(str3.equals(str1));
		
		System.out.println("-------------");
		//、关于字符串常量的验证
		String a1="Hello";
		String a2="World";
		String a3="HelloWorld";
		
		/*、字符串是常量,相加的结果是,即使数据共享区有该相加的结果,仍旧
		 * 会得到一个新的结果,而这两个结果的地址是不相同的*/
		System.out.println(a3==a1+a2);
		
		/*、两个字符串做拼接操作,首先会在数据共享区找相同的结果,如果有那么
		 * 拼接的地址就是该结果,如果没有会在数据共享区创建该内容*/
		System.out.println(a3==("Hello"+"World"));
		String s=new String("abcdefg");
		String s2=new String("abcdefg");
		
		//charAt(int index),返回指定索引处的 char值
		char c1=s.charAt(2);
		System.out.println(c1);
		
		//codePointAt(int index),返回指定索引处的字符(Unicode 代码点
		
		char c2=(char) s.codePointAt(0);
		System.out.println(c2);
		
		//codePointBefore(int index),返回指定索引之前的字符(Unicode 代码点)。
		
		char c3=(char)s.codePointBefore(2);
		System.out.println(c3);
		
		//codePointCount(int beginIndex, int endIndex),返回此 String 的指定文本范围中的 Unicode 代码点数。
		int c4=s.codePointCount(2,4);
		System.out.println(c4);
		
		/*compareTo(String anotherString),按字典顺序比较两个字符串
		 * 比较规则是每个字母的字典序,字典序大的比较大,与长度没有关系
		 */
		boolean flag=s.compareTo(s2)>0;
		System.out.println(flag);
		
		/*compareToIgnoreCase(String str) 
                                按字典顺序比较两个字符串,不考虑大小写*/
		boolean flag2=s.compareToIgnoreCase(s2)==0;
		System.out.println(flag2);
		
		/*concat(String str) 
          	将指定字符串连接到此字符串的结尾*/
		String s3=s.concat(s2);
		System.out.println(s3);
		
		/*contains(CharSequence s) 
                                    当且仅当此字符串包含指定的 char 值序列时,返回 true*/
		
		boolean flag3=s3.contains(s);
		System.out.println(flag3);
		
		/*contentEquals(CharSequence cs) 
          `将此字符串与指定的 CharSequence 比较*/
		boolean flag4=s.contentEquals(s2);
		System.out.println(flag4);
		
		
		char[] arr=new char[] {'c','k'};
		/*copyValueOf(char[] data) 
          	返回指定数组中表示该字符序列的 String*/
		String s4=s.copyValueOf(arr);
		
		/*endsWith()测试是否以指定字符串结束*/
		boolean flag5=s.endsWith("l");
		System.out.println(flag5);
		
		/*equals()比较两个字符*/
		boolean flag6=s.equals(s2);
		System.out.println(flag6);
		System.out.println("----------------");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值