C/C++的字符串和JAVA的String对象
2013-05-09 14:09
453 查看
1.关于C/C++的字符串与JAVA中的String对象基础知识
①char str1[] = "hello world";
char str2[] = "hello world";
str1 != str2; //str1和str2是两个字符串数组,我们会为它们分别分配两个长度为12个字节的,他们是两个初始地址不同的数组,故str1和str2不同;
②char * str3 = "hello world";
char * str4 = "hello world"; //str3和str4是两个指向字符串常量的指针,字符串常量在内存中只有一份拷贝;
③String str5 = "hello world";
String str6 = "hello world"; //JAVA中str5和str6是指向同一个String常量的句柄,它们指向的是常量池中的同一个String常量。
④String str1 = "ab" + "cd";
String str2 = "abcd";
String str3 = "ab";
String str4 = str3 + "cd";
str1 == str2; //为什么地址相同?str1在创建时"ab"和"cd"都是常量,变量str1在编译时就确定了,这里我们只创建了一个"abcd"放在常量池中;
str1 != str4; //为什么地址不同?只有使用引号包含文本的方式创建的String对象之间使用+连接产生的新对象才会放入常量池中,new方式产生的String对象(包括null)使用+产生的新对象不会放入常量池中;
⑤public static final String A = "ab";
public static final String B = "cd";
String str1 = A + B;
String str2 = "abcd";
str1 == str2; //A B是常量,str1在编译时就确定了
⑥public static final String A;
public static final String B;
static{
A = "ab";
B = "cd";
}
String str1 = A + B;
String str2 = "abcd";
str1 != str2; //A B虽然被定义为常量,但是它们没有被马上赋值,str1在编译时不能确定;
⑦Sting对象在JVM中的存储,字符串池与堆和栈的关系
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的length()方法:String对象在底层是char型数组,其length()方法返回的是数组的value长度;
⑨JAVA中一个char型变量的长度为2个字节,故它可以存储一个中文字符,但是一个byte变量就不能存储一个中文字符;
char a = '中';
char b = '国';
a + b != '中国'; //因为“+”运算符,当它被用于字符串和字符串之间,或者字符串和其他类型变量之间时,它产生的效果是字符串的拼接;但当它被用于字符 和字符之间时,效果等同于用于数字和数字之间,是一种算术运算。
2.C++替换空格
length为string字符串数组可以容纳的字符的数量
3.JAVA的字符串反转
to be continued:
JAVA不调用库函数实现字符串反转 回文 替换等等
①char str1[] = "hello world";
char str2[] = "hello world";
str1 != str2; //str1和str2是两个字符串数组,我们会为它们分别分配两个长度为12个字节的,他们是两个初始地址不同的数组,故str1和str2不同;
②char * str3 = "hello world";
char * str4 = "hello world"; //str3和str4是两个指向字符串常量的指针,字符串常量在内存中只有一份拷贝;
③String str5 = "hello world";
String str6 = "hello world"; //JAVA中str5和str6是指向同一个String常量的句柄,它们指向的是常量池中的同一个String常量。
④String str1 = "ab" + "cd";
String str2 = "abcd";
String str3 = "ab";
String str4 = str3 + "cd";
str1 == str2; //为什么地址相同?str1在创建时"ab"和"cd"都是常量,变量str1在编译时就确定了,这里我们只创建了一个"abcd"放在常量池中;
str1 != str4; //为什么地址不同?只有使用引号包含文本的方式创建的String对象之间使用+连接产生的新对象才会放入常量池中,new方式产生的String对象(包括null)使用+产生的新对象不会放入常量池中;
⑤public static final String A = "ab";
public static final String B = "cd";
String str1 = A + B;
String str2 = "abcd";
str1 == str2; //A B是常量,str1在编译时就确定了
⑥public static final String A;
public static final String B;
static{
A = "ab";
B = "cd";
}
String str1 = A + B;
String str2 = "abcd";
str1 != str2; //A B虽然被定义为常量,但是它们没有被马上赋值,str1在编译时不能确定;
⑦Sting对象在JVM中的存储,字符串池与堆和栈的关系
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的length()方法:String对象在底层是char型数组,其length()方法返回的是数组的value长度;
⑨JAVA中一个char型变量的长度为2个字节,故它可以存储一个中文字符,但是一个byte变量就不能存储一个中文字符;
char a = '中';
char b = '国';
a + b != '中国'; //因为“+”运算符,当它被用于字符串和字符串之间,或者字符串和其他类型变量之间时,它产生的效果是字符串的拼接;但当它被用于字符 和字符之间时,效果等同于用于数字和数字之间,是一种算术运算。
2.C++替换空格
length为string字符串数组可以容纳的字符的数量
void replaceSpace(char string[],int length){ if(string == null || length <= 0) return; int coutSpace = 0; int originalLength = 0; int i = 0; while(string[i] != "\0"){ originalLength++; if(string[i] == " ") countSpace++; i++; } int lengthAfterReplace = originalLength + countSpace * 2; if(lengthAfterReplace > length) return; int indexAfterReplace = lengthAfterReplace; int index = originalLength; while(index >= 0 && indexAfterReplace >= 0){ if(string[index] != " ") string[indexAfterReplace--] = string[index--]; else{ string[indexAfterReplace--] = "0"; string[indexAfterReplace--] = "2"; string[indexAfterReplace--] = "%"; index--; } }
3.JAVA的字符串反转
public class StringReverse{ public static void main(String[] args)[ String s = "A quick brown fox jumps over the lazy dog."; System.out.println("原始的字符串:" + s); System.out.print("反转后字符串:"); // 方法一 for(int i = s.length(); i > 0; i--){ System.out.print(s.charAt(i - 1)); } //方法二 char[] data = s.toCharArray(); for(int i = data.length; i > 0; i--){ System.out.print(data[i - 1]); } //方法三 StringBuffer sb = new StringBuffer(s); System.out.print(sb.reverse().toString()); } }
to be continued:
JAVA不调用库函数实现字符串反转 回文 替换等等
相关文章推荐
- 四、(2)C++访问Java的String字符串对象
- Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法
- js json对象转string java字符串转json 转java对象
- 详解Java String字符串对象的创建及管理(1)
- java中字符串基本知识 String s=new String("abc")创建了几个对象?
- Java基础(11):字符串—深入理解String对象和比较符==和equals的不同
- java基础(7)- 字符串(String)对象和数学(Math)对象
- 详解Java String字符串对象的创建及管理(2)
- 使用jackson的writeValueAsString把java对象输出成字符串实例,设置应答体的类型
- c\c++中比较两个字符串或string对象是否相等
- JNI学习笔记 C++传递结构体、String、数组对象给JavaC++传递结构体、String、数组对象给Java
- 深入研究java对String字符串对象的创建以及管理
- [C++]仿java.lang.String的字符串工具类[原]
- c\c++中比较两个字符串或string对象是否相等
- Java中字符串对象String、StringBuffer、StringBuilder的比较
- JSON的String字符串与Java的List列表对象的相互转换
- java对String字符串对象的创建及管理
- 深入研究java对String字符串对象的创建以及管理
- [C++]仿java.lang.String的字符串工具类[原]
- JAVA String对象和字符串常量的关系解析