Bootstrap

字符串和数组


一、字符串

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));

在这里插入图片描述

三、字符串的常用方法

  1. 字符串去空-----trim()方法
  2. 根据索引返回字符—charAt()
  3. substring()方法----提取字符串中两个指定的索引号之间的字符
  4. toLowerCase()-----------把字符串转换为小写
  5. 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指向的空间现在没有人指向,就多浪费了空间,如果是很多字符串的拼接,那么代价就更大了,性能也会下降很多。


五、数组

数组就是一组相关变量的集合。缺点:长度固定,所以存在下标越界异常。

  1. 数组下标从零开始,超出数组长度,就会发生越界异常。
  2. 数组的每个元素都有默认值,引用类型是null。
  3. 数组有一个属性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]+" ");
        }

在这里插入图片描述

;