一、字符串
1.字符串的不变性
String字符串在创建之后是不能修改的,所谓的修改就是创建一个新的字符串。所指向的内存空间是不同的。
String s1 = "java";
String s2 = "java";
String s3 = new String("java");
String s4 = new String("java");
//true,因为s1和s2在堆中只new了一次,他们指向同一个空间
System.out.println(s1==s2);
//false,s3使用了new关键字,重新在堆中创建了一个空间
System.out.println(s1==s3);
//false,s4也重新创建了空间
System.out.println(s3==s4);
//s1被修改,指向新的内存空间
s1 = "Hello "+s1;
System.out.println(s1);
String不可变的好处
1.String被设计成不可变,这样相同的字符串可以在常量池中取。
2.也可以让String作为参数,保证参数不可变。
3.String的不可变,也确保了线程的安全。
4.String做HashMap的key,那么String不可变保证hash值不可变,只需要计算一次,提高了效率
如果我们需要可变的字符串也可以使用StringBuffer和StringBuild。
二、==和equals
1.对于基本数据类型
==和equals都是比较值,没有区别
代码如下(示例):
int num1 = 20;
int num2 = 20;
System.out.println(num1==num2);
2.对于引用类型
==比较的是两个对象的地址值,而equals比较的是两个对象的内容
代码如下(示例):
int num1 = 20;
int num2 = 20;
String s1 = "aabbcc";
String s2 = new String("aabbcc");
System.out.println(num1==num2);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
—
三、字符串的常用方法
- 字符串去空-----trim()方法
- 根据索引返回字符—charAt()
- substring()方法----提取字符串中两个指定的索引号之间的字符
- toLowerCase()-----------把字符串转换为小写
- toUpperCase()-----------把字符串转换为大写
四、字符串的拼接
String s1 = "abc";
String s2 = "ab"+"c";
String s3 = new String("ab") +"c" ;
//true,java编译器会进行优化,使得s2=abc
System.out.println(s1==s2);
//false,因为进行了new虽然内容一样,但是重新创建了空间
System.out.println(s1==s3);
String s3 = s3+s1;
System.out.println(s4);
上面s3和s1拼接成了新的s3,但是在堆中我们本来被s3指向的空间现在没有人指向,就多浪费了空间,如果是很多字符串的拼接,那么代价就更大了,性能也会下降很多。
五、数组
数组就是一组相关变量的集合。缺点:长度固定,所以存在下标越界异常。
- 数组下标从零开始,超出数组长度,就会发生越界异常。
- 数组的每个元素都有默认值,引用类型是null。
- 数组有一个属性length:获取数组长度。
数组的内存是连续的,所以一般对于查询操作比较快速,因为可以直接通过地址的偏移量来确定需要查找的值的地址。但是对于插入和删除都比较慢,因为数组需要把插入之后的元素依次向后移一位(最后一位除外)。
1.数组开辟空间
int[] x = null;
x = new int[3];
x[0] = 10;
x[1] = 20;
x[2] = 30;
x = null;
2.数组的初始化
1.动态初始化:建立相应的空间,并附上默认值,再赋值时,是将默认值更改为新赋的值。
int[] nums = new int[3];
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
2.静态初始化:建立空间同时赋值,赋多少值,开辟多少空间。
int[] nums = {1,2,3};
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
2.Arrays
1.可以进行数组的排序,sort()方法
int[] nums = {-1,2,4,6,3,8,1};
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+" ");
}
2.对数组进行复制,copyOf(nums,count) (nums是要复制的数组,count是新数组的长度)
int[] nums = {-1,2,4,6,3,8,1};
int[] nums2 = Arrays.copyOf(nums, 9);
for (int i = 0; i < nums.length; i++) {
System.out.print(nums2[i]+" ");
}