String老问题了,搞掂你!!!

springboot 全局 Date参数接收 String格式 转换异常报错 全局 Date参数接收 String格式 阅读详情

String对象创建个数

 

 

 

String类是Java中很重要的一个类,在此总结一下这个类的特别之处。下面的相关资料翻译自《java语言规范》(第三版)和《java虚拟机规范》(第二版),有的直接摘引了原文。下面的代码都是用SUN jdk1.6 javac来编译。 

 

1.String literal,这里将它翻译为字面常量,它由双引号包围的0个或多个字符组成,比如"abc","Hello World"等等。一个String字面常量总是引用相同的String实例,比如"abc","abc"两个常量引用的是同一个对象。 

程序测试: 

package testPackage;

 

class Test {

 

        public static void main(String[] args) {

 

                String hello = "Hello", lo = "lo";

 

                System.out.print((hello == "Hello") + " ");

 

                System.out.print((Other.hello == hello) + " ");

 

                System.out.print((other.Other.hello == hello) + " ");

 

                System.out.print((hello == ("Hel"+"lo")) + " ");

 

                System.out.print((hello == ("Hel"+lo)) + " ");

 

                System.out.println(hello == ("Hel"+lo).intern()); 

        } 

}

 

class Other { static String hello = "Hello"; }  

另一个包: 

package other; 

public class Other { static String hello = "Hello"; } 

输出: 

true true true true false true

 

结论有六点:

 

1)  同一个包下,同一个类中的相同的String字面常量表示对同一个String对象的引用。

 

2)  同一个包下,不同的类中的相同的String字面常量表示对同一个String对象的引用。

 

3)  不同包下,不同类中的相同String字面常量同样表示对同一个String对象的引用。

 

4)  通过常量表达式计算的String,计算在编译时进行,并将它作为String字面常量对待。

 

5)  通过连接操作得到的String(非常量表达式),连接操作是运行时进行的,会新创建对象,所以它们是不同的。

 

6)  显式的对一个计算得到的String调用intern操作,得到的结果是已经存在的相同内容的String字面常量。

 

补充说明:

 

1)像这样的问题,String str = "a"+"b"+"c"+"d";

 

运行这条语句会产生几个String对象?1个。参考上面第5条,通过常量表达式得到的String 是编译时计算的,因此执行这句话时只有"abcd"着一个String对象存在。

 

常量表达是的定义可以参考java语言规范。另例:

 

       final String str1 = "a";

 

       String str2 = str1+"b";

 

执行第二句话会有几个String对象产生?1个。因为str1是常量,所以str1+"b"也是常量表达式,在编译时计算。

 

    遇到这种问题时,不要说它依赖于具体的编译器或者虚拟机实现,因为这就是规范里有的。一般的说,java的编译器实现应该遵守《java语言规范》,而java虚拟机实现应该遵守《java虚拟机规范》。

 

 

 

2)不要这样使用字符串:

 

String str = new String("abc");

 

    参考文档中的说明:

 

String

 

public String(String original)

 

    初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。由于 String 是不可变的,所以无需使用此构造方法,除非需要 original 的显式副本。

 

参数:

 

original - 一个 String。

 

注意:无需使用此构造方法!!! 

 

 

3)单独的说明第6点:

 

String str = new String("abc");

 

str = str.intern();

 

    当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串引用。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

 

    很明显,在这个例子中"abc"引用的对象已经在字符串池中了,再调用intern返回的是已经存在池中内容为"abc"的字符换对象的引用。在上面的例子中也说明了这个问题。

 

2. String类的实例表示表示Unicode字符序列。String字面常量是指向String实例的引用。(字面常量是“引用”!)

 

3.String转换

 

    对于基本类型先转换为引用类型;引用类型调用toString()方法得到String,如果该引用类型为null,转换得到的字符串为"null"。

 

4. String链接操作“+”

 

    如果“+”操作的结果不是编译期常量,将会隐式创建一个新的对象。为了提高性能,具体的实现可以采用StringBuffer,StringBuilder类对多个部分进行连接,最后再转换为String,从而避免生成再丢弃中间的String对象。为了达到共享实例的目的,编译期常量总是“interned”的。

 

例子:

 

String a = "hello ";

 

String b = a+1+2+"world!";

 

反汇编结果:

 

