java中Stirng类的深究
常看到很多人讨论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
相关文档:
XML文件 book.xml
<book>
<person>
<first>Kiran</first>
<last>Pai</last>
<age>22</age>
</person>
<person>
<first>Bill</first>
<last>Gates</last>
<age>46</age>
</person>
<person>
&l ......
归纳一些网上取JAVA路径的方法:
注明:如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。
得到classpath和当前类的绝对路径的一些方法
获得CLASSPATH之外路径的方法:
URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/ ......
以O(n)的时间实现对正整数的排序。思路是:从最末位开始,对数组中每一个数的第k位进行计数排序,直到排到最高位为止。
缺点:只能对正整数进行排序,而且需要知道最大整数的最高位,使用范围太小。但这不失为一个很有趣的排序,因为它颠覆了比较排序的传统思路。
public static int[] radixSort(int[] inputs,int d){
......
public static void main(String args[]) {
Comparator cmp = (RuleBasedCollator)java.text.Collator.getInstance(java.util.Locale.CHINA);
String[] array = {"张三", "李四", "王五"};
Arrays.sort(array, cmp);
for(String str : array){
System.out.println(str);
}
} ......
佟强 http://blog.csdn.net/microtong
OakCMS内容管理系统 http://www.oakcms.cn http://www.oakcms.net
一元二次方程ax2+bx+c=0,输入a,b,c三个系数,求解方程,结果有三种情况:两个实数根、一个实数根、两个复数根。
/**
* Equation.java
*/
package cn.edu.uibe.oop;
/**
* 计算 ......