java关于字符串拼接的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java关于字符串拼接的问题相关的知识,希望对你有一定的参考价值。

“编译时无法确定的字符串拼接需要创建新的对象”,请问这句话是什么意思?
String a = "test";
String b = "3";
String c = a + b;
String d = "test" + "3";
String e = a + 2 + 1;
String f = a + (2 + 1);
String g = a.concat("3");
System.out.println(c == d);
System.out.println(c == f);
System.out.println(c == g);
System.out.println(d == f);
System.out.println(d == g);
System.out.println(f == g);
输出结果均为false,请结合这个例子说一下上面那句话的意思,谢谢!
我的意思是不明白“编译时无法确定的字符串拼接需要创建新的对象”这句话的意思,为什么c==d会是false,即:String c = a + b,那么c为test3,String d = "test" + "3",为什么d不是指向c所指向的对象呢?

参考技术A 这是描述Java编译器对字符串常量的优化方法。
众所周知,数据内容是要定义在数据段的,假设下面的代码:
String s1 = "abc" ;
String s2 = "abc" ;
假如不进行优化的话,结果就是内存中有两个重复的"abc"内容,也就是说有两个“对象”。
Java编译器会针对这种情况进行优化,对于常量字符串"abc",java编译器会只产生一个"abc"对象。这样,s1和s2是指向同一个内存区域的。

但假如字符串的值无法在编译时确定,如:String g = a.concat("3");
那么Java编译器将会为g变量分配一个空间。注意也不是立即分配,因为Java编译器是在全局对动态分配内存。

补充: 编译器不会检查 "test" + "3" 的结果是否就是"test3",因此创建新对象。
参考技术B String c=a+b;
java中字符串的“+”操作实际上相当于以下的C操作的 c=concat(a,b)。
char * concat(char *a,char *b)

int aLen,bLen,cLen,i;
char *c;
aLen=strlen(a);
bLen=strlen(b);
cLen=aLen+bLen;
c=(char*)malloc(sizeof(char)*(cLen+1));
for(i=0;i<aLen;i++)

c[i]=a[i];

for(i=0;i<bLen;i++)

c[i+aLen]=b[i];

c[aLen+bLen]='\0';
return c;


随手写的C代码,应该不能编译的,看明白意思就成。
参考技术C String 是final类型的,也就是不可改变,如果进行了字符串的拼接、取字串等操作将返回一个新的String对象,所以进行==操作的时候就会返回false。对于对象的比较应该使用equals方法 参考技术D 内容一样...但是内存空间不一样!且是 == 比较的是内存... 而不是内容 第5个回答  2009-04-01 就是一个问题 你定义的所有的都是字符串型的 所以你的比较要用EQUES
这样的话显示的就是ture了

Java中,关于字符串类型随机验证码 时间类型

一、字符串类型:String类型

定义一个字符串

String a="Hello World";

String b= new String ("Hello World");

字符串之间的拼接:

String a=abcd;

String b=abcd;

String  c=a+b;

System.out.println(c);


//输出的值 为 "abcdabcd"      //string类型同样可以和int类型拼接,假设 int d= 555, 那么     String e=a+d ;  那么输出e,得到的值为 "abcd555";

关于字符串常用的一些操作:

String  sc="ABCDEFG";

sc.length();       //取字符串的长度

sc.indexOf( c );    //获取第一次出现某字符的位置,返回的值为int类型   c表示查找的字符  。  需要注意的是获取的值需要+1,才是该字符的位置,在计算机中,String的索引是从0开始


sc.lastindexOf( c )  //获取最后一次出现某字符的位置

sc.substring( a,b )     //截取字符串,从 a 到 b

sc.trim()         // 只去掉字符串的前后空格,不去掉中间的

sc.replace(a,b )      //替换所有 ,由a替换成b

sc.replaceFirst(a,b)   //同样是替换,但是只替换一次

sc.equals(b)            //字符串之间相互比较  sc是否等于b  返回的值为true或者false

sc.split(,)      //将字符串按照一定的规则拆分  "," 每遇见一个逗号,进行一次拆分

  

 

通过sc.indexOf()获取数据示例:

String s="<student><xm>张三</xm><xb>男</xb></student>";
		
		int a=s.indexOf("<xm>");             //找到第一次出现该字符串的位置 并赋值给a
		int b=s.indexOf("</xm>");
		int c=s.indexOf("<xb>");
		int d=s.indexOf("</xb>");
		String xm = s.substring(a+4, b);    //因为我们要取字符后面的值,所以要跳过4个字符  故而+4  截取从 a+4到b;
		String xb = s.substring(c+4,d);       //原因同上, 截取从 c+4到d;
		 
		 System.out.print("姓名为"+xm+",性别为"+xb);      //输出

 

 

随机数字或字母或字母+数字混合验证码

		String a= new String("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");   //首先规定字符串
		
		String yzm="";
		 
		 for(int i=1;i<=4;i++)
		 {
			int sj=(int)((Math.random()*100)%a.length());       //在for循环中的随机数,对字符串的长度取余,则随机数位是字符串中的某个位置
			String c=a.substring(sj, sj+1);                       //截取字符串中某一个位置的字符,到字符+1
			yzm=yzm+c;                            //将字符拼接
			
		 }
	  
		 System.out.print(yzm);                 //最后输出
		 

  

 

二、时间类型:Date型

获取时间:

    两种方法:1.单独获取,最后拼接

//创建Calenar对象

Calendar a=Calendar.getInstance();

//分别给 年月日赋值	

	int b= a.get(Calendar.YEAR);

	int c= a.get(Calendar.MONTH)+1;     //在计算机中月份是从0开始的,因此要+1

	int d= a.get(Calendar.DAY_OF_MONTH);
	
//输出
	System.out.print(a+"年"+c+"月"+d+"日");
		 

  2、对Calenar格式化

//创建Calenar对象
Calendar a= Calendar.getInstance();
//格式化时间
	SimpleDateFormat b=new SimpleDateFormat(yyyy-MM-dd hh:mm:ss);
// 对Calender格式化
	String c= b.format(a.getTime());
//输出
	System.out.print(c);

  

 

     

以上是关于java关于字符串拼接的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于Java中SQL语句的拼接规则

java字符串拼接问题,求大神讲清楚

关于字符串

关于python字符串拼接的几种方法

关于字符串的拼接方式

Java 字符串拼接数字