0:  ldc #2; //String hello

 

   2:  astore_1

 

   3:  new #3; //class java/lang/StringBuilder

 

   6:  dup

 

   7:  invokespecial #4; //Method java/lang/StringBuilder."<init>":()V

 

   10: aload_1

 

   11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

 

   14: iconst_1

 

   15: invokevirtual #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;

 

   18: iconst_2

 

   19: invokevirtual #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;

 

   22: ldc #7; //String world!

 

   24: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

 

   27: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

 

   30: astore_2

 

 

 

实际就是

 

String b = new StringBuilder().append(a).append(1).append(2).append("world").toString();

 

这里就使用StringBuilder来避免中间临时String对象的产生而导致性能下降。

 

    补充例子,下面的两个例子主要是对编译时常量做一个说明:

 

1)

 

String c = "c";

 

String str = "a"+"b"+c;

 

和

 

2)

 

String c = "c";

 

String str = c+"a"+"b";

 

1)中,str="a"+"b"+c;编译器分析是会把"a"+"b"作为编译时常量,生成字面常量"ab",所以实际执行这句话时,链接的是"ab"和c。实际相当于执行了

 

String str = new StringBuilder().append("ab").append(c).toString();

 

2)中,String str = c+"a"+"b";

 

编译器分析到c为变量,后面的"a"+"b"就不会作为编译时常量来运算了。

 

实际运行时相当于执行

 

String str = new StringBuilder().append(c).append("a").append("b").toString();

 

5.String对象的创建:

 

1)  包含String字面常量的类或者接口在加载时创建表示该字面常量的String对象。以下两种情况下不会创建新String对象。

 

a)   一个相同的字面常量已经出现过。

 

b)   一个相同内容的字符串已经调用了intern操作(比如经过运算产生的字符串调用intern的情形)。

 

2)  非常量表达式的字符串连接操作有时会产生表示结果的String对象。

 

3)  String字面常量来自类或接口的二进制表示中(也就是class文件中)的CONSTANT_String_info 结构。CONSTANT_String_info结构给出了构成字符串字面常量的Unicode字符序列。

 

4)  为了生成字符串字面常量,java虚拟机检查 CONSTANT_String_info结构给出的字符序列:

 

a)   如果与CONSTANT_String_info结构中给出的字符换内容相同的串实例已经调用过String.intern,得到的字符串字面常量就来自该串的同一实例。

 

b)   否则,根据CONSTANT_String_info 中的字符序列创建一个新的字符串实例,然后调用intern方法。

 

例子:一个SCJP题目

 

11. public String makinStrings() {

12. String s = “Fred”;

13. s = s + “47”;

14. s = s.substring(2, 5);

15. s = s.toUpperCase();

16. return s.toString();

17. }

How many String objects will be created when this method is invoked?

 

       答案是3个。上面已经说明,"Fred","47"是字符串字面常量,它们在在类加载时创建的。这里题目问,方法调用时(!)有多少个String对象被创建,两个字面常量自然不包括在内。3个是:"Fred47","ed4","ED4"。

 

6.String与基本类型的包装类比较

 

    相同点,它们都是不变类,使用"=="判断时可能会有类似的性质。

 

    在java 5之后,java增加了自动装箱和拆箱功能。因此,就有了这样的性质:

 

Integer i = 5;

 

Integer j = 5;

 

System.out.println(i == j);

 

结果:true.

 

   这表面上看来是和String相同点,但其实现是极为不同的。这里作为一个不同点来介绍。

 

    众所周知,自动装箱是这样实现的:

 

Integer i = 5;

 

相当于

 

Integer i = Integer.valueOf(5);//注意不是new Integer(5),这就无法满足java语言规范中的约定了,约定见本文最后

 

    而在Integer中,静态的创建了表示从-128~+127之间数据的Integer对象,这个范围之内的数进行装箱操作,只要返回相应的对象即可。因此

 

Integer i = 5;

 

Integer j = 5;

 

我们得到的是同一个对象。这是通过类库的设计来实现的。而String的共享是通过java虚拟机的直接支持来实现的,这是它们本质的不同。

 

    这是Integer类中的部分代码:

 

private static class IntegerCache {

 

   private IntegerCache(){}

 

   static final Integer cache[] = new Integer[-(-128) + 127 + 1];

 

   static {

 

       for(int i = 0; i < cache.length; i++)

 

       cache[i] = new Integer(i - 128); 

   }

 

 }

 

public static Integer valueOf(int i) {

 

   final int offset = 128;

 

   if (i >= -128 && i <= 127) { // must cache

 

       return IntegerCache.cache[i + offset];

 

   }

 

    return new Integer(i);

 

    }

 

