首页 Java程序设计精讲四 第五章 数组和字符串
文章
取消

Java程序设计精讲四 第五章 数组和字符串

Java程序设计精讲四 第五章 数组和字符串1

1 数组

1.1. 数组的声明

1.1.1. 一维数组的定义

格式1∶类型 数组名[ ];

其中,类型是数组元素的类型。数组名为合法的标识符,[]指明定义的是一个数组类型变量。

格式2:类型[] 数组名; 左面是类型部分,右面是变量名,与其他类型声明的格式一致。Java中没有静态的数组定义。

1.1.2. 定义类类型的数组

1
2
Date dateArray[ ] ;
Point points[ ];

这两行声明的数组,其元素都是类类型的,dateArray的每个元素都是类型Date的,points的每个元素都是类型Point的。

注意∶

在数组定义时并不会为数组分配内存,声明没有创建数组,声明的数组名只是引用变量,用来指向一个数组。

1.2. 创建数组

初始化的过程就是数组的创建过程。数组的初始化分为静态初始化动态初始化

1.2.1. 静态初始化

就是在定义数组的同时给数组元素赋初值。静态初始化使用一对大括号将初值括起来,每个元素对应一个引用。

1
2
3
4
5
int intArray[] ={1,2,34}//定义了一个含有4个元素的int型数组
double[ ] heights ={4.5,23.6,84.124,78.2,61.5};//定义了一个含有5个元素的double型数组
boolean [ ] tired ={true, false, false, true};//定义了一个含有4个元素的boolean型数组
char vowels[ ] ={ 'a' ,'e' , i' , 'o' ,'u'};//定义了一个含有5个元素的char型数组
String names[ ] ={Georgianna, "Jen”," Simon ," Tom};//定义一个字符串数组

1.2.2. 动态初始化

使用运算符new为数组分配空间,这和所有对象是一样的。数组声明的方括号中的数字表示数组元素个数。 创建格式: 类型 数组名[ ]=new 类型[数组大小];

类型[] 数组名=new 类型[数组大小];

1
2
3
4
5
6
String names [ ];
names = new String[4];
names[0] = "Georgianna";
names[1] = "Jen";
names[2] ="Simon";
names[3]="Tom";

1.2.3. 类类型的数组的空间分配的步骤︰

  1. 先创建数组本身:类型 数组名[]=new 类型[数组大小];

  2. 分别创建各个数组元素︰

    1
    2
    3
    
    数组名[0] = new类型(初值表);
    //...
    数组名[数组大小-1]= new 类型(初值表);
    

1.3. 访问数组元素

在Java中,数组下标从0开始,数组中的元素个数length是数组类中唯一的数据成员变量。使用new创建数组时系统自动给length赋值。数组一旦创建完毕,其大小就固定下来。

  1. 元素的引用格式为∶数组多[下标] 其中,下标的范围是0~length-1下标可以是整型常数或表达式。

  2. 1
    2
    3
    4
    5
    6
    7
    
    //	数组初始化示例:
    double[] heights ={4.5,23.6,84.124,78.2,61.5};
    String[] names= {"Bili" ,"Jennifer" , "Joe"};
    System.out.printIn( heights.length);	//打印5
    System.out.printIn(names.length);	//打印3
    names[1] = null;	//擦掉了值“Jennifer"
    System.out.println( names.length);	//仍打印3
    

1.4. 多维数组

1.4.1. 多维数组的定义

一般来讲,n维数组是n-1维数组的数组。声明多维数组时使用类型及多对方括号。 定义格式∶

类型 数组名[][];

类型 [][]数组名;

类型[] 数组名[ ];

1
int intArray[][];	//声明了二维数组intArray。

1.4.2. 多维数组的初始化

  1. 静态初始化

    在定义数组的同时为数组元素赋初值。

    1
    2
    
    //	数组intArray是一个3行2列的数组。
    int intArray[][] = { {12,3},{1,5},{3,4} };
    
  2. 动态初始化

    • 直接分配 直接为每一维分配空间,声明数组时,给出各维的大小。

      二维数组初始化

      格式如下∶类型 数组名[][]= new 类型[数组第一维大小][数组第二维大小];

      1
      
      int a[][]=new int[2][3];	//声明了一个2行3列的二维数组。
      
    • 按维分配 从最高维起(而且必须从最高维开始),分别为每一维分配内存。创建二维数组的一般格式为:

      1
      2
      3
      4
      5
      
      类型 数组名[][]= new 类型[数组第一维大小][];
      数组名[0] = new 类型[数组第二维大小];
      数组名[1]= new 类型[数组第二维大小];
      ...
      数组名[数组第一维大小-1] = new 类型[数组第二维大小];
      
      注意:

      如果创建数组时第二维大小是一样的,则创建的是一个矩阵数组。

1.4.3. 多维数组的引用

  1. 二维数组的引用方式为︰数组名[第一维下标][第二维下标] 数组下标也称为索引,它们都可以是整型常数和表达式,都是从0开始。第一维也称为行,第二维也称为列。
  2. 二维数组也有length属性,但它只表示第一维的长度。
  3. 复制数组:System类中提供了一个特殊的方法arraycopy()

2 字符串类型

字符串是由有限个字符组成的序列,Java中的字符串是一个对象。 Java的标准包java.lang中封装了String类和StringBuffer类,可以方便地处理字符串。

  1. String类用于处理不变字符串。
  2. StringBuffer类用于处理可变字符串。

2.1. 字符串的声明

  1. 字符串:是内存中连续排列的0个或多个字符。

    • 不变字符串是指字符串一旦创建,其内容就不能改变。使用String类

    • 对于那些需要改变内容并有许多操作的字符串,可以使用StringBuffer类。

  2. 字符串分为常量和变量

    • 字符串常量 是用双引号括起来的一串字符。系统为程序中出现的字符串常量自动创建一个String对象,创建过程是隐含的。
    • 字符串变量 在使用之前要显式声明,并进行初始化。
  3. 字符串的声明

    1
    2
    
      String s1;
      StringBuffer sb1;
    

2.2. 字符串的操作

tips:tipping_hand_man:

java.util包中的类StringTokenizer用于语言符号(单词)的分析。

2.2.1. String类和StringBuffer类中共有的常用方法

  • length():返回字符串的长度,即字符个数。

  • charAt( int index):返回字符串中index位置的字符。

  • subString(int beginIndex):截取当前字符串中从beginIndex开始到末尾的子串。

    String substring(int startpoint,int end);:startpoint是字符串的开始下标,end是截止下标。子串是从开始下标开始,至截止下标的前一个下标为止范围内的子串。

    [startpoint,end)

2.2.2. String类中的常用方法

  • replace ( char oldChar , char newChar ):将当前字符串中出现的所有oldChar转换为newChar。
  • toLowerCase()∶将当前字符串中所有字符转换为小写形式。
  • toUpperCaSe()∶将当前字符串中所有字符转换为大写形式。
  • concat( String str):将str连接在当前字符串的尾部。
  • startsWith(String prefix):测试prefix是否是当前字符串的前缀。
  • trim():去掉字符串前面及后面的空白。
  • valueOf( type value):将type类型的参数value转换为字符串形式。
  • String类型字符串的连接还可以使用运算符 + 来实现。

2.2.3. StringBujfer类中的常用方法

  • append( String str):将参数str表示的字符串添加到当前串的最后。
  • replace( int start, int end, String str):使用给定的str替换从start到end之间的子串。
  • capacity():返回当前的容量。即字符串长度再加上缓冲区的大小( 16 )

2.2.4. 字符串的比较

String类中比较方法:compareTo()(ASCII码顺序)、equals( )、equalslgnoreCase()、regionMatched()等。方法的名字反映了判定时所依据的判定条件是什么。

注意:
  • 关系运算符“==”判定两个字符串是否相等。与equals ()方法不同的是,“==”判定两个字符串对象是否是同一实例,即它们在内存中的存储空间是否相同。

  • 1
    2
    3
    4
    5
    
     String s = "This is a test String!";
     String sCopy = "This is a test String!";
     String sNew = new String("This is a test String!");
     System.out.println(s == sCopy); //  true	相同字符串常量,放在同一内存
     System.out.println(s == sNew); //  false  new String()则开辟新内存
    

3 Vector类

3.1. 概述

  1. Vector(向量)是java.util包提供的一个非常重要的工具类,它类似于数组,可以使用整数下标来访问各个元素,但是比数组的功能更强大。

    • 首先,它是变长数组

    • 其次,保存的元素的类型可以不一样

    注意:

    Vector类的实例中只能保存对象类型,而不能是基本数据类型,例如int类型。

  2. Vector类包含的成员变量有3个∶

    • protected int capacityIncrement:增量的大小。如果值为0,则缓冲区的大小每次倍增。

    • protected int elementCount : Vector对象中元素的数量。

    • protected Object elementData[]:元素存储的数组缓冲区。

      系统内部会记录Vector类实例的容量capacity,实际保存的元素个数由elementCount来记录,这个值不能大于容量值。当有元素加入到向量时,elementCount会相应增大。当向量中添加的元素超过了它的容量后,向量的存储空间以容量增值capacityIncrement的大小为单位增长,为以后新的元素加入做好准备。元素保存在数组elementData中。

3.2. Vector类的方法

3.2.1. 构造方法

常用的Vector类的3个构造方法︰

  • public Vector():构造一个空向量。
  • public Vector(int initialCapacity)∶以指定的初始存储容量initialCapacity构造一个空的向量Vector。
  • public Vector(int initialCapacity,int capacityIncrement):以指定的初始存储容量initiaCapacity和容量增量capacitylncrement构造一个空的向量Vector。

创建Vector的实例时,要指明其中保存的元素的类型。例如︰

1
Vector < String > MyVector = new Vector < String > ( 100,50);

含义∶创建的MyVector向量序列初始有100个字符串的空间,以后一旦空间用尽则以50为单位递增,使序列中能够容纳的元素个数为150,200……

3.2.2. 添加方法

向Vector类对象中添加元素的常用方法︰

  • addElement(Object obj):将新元素obj添加到序列尾部。
  • insertElementAt( Object obj , int index):将指定对象obj插入到指定位置index处。
  • add( int index, Object obj)∶在向量的指定位置index插入指定的元素obj。

3.2.3. 元素的修改或删除方法

  • setElementAt(Object obj , int index):将向量序列index位置处的对象元素修改为obj。如果下标index是负数或超出实际元素的个数,则抛出异常AiTayIndexOutOfBoundsException。
  • removeElement(Object obj):删除向量序列中第一个与指定的obj对象相同的元素,同时将后面的所有元素均前移一个位置。这个方法返回的是一个布尔值,表示删除操作成功与否。
  • removeElementAt(int index):删除index位置的元素,同时将后面的所有元素均前移一个位置。如果下标index是负数或超出实际元素的个数,则抛出异常ArrayIndexOutOfBoundsException。
  • removeAllElements():清除向量序列中的所有元素,同时向量的大小置为0。

3.2.4. 元素的查找方法

  • elementAt( int index):返回指定位置处的元素。如果下标index是负数或超出实际元素的个数,则抛出异常ArraylndexOutOfBoundsException。这个方法的返回值是Object型的对象,在使用之前通常需要进行强制类型转换,将返回的对象引用转换成Object类的某个具体子类的对象。例如:String str =(String)myVector.elementAt(0)

  • contains(Object obj):检查向量序列中是否包含指定的对象元素obj。

  • indexOf (Object obj , int start_index):从指定的start_index位置开始向后搜索,返回所找到的第一个与指定对象obj相同的元素的下标位置。若指定的对象不存在,则返回 -1。

  • lastIndexOf(Object obj, int start_index)∶从指定的 start_index位置开始向前搜索,返回所找到的第一个与指定对象obj相同的元素的下标位置。若指定的对象不存在,则返回-1。

注意: 使用Vector时,一定要先创建后使用。如果不先使用new运算符利用构造方法创建Vector类的对象,则可能造成堆找溢出或使用null指针异常等

本文由作者按照 CC BY 4.0 进行授权

Java程序设计精讲三 第四章 面向对象程序设计

Java程序设计精讲五 第六章 继承与多态