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字符串拼接的主要内容,如果未能解决你的问题,请参考以下文章

java字符串拼接

Java 字符串拼接数字

java字符串的拼接

Java语句字符串如何拼接与拆分

java中如何解决sql字符串的拼接

javascript中字符串和数字怎么拼接