l 二维数组
int a[]=new int [2][];
a[0]=new int [3];
a[1]=new int [5];
在Java语言中,二维数组被看做是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小都相同。
数组一旦创建后,不能调整大小,但可使用相同的引用变量来引用一个
全新的数组,如:int a[]=new int [6];a=new int [10];
数组长度可用数组名.length来引用,对于二维数组,返回最高维的长度。
l String字符串内存分配
String字符串的内存分配是根据不同情况在栈中或堆中进行,在栈内
存空间通常又称为字符串常量池,常量池是指在编译期被确定,并被保存在已编译的.class文件中的一些数据,它包括关于类,方法,接口等中的变量,也包括字符串常量,首先,Java会确保一个字符串常量只有一个拷贝,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,用new string()创建的字符串不是常量,不能在编译期就确定,所以new string()创建的字符串不放入常量池中,它们有自己的地址空间,即堆空间。如:
String s1=”hello”;
//当编译到s1时,会检查常量池中是否已存在“hello”,若存在,则s1直接指向该字符串,若不存在,则在栈中新开辟一块空间用于存放“hello”,同时s1指向它.
String s2=”hello”;
//由于已存在“hello”,s2直接指向它
String s3=”he”+”llo”;
//编译器会明确认为s3的值为“hello”,所以s3指向常量池中的“hello”
String s4=new string(“hello”);
String s5=new string(“hello”);
//对于s4,s5,根据Java编译规则,编译期无法确定,而是后期在执行时在堆内存中分别为其各开辟一块空间并分别存放“hello”,然后s4和s5在栈内存中分别存放指向对应的堆内存空间的地址。
S1=s1+”world”;
//对以上而言,Java处理方式是为s1按照堆内存分配策略重新分配,s1从常量池中断开并指向堆内存中相应空间。
Length()方法可获取字符串的长度,即该字符串包含多少个字符,该方法返回的是字符串中16位的unicode字符的数量而不是其所占字节数。
字符串比较:equals(),equalsIgnoreCase(),startsWith(),endsWith()
Equals()方法用于比较两个字符串所包含的内容是否相同,该方法区分大小写:
(1) 对于字符串变量来说,使用==运算符和equals()方法来比较是不同的。“==”运算符用于比较两个变量本身的值,即两个对象在内存中的首地址,equals()方法比较的是两个字符串中包含的内容是否相同。
(2) 对非字符串变量来说,使用==运算符和equals()方法都是来比较其所指对象在堆内存中的首地址,即比较两个类类型的变量是否指向同一个对象。
字符串连接:字符串连接通常使用“+”运算符,也可以使用concat()方法。
字符串截取子串:从字符串中截取子串采用substring()方法,有两个重载方法。
字符串查找:charAt(),indexOf(),lastIndexOf()等
字符串修改:
replace(char oldchar,char newchar),toLowerCase(),toUpperCase(),trim()(去掉空格)等方法对字符串进行修改,这里的修改并不是在字符串原来的内存位置上进行,而是在新的内存空间上存放修改好的字符串,因此仍符合“string类是不可修改字符串”的性质。
l 可变字符串
StringBuffer类创建的字符序列是可修改的,即一个StringBuffer对象所对应的内存空间可以自动改变大小以便于存放一个可变化的字符串。StringBuffer实例化只能采用new来实现,其实质是调用其构造方法,而不能用“=”对其赋值。
StringBuffer s=new StringBuffer(“hello world”);
StringBuffer对字符串修改主要包括追加,插入,删除,替换,翻转等操作,可通过append(),insert(),delete(),replace(),reverse()等方法实现。
StringBuffer和String的异同:
(1) 内存分配的差异
String类创建的字符串对象是不可修改的,string型变量所指向的内存空间中的内容是不能被改变的,但该变量可用于指向另外的内存空间。对于stringBuffer类而言,在一开始初始化之后,可以对其在堆内存中的内容进行修改。
(2) 执行效率分析
(3) 选用string和StringBuffer注意事项:
a) 在编译期能确定字符串值时,采用“string s=””;”形式来定义,使用“+”时字符串连接的性能最佳(即string s=”hello”+”world”;)
b) 经常改变字符串的操作或在运行时才能确定字符串时,采用StringBuffer
c) 尽量不要使用new创建string对象
d) 在声明StringBuffer对象时,指定合适的容量,如
StringBuffer sb=new StringBuffer(1024);
//表示初始化时分配1024B给sb