Hex2String操作超长字符串引出的String,StringBuffer,StringBuilder占用内存问题

针对图片上传接口中Base64字符串转换效率低的问题,本文对比了多种字符串转换方法,包括使用StringBuilder、StringBuffer及Apache Commons Codec库,实测结果显示使用Apache Commons Codec库的hex2String方法效率最高。

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

系统对外提供图片上传接口,但是要求上送的图片需要是Base64的字符串。

症状:上送过来的串经过hex2String的时候效率极低

经过研究发现是本地hex2String的方法存在问题

---------------------old hex 2 String -----------------------
public static String bytes2HexString(byte[] b) {
	String ret = "";
	for (int i = 0; i < b.length; i++) {
		String hex = Integer.toHexString(b[i] & 0xFF);
		if (hex.length() == 1) {
			hex = '0' + hex;
		}
		ret += hex.toUpperCase();
	}
	return ret;
}

可以看出原先是对原先的Base64String进行getByte之后,对byte数组进行逐个操作且因为Integer.toHexString(b[i] & 0xFF);如果产生的String结果不一样每次都会创建一个新的String对象(因为String是不可变量,每次对String进行操作都会产生新的对象)。

下面是测试样例以及改进的代码:

package Test;

import org.apache.commons.codec.binary.Hex;

public class testHex2String {
	
	public static void main(String[] args) {
		String rawString=": {\"IdPBSide\":\"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQdkUdxN3fJHA+h+3jn3fc+0cFBZ4ABDEDsD3FNXarF38N1GRpSnFFKL4rMeLvKNHj/AAEIElZVxe2rx7at7/aseeDr/9k=\",\"SendTransCode\":\"MELEIdPhotoUpload\",\"ActivityStart\":\"\",\"ChannelHeadRequest\":{\"ChannelId\":\"99045\",\"ChannelDate\":\"20181227\",\"ChannelJnlNo\":\"62169220181227990000001990450000\"},\"IdNo\":\"300000200010100000\",\"IdAddress\":\"\",\"CifName\":\"8888\",\"EProtocolAcNo\":\"\"}";
		Long timeLong=System.currentTimeMillis();
		System.out.println(rawString.length());
		bytes2HexString(rawString.getBytes());
		System.out.println("--------11--------");
		System.out.println(" 累计耗时:"+(System.currentTimeMillis()-timeLong));
		timeLong=System.currentTimeMillis();
		hex2String(rawString.getBytes());
		System.out.println("--------22--------");
		System.out.println(" 累计耗时:"+(System.currentTimeMillis()-timeLong));
		timeLong=System.currentTimeMillis();
		bytes2HexStrBuffer(rawString.getBytes());
		System.out.println("--------33--------");
		System.out.println(" 累计耗时:"+(System.currentTimeMillis()-timeLong));
		timeLong=System.currentTimeMillis();
		bytes2HexStrBuild(rawString.getBytes());
		System.out.println("--------44--------");
		System.out.println(" 累计耗时:"+(System.currentTimeMillis()-timeLong));
	}
	
	/**
	 * Byte数组转十六进制字符串字节间不用空格分隔
	 * 
	 * @param b
	 * @return
	 */
	public static String bytes2HexString(byte[] b) {
		String ret = "";
		for (int i = 0; i < b.length; i++) {
			String hex = Integer.toHexString(b[i] & 0xFF);
			if (hex.length() == 1) {
				hex = "0" + hex;
			}
			ret += hex.toUpperCase();
		}
		return ret;
	}
	
	/**
	 * Byte数组转十六进制字符串字节间不用空格分隔
	 * 
	 * @param b
	 * @return
	 */
	public static String bytes2HexStrBuild(byte[] b) {
		String ret = "";
		StringBuilder sbZero=new StringBuilder("0");
		StringBuilder result=new StringBuilder();
		for (int i = 0; i < b.length; i++) {
			StringBuilder sb=new StringBuilder();
			sb.append(Integer.toHexString(b[i] & 0xFF));
			if (sb.length() == 1) {
				sb = sbZero.append(sb);
			}
			result.append(sb);
		}
		ret=result.toString().toUpperCase();
		return ret;
	}
	/**
	 * Byte数组转十六进制字符串字节间不用空格分隔
	 * 
	 * @param b
	 * @return
	 */
	public static String bytes2HexStrBuffer(byte[] b) {
		String ret = "";
		StringBuffer sbZero=new StringBuffer("0");
		StringBuffer result=new StringBuffer();
		for (int i = 0; i < b.length; i++) {
			StringBuffer sb=new StringBuffer();
			sb.append(Integer.toHexString(b[i] & 0xFF));
			if (sb.length() == 1) {
				sb = sbZero.append(sb);
			}
			result.append(sb);
		}
		ret=result.toString().toUpperCase();
		return ret;
	}
	public static String hex2String(byte[] data){
		return Hex.encodeHexString(data);
	}

}

测试结果如下:此处的测试String被我截取部分,原始长度为205244。太长的字符串能明显看出String、StringBuilder、StringBuffer的区别。

205244
--------11--------
 累计耗时:37785
--------22--------
 累计耗时:23
--------33--------
 累计耗时:24
--------44--------
 累计耗时:22
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值