计应本的自考笔记(5)-Java数组、字符串与向量

482 阅读6分钟

一维数组

  • 数组,是相同类型数据的有序集合。3个关键词,“相同类型的数据”+“有顺序的”+“集合”。实际上,系统一旦发现是数组集合,就会将集合中数据,存储在连续的内存位置上。
  • 通过下标访问数组中的元素,下标从0开始。
  • 数组是集合,存储的元素,可以是基础数据类型,也可以对象类型,或者是数组类型(也就是多维数组)。
// 定义基础数据类型数组
int[] numArr;   // int类型的数组
char charArr[]; // char类型的数组

// 定义对象类型的数组
Date dateArr[]; // Date类型的数组
Count CountArr[];   // Count类型的数组
  • 数组需要先声明/定义再使用。就如对象一样,声明后要new进行实例化。而数组定义时,也不会创建数组对象本身,并为其分配内存。要经过初始化后,才能使用数组,包括访问数组的元素等。
  • 但值得注意的是,Java不支持静态的数组定义,也就是声明数组时指定数组长度。如int numArr[5];
  • 数组的创建或者说初始化,分为“静态初始化”和“动态初始化”两种。
    • 静态初始化,就是在定义数组的同时,对数组的元素进行赋值。
    • 而动态初始化,则是先通过new运算符,创建指定数据类型的数组,并指定数组的长度,后续通过下标来给数组元素赋值。
// 数组的静态初始化
int[] numArr = {0, 1, 2, 3, 4, 5}
char charArr[] = {'C', 'h', 'i', 'n', 'a'}

// 数组的动态初始化 Liang
String names[];
names = new String[5];
names[0] = 'L';
names[1] = 'i';
names[2] = 'a';
names[3] = 'n';
names[4] = 'g';

// 对象类型的动态初始化
Date age[] = new Dat[2];
age[0] = new Date('1949');
age[1] = new Date('2022');

  • 通过下标,访问数组内的元素,下标也称为索引,都是从0开始,可以是整数的常量或者表达式。
  • 数组对象的length属性表示数组内元素的个数,我们可以通过length属性进行数组的边界检查。
  • 实际上,我们使用new创建数组时,会指定数组的长度,这时系统会自动赋值给length属性。而一旦数组创建,大小就固定了。

多维数组

  • 如果数组中元素也是数组,就是二维数组。同理,数组中再存数组,层层套娃,就是多维数组。
int[][] pointArr;   // 定义二维的int数组
char strArr[][][];  // 定义三维的char数组
Date dateRangeArr[][][][];  // 定义四维的Date数组
  • 与一维数组一样,多维数组的初始化也分为“静态初始化”和“动态初始化”
  • 静态初始化时,不必指定数组每一维的大小,系统会根据初始化给的初始值,自动计算数组每一维的大小
  • 动态初始化时,有两种分配内存的方式:直接分配与按维度分配
    • 直接分配就是声明数组时,给出各个维度数组的大小;
    • 按维分配就是从最高维度起,分别为每个维度分配内存;
// 静态初始化
int intArr[][] = {{1, 2}, {1, 3, 5}, {2, 4, 6}};

// 动态初始化-直接分配
int a[][] = new int[2][3];

// 动态初始-按维分配
int twoDim[][] = new int[4][]; // 先只分配第一维的数组大小
twoDim[0] = new int[5];
twoDim[1] = new int[5];
twoDim[2] = new int[5];
twoDim[3] = new int[5];

  • 多维数组也有length属性,也通过下标来访问数组内的元素。
  • 值得注意的是,不管一维还是多维数组,都是定长的。一旦创建后,数组的大小就不能再变化。如果需要改变数组,可以通过System.arraycopy()方法,将数组重新赋值给一个新的数组。
  • 同时,java.util.Arrays类,提供了一系列数组的静态方法:
    • equals(type[], type[]):判断两个数组的值是否相同;
    • sort(type[]):将数组按升序进行排序(如果数组内元素是对象,此方法将调用元素内对象的compareTo方法来比较);
    • fill(type[], type value):将value值填充到数组的每个元素;
    • binarySearch(type[], type value):采用二分查找法在数组中查找value值;

字符串类型

String与StringBuffer

  • Java中的字符串是由数个字符组成的序列,同时也是一个对象。Java的标准包java.lang封装了String和StringBuffer类,分别处理不变字符串和可变字符串。
  • 顾名思义,不变字符串是字符串一旦创建,内容就不能改变,即便调用String类的查找、比较、连接等操作,也不能插入新字符串,或者改变原来字符串本身。
  • Java字符串分为“常量”和“变量”,常量用双引号括起来,创建过程是隐式的,比如打印日志System.out.println("This is String");而变量则要先声明后初始化;
String s1;
StringBuffer sb1;

s1 = new String();
sb1 = new StringBuffer();

// 由字符串数组,创建字符串
char chars = {'a', 'b', 'c'};
String s2 = new String(chars);

// 用字符串常量初始化
String s3 = "Hello World";

// StringBuffer需要new来创建
StringBuffer strb3 = new StringBuffer(s3);

字符串操作与判断

  • 前面已经提到,String类的字符串是不可变的字符串。操作String字符串后,并不改变字符串本身,而是生成另一个实例。
  • StringBuffer类字符串处理可变字符串,不创建新字符串对象,而是直接操作字符串本身。

String和StringBuffer共有方法

  • length():返回字符串长度(字符个数);
  • charAt(int index):返回字符串中指定索引位置index的字符;
  • subString(int beginIndex):从beginIndex位置开始截取字符串,直到末尾;

String类独有的方法

  • replace(char oldChar, char newChar):将当前字符串中所有的oldChar,替换成newChar;
  • toLowerCase():将当前字符串中所有字符转换成小写形式;
  • toUpperCase():将当前字符串中所有字符转换成大写形式;
  • concat(String str):将str字符串,拼接到当前字符串末尾;
  • starsWith(String prefix):测试prefix是否为当前字符串的前缀;
  • trim():剔除字符串前后的空白;
  • valueOf(type value):将任意数据类型的参数value,转换成字符串;

StringBuffer类独有的方法

  • append(String str):将参数str添加到当前字符串的最后;
  • replace(int start, ind end, String str):将当前字符串中start到end的位置,替换成参数str;
  • capacity():返回当前字符串的容量;strbuferr_length = str_num + capacity

注意:系统为String类对象分配内存时,是按字符的实际个数等量分配的;而StringBuffer类分配内存时,除去字符所占的空间外,会再另外加入16个字符大小的缓冲区。

Vector(向量)类

  • Java引入Vector(向量)类,可看作是一个可变数组。这个数组的大小根据需要来改变,增加或删除元素,Vector会相应的变大或变小。除此之外,Vector可以存储不同类型的元素,但不能是基础数据类型。
Vector vList = new Vector();
vList.add(0, new String("开国大典"));
vList.add(1, new Date(1949));
vList.add(2, new String("举办北京奥运会"));
vList.add(3, new Date(2008));