java字符串拼接
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java字符串拼接相关的知识,希望对你有一定的参考价值。
String a = "test";
String b="3";
String c=a+b;
String d="test"+"3";
请问c和d是否指向的是同一个对象"test3",为什么?
假设再有个语句,String e = "test3";因为String是final的,不可修改,所以可以把e看成常量。
当再遇到String d="test"+"3"时,编译器在这里做了优化,把这条语句优化为String d="test3",由于存在一个相同的对象e,所以d也指向了e.
所以d、e是同一个对象。
而编译器在处理String c=a+b时,认为是两个变量相加,不会做优化。所以c,d不是同一个对象。
如果将a,b定义为
final String a = "test";
final String b="3";
这时String c=a+b就变成了常量相加,所以编译器会对其进行优化,即这时c,d就相等了
ps:推荐楼主一本书《深入java虚拟机》,对java的底层机制有很好的介绍。 参考技术A 可以用==测试一下(Java中,对于应用类型来说,"=="永远比较两个对象的内存地址即==两边的引用是不是指向同一个对象)
System.out.println(c == d);//结果为false 明显不是同一个对象!
String d="test"+"3"; +号两边的"test"和"3" 都是常量值,他会拼起来检查字符串池中有没这个对象,有就返回这个对象(也就是所谓的编译器优化),所以d存的是字符串池中“test3”对象的地址
String c=a+b; +号中有一个变量,在堆中生成一个新的对象,所以c存的是堆中“test3”对象的地址。
一个指向字符串池中“test3”对象,一个指向堆中“test3”对象。
明显不指向同一个对象。。。 参考技术B String c=a+b;
String d="test"+"3";
不是啊,你建了两个对象,虽然内容一样,但不是同一个对象;
Python工程师Java之路(h)Java字符串拼接+null拼接处理
文章目录
Java版本:1.8
加号
String a = "ab" + 'c' + 5L;
System.out.println(a);
//abc5
String b = 9.99F + "ABC" + null;
System.out.println(b);
//9.99ABCnull
String的concat
System.out.println("aa".concat("bb"));
//aabb
StringBuilder和StringBuffer的append
StringBuilder stringBuilder = new StringBuilder("ab");
stringBuilder.append(99L).append("cd");
System.out.println(stringBuilder);
//ab99cd
StringBuffer stringBuffer = new StringBuffer("ab");
stringBuffer.append(9.99F).append("cd");
System.out.println(stringBuffer);
//ab9.99cd
StringBuffer是线程安全的(synchronized),源码截取如下
@Override
synchronized StringBuffer append(AbstractStringBuilder asb)
toStringCache = null;
super.append(asb);
return this;
StringBuilder的append不是线程安全的,速度更快,源码截取如下
public StringBuilder append(StringBuffer sb)
super.append(sb);
return this;
String的join
String a = String.join("-", "a", "b", "c");
System.out.println(a);
//a-b-c
String[] strings = "a", "b", "c", null, "e";
String b = String.join("-", strings);
System.out.println(b);
//a-b-c-null-e
源码截取如下,第一个参数为分隔符
public static String join(CharSequence delimiter, CharSequence... elements)
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
// Number of elements not likely worth Arrays.stream overhead.
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements)
joiner.add(cs);
return joiner.toString();
StringJoiner
StringJoiner实例化时,可设置(分隔符,前缀,后缀)
import java.util.StringJoiner;
public class Hi
public static void main(String[] args)
//StringJoiner(分隔符, 前缀, 后缀)
StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
//遍历
String[] strings = "a", "b", "c", null, "e";
for (String string : strings)
//过滤空值
if (string != null)
stringJoiner.add(string);
//打印
System.out.println(stringJoiner.toString());
-
打印效果
- [a,b,c,e]
StringUtils.join
import com.sun.deploy.util.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
public class Hi
public static void main(String[] args)
ArrayList<String> a = new ArrayList<>(Arrays.asList("a", "b", null, "d"));
//不过滤空值
System.out.println(StringUtils.join(a, ",")); //a,b,null,d
//过滤空值
a.removeIf(Objects::isNull);
System.out.println(StringUtils.join(a, ",")); //a,b,d
场景:拼接SQL
Phoenix(待完善)
import com.alibaba.fastjson.JSONObject;
import com.sun.deploy.util.StringUtils;
public class Hello
public static void main(String[] args)
String s = "\\"tb\\":\\"sku\\",\\"data\\":\\"id\\":\\"99\\",\\"name\\":\\"椰子\\"";
JSONObject js = JSONObject.parseObject(s);
String table = js.getString("tb");
JSONObject data = js.getJSONObject("data");
String sql = "upsert into " + table
+ " (" + String.join(",", data.keySet()) + ") "
+ "values"
+ " ('" + StringUtils.join(data.values(), "','") + "');";
System.out.println(sql);
打印结果
upsert into sku (name,id) values ('椰子','99');
MySQL(待完善)
import com.alibaba.fastjson.JSONObject;
import java.util.StringJoiner;
public class Hi
public static void main(String[] args)
String s = "\\"tb\\":\\"sku\\",\\"data\\":\\"id\\":99,\\"name\\":\\"椰子\\"";
JSONObject js = JSONObject.parseObject(s);
String table = js.getString("tb");
JSONObject data = js.getJSONObject("data");
StringJoiner columns = new StringJoiner(",", "(", ")");
StringJoiner values = new StringJoiner(",", "(", ")");
for (String column : data.keySet())
columns.add(column);
Object value = data.get(column);
if (value.getClass() == String.class)
values.add("'" + value + "'");
else
values.add(value.toString());
System.out.println("INSERT " + table + columns + " VALUES " + values + ";");
打印结果
INSERT sku(name,id) VALUES ('椰子',99);
以上是关于java字符串拼接的主要内容,如果未能解决你的问题,请参考以下文章