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所指向的对象呢?
众所周知,数据内容是要定义在数据段的,假设下面的代码:
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关于字符串拼接的问题的主要内容,如果未能解决你的问题,请参考以下文章