关于基本类型的装箱,Java语言规范中有如下说明:

 

    如果被装箱的变量p为true,false,一个处于/u0000~/u007f之间的byte/char,或一个处于-128~+127之间的int/short,令r1和r2为对p的任何两个装箱操作的结果,则r1==r2总是成立的。理想的情况下,对一个基本类型变量执行装箱操作,应该总是得到一个相同的引用。但在实践中,在现存的技术条件下,这是不现实的。上面的规则是一个注重实效的折衷。

 

    最后一点,要理解java的方法调用时的传参模型:java中只有pass by value。(不明确这一点,就有乱七八糟的解释,比如典型的Java既有传值,又有传引用,String很特殊……)

 

//改变参数的值?

 

public void test(String str){

 

    str = "Hello";

 

}

 

//改变参数的值?

 

public void test(StringBuffer buffer){

 

    buffer = new StringBuffer("Hello");

 

}

 

//交换两个Integer?

 

public void swap(Integer a,Integer b){

 

    Integer temp = a;

 

    a = b;

 

    b = temp;

 

}

 

这三个方法全是没有意义的方法。

 

 

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/ZangXT/archive/2009/05/19/4201979.aspx

 

 

 

另一位高手的总结:

s = new String("xyz");创建了几个String Object?两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

 

String s="你好";int i=3; s=i+s; 这个表达式对吗?在java中会提示数据类型不匹配。因为string是类!正确做法: s+="3" 或者 s+='3'或者 s+=(char)i;

 

我们要引入另外一种创建String对象的方式的讨论——引号内包含文本。这种方式是String特有的,并且它与new的方式存在很大区别。

 

在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

 

