1.数组
在Java中,数组本身就是一种引用数据类型,它是一组相同数据类型的数据的有序集合,该集合中的数据称为数组元素。
对于一维数组,可以在声明的时候同时进行初始化,如下:
1
char []c={'A','B','C','D'}; //注意没有new
通过这种方法,也是在栈中存放一个地址,然后在堆中开辟4个2B大小的连续空间,用于存放A、B、C、D四个元素。
二维数组可以动态实例化,例如:
1
2
3int a[][]=new int[2][]; //分配两行,即两个一维数组
int a[0]=new int[3]; //第一行数组,有3个元素
int a[1]=new int[5]; //第二行数组,有5个元素注意,多维数组中维与维之间的内存空间的分配是不连续的。
2.字符串
Java提供了String和StringBuffer两个字符串类,String字符串在初始化后不能在被修改,StringBuffer字符串内容可以动态修改。
不可变字符串:String
String字符串的内存分配机制(可参考String直接赋值与new赋值区别那篇文章)
这里值得注意的是:1
2String s1="Hello"; //这个只会在栈中创建一个空间存储Hello
s1=s1+" world"; //使用这句话会使得s1指向一个栈中地址,地址指向堆中开辟的空间存放Hello字符串修改,String类提供了replace(),toLowerCase(),toUpperCase(),trim()//将字符串前后的空格去掉。
这里的修改,并不是在字符串原来的内存位置上进行,而是在新的内存空间上存放修改好的字符串,因此这里还是满足前面所说的String类是不可修改字符串的。
可变字符串:StringBuffer
- 与String可以直接赋值不同,StringBuffer必须通过new来赋值。
- StringBuffer对字符串的修改主要包括追加,插入,删除,替换,翻转等操作,可以通过append()、insert()、delete()、replace()、reverse()等方法实现。
String与StringBuffer在内存分配上的差异
String会修改对象地址,如:
1 | String s=new String("I love football game"); |
变量s在栈中的地址随着在堆中的内容改变而发生改变。
StringBuffer不会修改地址,如,
1 | StringBuffer sb=new StringBuffer("Hello"); |
变量sb在栈中的地址不会随堆中的内容的改变而改变
3.字符串与其他数据类型转换
将其他数据转换为字符串
String类提供了静态的valueof()方法,用于把不同类型的数据转换为字符串,方法如下:
1 | String s=String.valueof(a); //为其他数据类类型的变量,返回值为一个String对象 |
另一方面,从java.lang.Object派生的所有类均提供了toString()方法,即将该类转换成字符串,方法如下:
1 | String s=Integer.toString(a); //a是一个int类型的对象。 |
将字符串转换成其他数据
也是运用对应包装类的方法,方法如下:
1 | boolean b=Boolean.parseBoolean("True"); //将String类型转换为boolean类型 |
4.枚举
创建枚举的目的是为了定义一组性质类似的常量,它在Java中是一个小功能,但给系统开发带来了很大的方便。
枚举定义
枚举定义格式如下:
1 | [protected|private|abstract]enum 枚举类型标识符(名称){ |
枚举变量和常量
- 不能通过new运算符创建实例对象,可直接通过枚举类型标识符访问枚举变量。
- 可通过枚举变量访问枚举常量。
- 可通过枚举常量调用其成员方法。
- 可通过values()方法获得该枚举类型的所有枚举常量。