- 浏览: 153372 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
accphc:
String是char[]的包装类,包装类的特质之一就是在对其 ...
Java中String类型的参数传递问题的解析 -
cyq7on:
lz,就最后没大懂,数组不是引用传递吗?
Java中String类型的参数传递问题的解析 -
di1984HIT:
xie de henhao a
Java class反编译后的代码还原 -
润之哥:
额 值传递 和引用传递 很蛋疼啦 ~~~
Java中String类型的参数传递问题的解析
(原创)深入研究java对String字符串对象的创建以及管理
(2008-9-27 bbh)
新手初学,不对的地方大家多多指教~
经常看到很多人讨论java中关于String的问题,我也就有点兴趣了,鉴于网上很多人写的都差别很大,
同样的问题都是不同的说法,我很迷糊,花了一晚上读了Java Virtual Machine Specification和
The Java Language Specification的一些章节,做了很多试验,总结了一下关于String的内容,还
有很多内容我也不确定,在下面也都提出来了,希望高手能指正.
Constant Pool常量池的概念:
在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太
明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容.
String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Pool,也有人称为
String Constant Pool.好像没有正式的命名??
在java编译好的class文件中,有个区域称为Constant Pool,他是一个由数组组成的表,类型
为cp_info constant_pool[],用来存储程序中使用的各种常量,包括Class/String/Integer等各
种基本Java数据类型,详情参见The Java Virtual Machine Specification 4.4章节.
对于Constant Pool,表的基本通用结构为:
cp_info {
u1 tag;
u1 info[];
}
tag是一个数字,用来表示存储的常量的类型,例如8表示String类型,5表示Long类型,info[]根据
类型码tag的不同会发生相应变化.
对于String类型,表的结构为:
CONSTANT_String_info {
u1 tag;
u2 string_index;
}
tag固定为8,string_index是字符串内容信息,类型为:
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
tag固定为1,length为字符串的长度,bytes[length]为字符串的内容.
(以下代码在jdk6中编译)
为了详细理解Constant Pool的结构,我们参看一些代码:
String s1 = "sss111";
String s2 = "sss222";
System.out.println(s1 + " " + s2);
由于"sss111"和"sss222"都是字符串常量,在编译期就已经创建好了存储在class文件中.
在编译后的class文件中会存在这2个常量的对应表示:
08 00 11 01 00 06 73 73 73 31 31 31 08 00 13 01 ; ......sss111....
00 06 73 73 73 32 32 32 ; ..sss222
根据上面说的String常量结构,我们分析一下
开始的08为CONSTANT_String_info结构中的tag,而11应该是它的相对引用,01为
CONSTANT_Utf8_info的tag,06为对应字符串的长度,73 73 73 31 31 31为字符串对
应的编码,接着分析,会发现后面的是对应"sss222"的存储结构.
经过上面分析,我们知道了11和13是两个字符串的相对引用,就可以修改class文件
来修改打印的内容,把class文件中的
00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 12 4D
改成
00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 10 4D
程序就会输出sss111 sss111,而不是和原程序一样输出sss111 sss222,因为我
们把对"sss222"的相对引用12改成了对"sss111"的相对引用10.
------------分割线
public class Test {
public static void main(String[] args) {
String s1 = "sss111";
String s2 = "sss111";
}
}
在上面程序中存在2个相同的常量"sss111",对于n个值相同的String常量,在Constant Pool中
只会创建一个,所以在编译好的class文件中,我们只能找到一个对"sss111"的表示:
000000abh: 08 00 11 01 00 06 73 73 73 31 31 31 ; ......sss111
在程序执行的时候,Constant Pool会储存在Method Area,而不是heap中.
另外,对于""内容为空的字符串常量,会创建一个长度为0,内容为空的字符串放到Constant Pool中,
而且Constant Pool在运行期是可以动态扩展的.
关于String类的说明
1.String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能
再修改此对象中存储的字符串内容,就是因为如此,才说String类型是不可变的(immutable).
2.String类有一个特殊的创建方法,就是使用""双引号来创建.例如new String("i am")实际创建了2个
String对象,一个是"i am"通过""双引号创建的,另一个是通过new创建的.只不过他们创建的时期不同,
一个是编译期,一个是运行期!
3.java对String类型重载了+操作符,可以直接使用+对两个字符串进行连接.
4.运行期调用String类的intern()方法可以向String Pool中动态添加对象.
String的创建方法一般有如下几种
1.直接使用""引号创建.
2.使用new String()创建.
3.使用new String("someString")创建以及其他的一些重载构造函数创建.
4.使用重载的字符串连接操作符+创建.
例1
/*
* "sss111"是编译期常量,编译时已经能确定它的值,在编译
* 好的class文件中它已经在String Pool中了,此语句会在
* String Pool中查找等于"sss111"的字符串(用equals(Object)方法确定),
* 如果存在就把引用返回,付值给s1.不存在就会创建一个"sss111"放在
* String Pool中,然后把引用返回,付值给s1.
*
*/
String s1 = "sss111";
//此语句同上
String s2 = "sss111";
/*
* 由于String Pool只会维护一个值相同的String对象
* 上面2句得到的引用是String Pool中同一个对象,所以
* 他们引用相等
*/
System.out.println(s1 == s2); //结果为true
例2
/*
* 在java中,使用new关键字会创建一个新对象,在本例中,不管在
* String Pool中是否已经有值相同的对象,都会创建了一个新的
* String对象存储在heap中,然后把引用返回赋给s1.
* 本例中使用了String的public String(String original)构造函数.
*/
String s1 = new String("sss111");
/*
* 此句会按照例1中所述在String Pool中查找
*/
String s2 = "sss111";
/*
* 由于s1是new出的新对象,存储在heap中,s2指向的对象
* 存储在String Pool中,他们肯定不是同一个对象,只是
* 存储的字符串值相同,所以返回false.
*/
System.out.println(s1 == s2); //结果为false
例3
String s1 = new String("sss111");
/*
* 当调用intern方法时,如果String Pool中已经包含一个等于此String对象
* 的字符串(用 equals(Object)方法确定),则返回池中的字符串.否则,将此
* String对象添加到池中,并返回此String对象在String Pool中的引用.
*/
s1 = s1.intern();
String s2 = "sss111";
/*
* 由于执行了s1 = s1.intern(),会使s1指向String Pool中值为"sss111"
* 的字符串对象,s2也指向了同样的对象,所以结果为true
*/
System.out.println(s1 == s2);
例4
String s1 = new String("111");
String s2 = "sss111";
/*
* 由于进行连接的2个字符串都是常量,编译期就能确定连接后的值了,
* 编译器会进行优化直接把他们表示成"sss111"存储到String Pool中,
* 由于上边的s2="sss111"已经在String Pool中加入了"sss111",
* 此句会把s3指向和s2相同的对象,所以他们引用相同.此时"sss"和"111"
* 两个常量不会再创建.
*/
String s3 = "sss" + "111";
/*
* 由于s1是个变量,在编译期不能确定它的值是多少,所以
* 会在执行的时候创建一个新的String对象存储到heap中,
* 然后赋值给s4.
*/
String s4 = "sss" + s1;
System.out.println(s2 == s3); //true
System.out.println(s2 == s4); //false
System.out.println(s2 == s4.intern()); //true
例5
这个是The Java Language Specification中3.10.5节的例子,有了上面的说明,这个应该不难理解了
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 Pool中.
2.使用new String("")创建的对象会存储到heap中,是运行期新创建的.
3.使用只包含常量的字符串连接符如"aa" + "aa"创建的也是常量,编译期就能确定,已经确定存储到String Pool中.
4.使用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在heap中.
6.使用"aa" + s1以及new String("aa" + s1)形式创建的对象是否加入到String Pool中我不太确定,可能是必须
调用intern()方法才会加入,希望高手能回答 @_@
还有几个经常考的面试题:
1.
String s1 = new String("s1") ;
String s2 = new String("s1") ;
上面创建了几个String对象?
答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个.
2.
String s1 = "s1";
String s2 = s1;
s2 = "s2";
s1指向的对象中的字符串是什么?
答案: "s1"
==================分割线=====================
上面的一些问题
System.out.print((hello == ("Hel"+lo)) + " ");返回false
之前有lo="lo"了,那么在String pool里面应该有相关内容了啊
在"Hel"+lo为什么编译器不会找到它把它优化呢,难道根据lo编译器没有办法得到它是"lo"吗
编译器还没这么聪明,lo是个变量,具体指向的是什么内容还是运行的时候决定的。
举个常量和变量的例子看看:
public class Test{
public static void main(String[] args) {
final String aa="Hello"; //常量
String bb="World"; //变量
System.out.println(aa);
System.out.println(bb);
}
}
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String World
2: astore_2 //实现bb="World";
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: ldc #4; //String Hello,这个是直接从常量池中取得。
8: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
11: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
14: aload_2
15: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
18: return
}
可以看出常量和变量的区别。
常量是输出的时候直接把"Hello"读过来了。
变量是输出的时候去访问bb(aload_2操作),然后再打印。
原文地址:http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html?20773
可不可以再详细解释一下
(2008-9-27 bbh)
新手初学,不对的地方大家多多指教~
经常看到很多人讨论java中关于String的问题,我也就有点兴趣了,鉴于网上很多人写的都差别很大,
同样的问题都是不同的说法,我很迷糊,花了一晚上读了Java Virtual Machine Specification和
The Java Language Specification的一些章节,做了很多试验,总结了一下关于String的内容,还
有很多内容我也不确定,在下面也都提出来了,希望高手能指正.
Constant Pool常量池的概念:
在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太
明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容.
String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Pool,也有人称为
String Constant Pool.好像没有正式的命名??
在java编译好的class文件中,有个区域称为Constant Pool,他是一个由数组组成的表,类型
为cp_info constant_pool[],用来存储程序中使用的各种常量,包括Class/String/Integer等各
种基本Java数据类型,详情参见The Java Virtual Machine Specification 4.4章节.
对于Constant Pool,表的基本通用结构为:
cp_info {
u1 tag;
u1 info[];
}
tag是一个数字,用来表示存储的常量的类型,例如8表示String类型,5表示Long类型,info[]根据
类型码tag的不同会发生相应变化.
对于String类型,表的结构为:
CONSTANT_String_info {
u1 tag;
u2 string_index;
}
tag固定为8,string_index是字符串内容信息,类型为:
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
tag固定为1,length为字符串的长度,bytes[length]为字符串的内容.
(以下代码在jdk6中编译)
为了详细理解Constant Pool的结构,我们参看一些代码:
String s1 = "sss111";
String s2 = "sss222";
System.out.println(s1 + " " + s2);
由于"sss111"和"sss222"都是字符串常量,在编译期就已经创建好了存储在class文件中.
在编译后的class文件中会存在这2个常量的对应表示:
08 00 11 01 00 06 73 73 73 31 31 31 08 00 13 01 ; ......sss111....
00 06 73 73 73 32 32 32 ; ..sss222
根据上面说的String常量结构,我们分析一下
开始的08为CONSTANT_String_info结构中的tag,而11应该是它的相对引用,01为
CONSTANT_Utf8_info的tag,06为对应字符串的长度,73 73 73 31 31 31为字符串对
应的编码,接着分析,会发现后面的是对应"sss222"的存储结构.
经过上面分析,我们知道了11和13是两个字符串的相对引用,就可以修改class文件
来修改打印的内容,把class文件中的
00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 12 4D
改成
00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 10 4D
程序就会输出sss111 sss111,而不是和原程序一样输出sss111 sss222,因为我
们把对"sss222"的相对引用12改成了对"sss111"的相对引用10.
------------分割线
public class Test {
public static void main(String[] args) {
String s1 = "sss111";
String s2 = "sss111";
}
}
在上面程序中存在2个相同的常量"sss111",对于n个值相同的String常量,在Constant Pool中
只会创建一个,所以在编译好的class文件中,我们只能找到一个对"sss111"的表示:
000000abh: 08 00 11 01 00 06 73 73 73 31 31 31 ; ......sss111
在程序执行的时候,Constant Pool会储存在Method Area,而不是heap中.
另外,对于""内容为空的字符串常量,会创建一个长度为0,内容为空的字符串放到Constant Pool中,
而且Constant Pool在运行期是可以动态扩展的.
关于String类的说明
1.String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能
再修改此对象中存储的字符串内容,就是因为如此,才说String类型是不可变的(immutable).
2.String类有一个特殊的创建方法,就是使用""双引号来创建.例如new String("i am")实际创建了2个
String对象,一个是"i am"通过""双引号创建的,另一个是通过new创建的.只不过他们创建的时期不同,
一个是编译期,一个是运行期!
3.java对String类型重载了+操作符,可以直接使用+对两个字符串进行连接.
4.运行期调用String类的intern()方法可以向String Pool中动态添加对象.
String的创建方法一般有如下几种
1.直接使用""引号创建.
2.使用new String()创建.
3.使用new String("someString")创建以及其他的一些重载构造函数创建.
4.使用重载的字符串连接操作符+创建.
例1
/*
* "sss111"是编译期常量,编译时已经能确定它的值,在编译
* 好的class文件中它已经在String Pool中了,此语句会在
* String Pool中查找等于"sss111"的字符串(用equals(Object)方法确定),
* 如果存在就把引用返回,付值给s1.不存在就会创建一个"sss111"放在
* String Pool中,然后把引用返回,付值给s1.
*
*/
String s1 = "sss111";
//此语句同上
String s2 = "sss111";
/*
* 由于String Pool只会维护一个值相同的String对象
* 上面2句得到的引用是String Pool中同一个对象,所以
* 他们引用相等
*/
System.out.println(s1 == s2); //结果为true
例2
/*
* 在java中,使用new关键字会创建一个新对象,在本例中,不管在
* String Pool中是否已经有值相同的对象,都会创建了一个新的
* String对象存储在heap中,然后把引用返回赋给s1.
* 本例中使用了String的public String(String original)构造函数.
*/
String s1 = new String("sss111");
/*
* 此句会按照例1中所述在String Pool中查找
*/
String s2 = "sss111";
/*
* 由于s1是new出的新对象,存储在heap中,s2指向的对象
* 存储在String Pool中,他们肯定不是同一个对象,只是
* 存储的字符串值相同,所以返回false.
*/
System.out.println(s1 == s2); //结果为false
例3
String s1 = new String("sss111");
/*
* 当调用intern方法时,如果String Pool中已经包含一个等于此String对象
* 的字符串(用 equals(Object)方法确定),则返回池中的字符串.否则,将此
* String对象添加到池中,并返回此String对象在String Pool中的引用.
*/
s1 = s1.intern();
String s2 = "sss111";
/*
* 由于执行了s1 = s1.intern(),会使s1指向String Pool中值为"sss111"
* 的字符串对象,s2也指向了同样的对象,所以结果为true
*/
System.out.println(s1 == s2);
例4
String s1 = new String("111");
String s2 = "sss111";
/*
* 由于进行连接的2个字符串都是常量,编译期就能确定连接后的值了,
* 编译器会进行优化直接把他们表示成"sss111"存储到String Pool中,
* 由于上边的s2="sss111"已经在String Pool中加入了"sss111",
* 此句会把s3指向和s2相同的对象,所以他们引用相同.此时"sss"和"111"
* 两个常量不会再创建.
*/
String s3 = "sss" + "111";
/*
* 由于s1是个变量,在编译期不能确定它的值是多少,所以
* 会在执行的时候创建一个新的String对象存储到heap中,
* 然后赋值给s4.
*/
String s4 = "sss" + s1;
System.out.println(s2 == s3); //true
System.out.println(s2 == s4); //false
System.out.println(s2 == s4.intern()); //true
例5
这个是The Java Language Specification中3.10.5节的例子,有了上面的说明,这个应该不难理解了
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 Pool中.
2.使用new String("")创建的对象会存储到heap中,是运行期新创建的.
3.使用只包含常量的字符串连接符如"aa" + "aa"创建的也是常量,编译期就能确定,已经确定存储到String Pool中.
4.使用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在heap中.
6.使用"aa" + s1以及new String("aa" + s1)形式创建的对象是否加入到String Pool中我不太确定,可能是必须
调用intern()方法才会加入,希望高手能回答 @_@
还有几个经常考的面试题:
1.
String s1 = new String("s1") ;
String s2 = new String("s1") ;
上面创建了几个String对象?
答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个.
2.
String s1 = "s1";
String s2 = s1;
s2 = "s2";
s1指向的对象中的字符串是什么?
答案: "s1"
==================分割线=====================
上面的一些问题
System.out.print((hello == ("Hel"+lo)) + " ");返回false
之前有lo="lo"了,那么在String pool里面应该有相关内容了啊
在"Hel"+lo为什么编译器不会找到它把它优化呢,难道根据lo编译器没有办法得到它是"lo"吗
编译器还没这么聪明,lo是个变量,具体指向的是什么内容还是运行的时候决定的。
举个常量和变量的例子看看:
public class Test{
public static void main(String[] args) {
final String aa="Hello"; //常量
String bb="World"; //变量
System.out.println(aa);
System.out.println(bb);
}
}
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String World
2: astore_2 //实现bb="World";
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: ldc #4; //String Hello,这个是直接从常量池中取得。
8: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
11: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
14: aload_2
15: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
18: return
}
可以看出常量和变量的区别。
常量是输出的时候直接把"Hello"读过来了。
变量是输出的时候去访问bb(aload_2操作),然后再打印。
原文地址:http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html?20773
可不可以再详细解释一下
发表评论
-
mina源码阅读1
2013-09-30 12:18 0服务端总体类结构如下:1. IoService接口: ... -
Address already in use:JVM_Bind 错误解决
2013-04-23 16:54 24621环境:win7 启动web工程的时候,报错: ... -
java回调函数的例子
2013-03-26 17:13 15936/** * * @author hongye.hw ... -
java 中annotation的使用
2013-03-10 18:32 4700最近在看一个同事写的web框架,其中大量使用了annotat ... -
jsoup使用
2013-01-14 11:09 1011jsoup是一个开源的html解 ... -
jmock 中unexpected invocation错误
2012-02-29 14:58 4793远程服务接口 public interface Rem ... -
生产者消费者模式
2011-10-22 18:15 954import java.util.Random; im ... -
java timeTask
2011-10-09 11:28 1654项目中要使用时间程序,定时执行一段代码。google一下 ... -
Java对象序列化(整理篇) 选择自 hdAptechIvan 的 Blog
2011-03-15 18:08 927在网上看了很多有关 ... -
Java class反编译后的代码还原
2011-02-17 14:15 7527Java class 利用jad 反编译之后,偶尔回碰 ... -
String作为参数传递
2010-10-06 21:48 2300import java.util.Arrays; ... -
继承与初始化
2010-09-30 17:27 918/** * @author hwy1782@gm ... -
线程池技术
2010-09-28 00:09 980转自:http://dev.csdn.net/ht ... -
堆排序
2010-09-23 10:24 994import org.junit.Test; /* ... -
数组的一个问题
2010-09-11 14:46 847一道基础题 int[] ... -
java中初始化顺序
2010-09-05 16:04 1036假设有个Dog类 一个例子: ... -
堆和堆栈的区别
2010-09-05 15:32 1506堆和堆栈的区别 ... -
synchronized的用法(转)
2010-09-01 13:55 1039synchronized 关键字,它包括两种用法:sy ... -
java synchronized 用法
2010-09-01 13:51 897synchronized 的语法: sync ... -
String Pool
2010-06-18 22:29 1179在jvm中存在着String Pool String对象是 ...
相关推荐
以下将详细解析从给定文件中提取出的关于“各种string类型转换”的知识点。 ### ANSI String与C风格字符串(char*)之间的转换 #### ANSI String转C风格字符串 ```cpp #include void __fastcall TForm1::Button1...
C#中char[]与string之间的转换是一种常见的操作,我们经常需要在这两种数据类型之间进行转换。今天,我们将探讨C#中char[]与string之间的转换,包括string转换成Char[]和Char[]转换成string,同时也会涉及到byte[]与...
首先,让我们探讨`double`转`string`的过程。C++标准库提供了一个名为`std::stringstream`的类,它可以将各种类型的数据流式传输到字符串中,反之亦然。以下是一个示例: ```cpp #include #include <string> ...
1. **HexString转Base64String**:此过程涉及到将每个十六进制字符转换为对应的二进制值,然后每连续的两个二进制值组成一个字节。接着,按照Base64的编码规则,将这些字节转换为Base64字符。 2. **Base64String转...
Java 中 String 类型转换方法是一种常见的编程操作,涉及到各种数据类型之间的转换,包括整型、浮点型、长整型、浮点型等。本文将详细介绍 Java 中 String 类型转换方法的各种形式。 整型到字符串 在 Java 中,将...
double strDou(std::string str) { // string转double char* ch = new char[str.length()]; double d; for (int i = 0; i != str.length(); i++) { ch[i] = str[i]; } d = atof(ch); return d; } ``` **1. ...
一、文件转STRING 1. 文件读取:首先,我们需要读取文件的内容。在Python中,可以使用`open()`函数以二进制模式('rb')打开文件,然后使用`read()`方法获取文件的二进制数据。 ```python with open('filename', '...
本篇将深入探讨JavaBean与JsonString之间的相互转换方法。 1. **什么是JavaBean** JavaBean是一种遵循特定规则的Java类,它主要用于封装数据,便于数据的存储和传递。JavaBean通常具有以下特点: - 是公共类...
List集合转换成String,String转List,Map转String,String转Map等 集合与字符串相互转换,可以自己扩展源码,带有注释
日期转换,long类型时间转换成string类型
### C# String 的各种转换 在C#编程语言中,字符串与数字之间的转换是非常常见的操作。本文将详细介绍如何在C#中实现字符串与其他数据类型(如整数、浮点数等)之间的转换,并特别关注字符串与十六进制之间的转换。...
本文将详细介绍如何将一个`List<String>`类型的集合转换为`String[]`数组,并通过不同的方法来实现这一过程。这不仅有助于提高代码的可读性和效率,还能帮助开发者更好地理解和运用Java集合框架。 #### 一、背景...
本篇文章将详细介绍如何在Android中使用Base64来实现文件与String之间的相互转换。 一、Base64编码原理 Base64是一种基于64个字符的编码方法,这些字符包括大小写字母、数字以及"+"和"/",还有一个用于填充的字符"=...
最近开发遇到blob类型转换为String,一时犯难。所以总结了一段代码与之分享。亲测
就是从String转换成Unicode和从Unicode转换成String编码转换
对于提供的文件"String与InputStream相互转换 - hanqunfeng的专栏 - CSDN博客_files"和"String与InputStream相互转换 - hanqunfeng的专栏 - CSDN博客.html",它们可能是详细的教程或示例代码,可以帮助进一步学习和...
`String Pool`是存储`String`字面量的缓存池,当通过字面量的方式创建`String`对象时,Java虚拟机首先检查`String Pool`中是否已经存在相同的字符串,如果存在,则返回该字符串的引用,而不是创建一个新的对象。...
本篇文章将深入探讨如何在Android中进行Bitmap与String之间的转换,以及这些转换在实际应用中的场景。 首先,我们要理解Bitmap与String转换的原理。Bitmap是Android系统中用来表示图像的类,它包含了图像的所有像素...
本文将深入探讨`String`与JSON的互转方法,并提供一个简单的测试案例。 一、`String`转`JSON` 1. 使用`org.json`库 `org.json`库提供了一个名为`JSONObject`的类,可以将`String`转换为JSON对象。首先,确保你的...
### JavaScript Date对象转换为字符串 在JavaScript中,`Date`对象提供了多种方法来获取和设置日期及时间。本文将详细介绍如何将`...以上就是关于JavaScript中`Date`对象转换为字符串的相关知识点,希望对你有所帮助!