字符串对象的创建:由于字符串对象的大量使用[它是一个对象,一般而言对象总是在heap分配内存],Java中为了节省内存空间和运行时间[如比较字符串时,==比equals()快],在编译阶段就把所有的字符串文字放到一个文字池中,而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。我们知道,对两个引用变量,使用==判断它们的值[引用]是否相等,即指向同一个对象:

 

    现在看String s = new String("abc");语句,这里"abc"本身就是pool中的一个对象,而在运行时执行new String()时,将pool中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s持有。ok,这条语句就创建了2个String对象。

 

    String s1 = new String("abc") ;String s2 = new String("abc") ;if( s1 == s2 ){ //不会执行的语句}

 

    //创建了几个String Object? [三个,pool中一个,heap中2个。]

 

只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中。对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中。

 

1.==表示引用自同一对象,equals()表示值相等。

 

String str1 = "abc";引用的对象在栈(或者叫String池)中。

 

String str1 =new String ("abc"); 引用的对象在内存/堆中。

 

2.String str1 =  "string";在栈中

 

  String str3 =  "str";在栈中

 

  String str4 = "ing";在栈中

 

  String str2 = str3+str4; 在堆中,因为+号的作用是返回另外一个新建的String对象,而不是在栈中找string这个值。如果是String str2 = "str"+"ing";那最后的结果就在栈中。str1==str2为true。

 

但是有一种情况需要引起我们的注意。请看下面的代码:

 

public class StringStaticTest {      

 

    public static final String A = "ab"; // 常量A

 

    public static final String B = "cd"; // 常量B

 

    public static void main(String[] args) {

 

         String s = A + B;  // 将两个常量用+连接对s进行初始化 

 

         String t = "abcd";   

 

        if (s == t) {   

 

             System.out.println("s等于t,它们是同一个对象");   

 

         } else {   

 

             System.out.println("s不等于t,它们不是同一个对象");   

 

         }   

 

     }   

 

}  

 

这段代码的运行结果如下:

 

s等于t,它们是同一个对象

 

原因是在上面的例子中,A和B都是常量,值是固定的,因此s的值也是固定的,它在类被编译时就已经确定了。也就是说:String s=A+B;  等同于:String s="ab"+"cd";

 

我对上面的例子稍加改变看看会出现什么情况:

 

public class StringStaticTest {       

 

    public static final String A; // 常量A

 

    public static final String B;    // 常量B

 

    static {   

 

         A = "ab";   

 

         B = "cd";   

 

     }   

 

     public static void main(String[] args) {   

 

        // 将两个常量用+连接对s进行初始化   

 

         String s = A + B;   

 

         String t = "abcd";   

 

        if (s == t) {   

 

             System.out.println("s等于t,它们是同一个对象");   

 

         } else {   

 

             System.out.println("s不等于t,它们不是同一个对象");   

 

         }   

 

     }   

 

}

 

它的运行结果是这样:

 

s不等于t,它们不是同一个对象

 

只是做了一点改动,结果就和刚刚的例子恰好相反。我们再来分析一下。A和B虽然被定义为常量(只能被赋值一次),但是它们都没有马上被赋值。在运算出s的值之前,他们何时被赋值,以及被赋予什么样的值,都是个变数。因此A和B在被赋值之前,性质类似于一个变量。那么s就不能在编译期被确定,而只能在运行时被创建了。

 

最后我们再来说说String对象在JAVA虚拟机(JVM)中的存储,以及字符串池与堆(heap)和栈(stack)的关系。我们首先回顾一下堆和栈的区别:

 

栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。

 

堆(heap):用于存储对象。

 

我们查看String类的源码就会发现,它有一个value属性,保存着String对象的值,类型是char[],这也正说明了字符串就是字符的序列。当执行String a="abc";时,JAVA虚拟机会在栈中创建三个char型的值'a'、'b'和'c',然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'},最后这个新创建的String对象会被添加到字符串池中。

 

如果我们接着执行String b=new String("abc");代码,由于"abc"已经被创建并保存于字符串池中,因此JAVA虚拟机只会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在栈中创建的三个char型值值'a'、'b'和'c'。

 

说到这里,我们对于篇首提出的String str=new String("abc")为什么是创建了两个对象这个问题就已经相当明了了。

 

 

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/yakihappy/archive/2009/03/10/3977169.aspx

 

 

 

langchain4j+milvus实战 本文主要研究一下如何使用langchain4j来对接向量数据库milvus。 阅读详情

相关推荐

跟着Synopsys报告,一步步拆解车规芯片FMEDA计算(含公式与避坑点)

本文详细解析了车规芯片FMEDA计算的全流程,基于Synopsys报告拆解实战指南,涵盖基础失效率建模、安全机制效能评估及安全指标合成等关键步骤。通过公式解析、数据准备清单和避坑点分享,帮助工程师掌握ISO26262标准下的硬件量化分析技术,提升车载系统设计可靠性。

weixin_30460489的博客 195

c++string替换指定位置字符_就这一张图,分分钟搞掂Python字符串的45个操作方法...

新朋友请点上方“数据分析师攻略”加关注前面文章我们介绍了有关Python字符串的内容,但也由于篇幅的问题没有完整地对字符串的操作方法进行讲解。为了补充这部分内容,小编今天爆肝整理了字符串所有操作方法,并制作成一张图,大家一定要好好看看这张图,因为熟知掌握了它,你以后对Python的字符串的操作必将顺手拈来。1、capitalize说明:把string的第一个字符大写语法:string.c...

weixin_39613188的博客 808

ANSYS Fluent DPM实战:从单点到锥形注入的粒子模拟全流程解析

本文深度解析了ANSYS Fluent中离散相模型(DPM)的粒子注入(Injection)设置全流程。从单点注入到锥形喷雾,详细阐述了不同注入类型的物理本质、参数逻辑与适用场景,并提供了粒径分布、湍流扩散等高级参数设置技巧与实战避坑指南,帮助工程师精准模拟喷雾、粉尘等粒子运动行为。

weixin_29276847的博客 654

“DBNull”到类型“String”的强制转换无效 & 如何将NULL写入SqlCommand的参数中?

从类型“DBNull”到类型“String”的强制转换无效这是经常会遇到的问题了,有人建议如下:If Not ds.Tables("file").Rows(0).Item(5).GetType Is System.DBNull.Value.GetType Then但如果每个字段都进行这样的判断,有点太麻烦了有人建议直接在select语句中搞掂:select name,isnull(memo,)

bigcarp的专栏 5969

微信支付开发之平台给用户转账到零钱的功能

请求消息中应包含商家批次单号、转账名称、appid、转账总金额、转账总笔数、转账openid、收款用户姓名等信息。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。【转账场景ID】 该批次转账使用的转账场景,如不填写则使用商家的默认场景,如无默认场景可为空,可前往“商家转账到零钱-前往功能”中申请。【转账总笔数】 一个转账批次单最多发起一千笔转账。【商家批次单号】 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一。

程序员weixin_sodomany的博客 3450

ESP-IDF 5.4下esp32-camera组件编译报错?手把手教你解决头文件缺失问题

本文详细解析了ESP-IDF 5.4环境下esp32-camera组件编译时出现的头文件缺失问题,提供了从目录结构优化、CMake配置到VSCode智能感知设置的完整解决方案。针对第三方组件集成难题,文章特别强调了PRIV_REQUIRES依赖声明和路径配置的关键作用,帮助开发者高效解决编译错误并建立稳定的开发环境。

weixin_28829629的博客 309

String,StringBuffer,StringBuilder,char[] & volatile对双重检查锁定的影响

昨天和师兄讨论,单例的最好

kringpin_lin的专栏 579

霍尔编码器 vs 磁编码器:如何为你的电机控制项目选择最佳传感器(附实战对比)

本文深入对比了霍尔编码器和磁编码器在电机控制项目中的应用,从技术原理、性能参数、成本效益到实际场景选择提供了全面分析。通过实验室测试和项目案例,帮助工程师根据精度、环境抗性和预算选择最佳传感器方案,特别适合机器人、伺服驱动等领域的开发者参考。

weixin_28312391的博客 352

python字符串操作_就这一张图,分分钟搞掂Python字符串操作方法

@数据分析师攻略 公众号关注、学习更多数据分析的知识与资讯------我们介绍了有关Python字符串的内容,但也由于篇幅的问题没有完整地对字符串的操作方法进行讲解。为了补充这部分内容,小编今天爆肝整理了字符串所有操作方法,并制作成一张图,大家一定要好好看看这张图,因为熟知掌握了它,你以后对Python的字符串的操作必将顺手拈来。1、capitalize说明:把string的第一个字符大写语法:s...

weixin_39874366的博客 268

机器学习面试笔试求职必背!八股文(1/5)

算法工程师,技术软件类求职机器学习必背八股文 更多算法/业务/HR面等笔试题面试题 —— >个性签名自取! 1. 特征工程: 1.1 为什么要对特征做归一化处理: Feature scaling,常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技术。特征间的单位(尺度)可能不同,比如身高和体重,比如摄氏度和华氏度,比如房屋面积和房间数,一个特征的变化范围可能是[ 1000 , 10000 ] [1000, 10000][1000,10000],另一个特征的变化范围可能是[ −.

大厂offer宝典 1万+

Python爬虫实战:利用Selenium与异步技术高效获取雪球财经数据

雪球财经作为国内领先的投资社交平台,汇聚了大量股票数据、财经资讯和投资者观点。对于金融数据分析师、量化投资者和研究人员来说,获取雪球平台的实时数据具有重要价值。然而,雪球网站采用了多种反爬虫机制,包括动态内容加载、请求频率限制和用户行为检测等,使得传统爬虫技术难以有效获取数据。本文将介绍如何使用Python的最新爬虫技术,包括Selenium WebDriver、异步请求处理和智能等待策略,来高效、稳定地爬取雪球财经数据。我们将重点解决以下几个技术难点:动态加载内容的处理登录状态维持与模拟。

2201_76125261的博客 1107

java中关于replaceAll和appendReplacement的笔记

今天在会友哥的电政导论课上写法师的作业,很简单,就是实现一个函数:屏蔽字符串参数text 中的网页链接信息,并且替换成"OMIT"+计数器. 正则表达式没有什么问题,但是在计数器上面就悲剧了,最初是用String 中的 replaceAll函数进行匹配和替换,三行代码搞掂: String s = text.replaceAll(regex,"OMIT"+(count++)); return

lulushiwulai 1027

52-Halcon-- smooth_object_model_3d函数功能(滑处理3D对象模型)

Halcon中smooth_object_model_3d算子详解 该算子用于3D模型平滑处理,提供三种算法:'laplacian'(快速去噪)、'taubin'(高质量防收缩)和'low_pass'(频域滤波)。核心参数包括迭代次数(默认5)、平滑强度(0-1)和边缘保护选项。典型应用包括扫描数据去噪、CAD模型光顺和逆向工程优化。支持自适应平滑、结合模型简化等高级技巧,并可通过分块处理优化大型模型性能。参数组合需根据具体场景选择,如快速去噪推荐拉普拉斯方法(5次迭代,强度0.3),特征保持推荐低通滤波(

weixin_45590420的博客 873

Grails hack之改变domain class id类型

上回书说到,Sam成功地利用AST在编译期往grails doamin class中注入了客制化的属性。由于grails自己注入的id默认为Long,而我需要String(这样才能把UUID String赋给id)。怎样把Long改成String呢?   可以在domain class中加入一行声明 String id 同时还可以这样指定id生成规则: static mapping = ...

sam.ds.chen 195

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

比较懒人的WDK环境配置方法

试了很多天了,终于搞掂。本人环境:Win7 X64旗舰版 + VS2010放出来,如下:1、安装了VS2010和最新的VirtualAssistX2、安装VMWare,我用的绿色版,7.1.2的,够用了,比VBox好。3、解压出VirtualKD,这个是绿色的,放好就行,用的时候运行其vmmon.exe即可。然后把他的target文件夹里面的东东拷到vm里运行即可。4、安装WinWDK,我只安装了其环境,其他什么都没有装。不要装它自带的WinDBG。另外,如果你安装的是比较旧的版本,又选择安装了WDK文档,

Rookie Rock 4394

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

记录一次微信发票---收取授权完成事件推送(多域名分发)

1、背景: 1.1 公司在开发电子发票插入微信卡包功能,涉及到用户授权成功之后,回调我们的问题,不多说了,搞起来。 2、流程步骤: 第一步:先在微信公众号里配置好回调链接: 第二步:编写好校验微信签名相关逻辑: <?php //微信开启服务器配置校验加密是否成功: $signature = isset($_GET["signature"]) ? $_GET[...

cyb_17302190874的博客 950

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

php文件打开错误404,利用404.PHP错误文件伪静态

今天在好文博客上看到它利用404.PHP错误文件伪静态,并且成功应用在FREE.FR上,个人感觉方法不错,特记录下来。以便日后应用在那些不知道自定义404的空间商。有的空间不支持Rewrite,但可以自定义404错误文件,这时候我们可自定义错误文件为404.php,这里以Discuz! 7.2为例,404.php文件内容为:$url=$_SERVER[‘REQUEST_URI’];if(preg_...

weixin_29144993的博客 635

java无效的字符串或缓冲区长度_[Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度 ----> 解决方法...

现在在弄单机的软件,是需要到数据库相连的。我这里选择了Access或者Excel这些比较通用的来作为数据库。但在连接数据库时已经成功,但就是出现在select语句里面报错,如下:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unkno...

weixin_29254029的博客 1094

变分自编码器(VAE)生成模型完整实战:3 步跑通多样化样本生成

训练集里只有几千张猫图,模型一生成新面孔,全是同一只猫换了个色号。照 Machine Learning Yearning 中文版(《机器学习训练秘籍》)开源仓库的结构,我们把 VAE(变分自编码器)这类生成模型,从原理聊到样本生成。 ## 🗺️ 3分钟读懂:VAE 和自编码器差在哪 VAE 只干一件事:把图像压成一组数字(潜在表示),再从这组数字的邻域里抽一组新数字,解码回一张新图。 潜在

gitblog_00191的博客 214

strstr c语言字符串,strstr截取字符串解决方案

strstr截取字符串一段字符串unsignedcharcc1[128]的内容是“s1=4521s2=4563s3=8795s4=7854”.求C语言代码,截取s3的值。即如何取得这个字符串中s3后面8795的值。我的代码,有问题。。。char*p1,p2;charp3[16];p1=strstr(cc1,"s3=");if(p1==NULL){printf("the...

weixin_31165655的博客 826

KimiK2.5技术解析:国产长文本大模型如何实现中文语义与逻辑能力跃迁

大语言模型的长上下文理解能力,是支撑金融尽调、政务公文处理、科研文献分析等高价值场景的核心基础。其本质依赖于位置编码机制(如RoPE)对远距离语义关联的建模精度,以及针对中文语法特性(如动词短语边界、古汉语虚词)的专项语义解析能力。技术价值不仅体现为C-Eval、CMMLU等基准分数提升,更在于128K上下文下的跨段落逻辑锚定、非结构化表格语义对齐与低资源指令泛化稳定性。当前,以KimiK2.5为代表的国产闭源模型正通过Hybrid-RoPE架构、VP-Boundary Detector和Ancient-P

weixin_33885676的博客 811

积累的一些技术性常识

<br />1.<br />......代码段......<br /><script language="javascript"><br />alert("数据插入成功");<br /></script><br /><%response.sendRedirect("adddoc.jsp");%> <br /></body>   <br /></html> <br />以前我的意途是弹出一个对话框后再sendRedirect,因为JSP是在服务器端执行,所以必须这样:<br /><script languag

leoj725的专栏 516

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 271

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 230

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 125
上一篇: 多线程和多进程的区别(小结 转载)
下一篇: String 和StringBuffer,StringBuilder的区别
Java_Cowboy
博客等级 码龄19年 59粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值