Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查询结果的intern()字符串_Java_String_Performance_Jpa - Fatal编程技术网

Java 查询结果的intern()字符串

Java 查询结果的intern()字符串,java,string,performance,jpa,Java,String,Performance,Jpa,我需要输入查询结果的字符串。 因为我的查询第一个字段总是包含0或1,并且每次它创建新的字符串对象时。 我想在这个字符串上使用intern,并使用pool来节省一些内存。 但我的声明返回了一个数字: SELECT CASE WHEN b.num >= 12 THEN 1 ELSE 0 END as "result", ROUND (((b.num - 12)/12),2) AS "weight" FROM (SELECT sum(t.amount_inst) AS num

我需要输入查询结果的字符串。 因为我的查询第一个字段总是包含0或1,并且每次它创建新的字符串对象时。 我想在这个字符串上使用intern,并使用pool来节省一些内存。 但我的声明返回了一个数字:

SELECT CASE WHEN b.num >= 12 THEN 1 ELSE 0 END as "result", 
        ROUND (((b.num - 12)/12),2) AS "weight" FROM (SELECT sum(t.amount_inst) AS num 
    FROM MRCH_CARD t 
    ....
所以它在java端的结果是BigDecimal,而不是String:

但在BigDecimal内部存在具有字符串值的stringCache字段,每次我调用该查询作为执行的结果时,它都会创建具有1或0值的新字符串对象。 如何将该值插入字符串池? 我尝试过这种方法,但我认为这不起作用,因为qr.getSingleResult已经创建了新的String对象作为BigDecimal的stringCache字段:

  Object[] tempResult = (Object [])qr.getSingleResult();
  result.setResult(new BigDecimal(tempResult[0].toString().intern()));
  result.setWeight(new BigDecimal(tempResult[1].toString().intern()));

1您可以修改SQL查询以返回字符串而不是整数

2您可以手动缓存BigDecimal对象本身,方法是将它们替换为BigDecimal.ONE和BigDecimal.ZERO静态缓存值

3只有在调用BigDecinal对象上的toString时,才会计算BigDecinal中的私有字段stringCache,但如果需要toString,则可能会丢弃BigDecinal对象


4不推荐!您甚至可以在带有反射的私有字符串上调用intern,请参见更好的解决方案是在第一列中使用数字int。这应该起作用:

 BigDecimal result = resultAsBigDecimal( (Number)tempResult[0] );

 public static BigDecimal resultAsBigDecimal( Number value ) {
     int i = value.intValue();
     if( 0 == i ) return BigDecimal.ZERO;
     if( 1 == i ) return BigDecimal.ONE;
     throw new RuntimException( "Unexpected value: " + value );
 }

实习生的体重可能是无用的。因为权重将有许多不同的值。

第二个选项在我看来是不必要的。已经有BigDecimal.ONE和BigDecimal.ZERO,因此OP应该使用它们,而不是每隔一个月创建一个新的BigDecimal对象time@BackSlash说得好,我会修改答案。但是请注意,Op并没有创建这些对象,它们来自JDBCObject[]tempResult=Object[]qr.getSingleResult;在那一行之后,已经在BigDecimal的stringCache字段中创建了新的字符串object0或1,所以我不明白如何帮助我使用:BigDecimal结果=结果BigDecimal数字ItemResult[0];什么是qr?为什么返回字符串?Query qr=em.createNativeQuerysMTT;我不知道为什么,我的语句返回了数字,但BigDecimal包含stringCache字段,我不知道为什么。请查看tempResult[0]的类型,如您在我的问题中看到的图片所示