Lesson 7,Basic Grammar (Part 2)
Java语言基础语法 (中 )
LiFan(李凡)
Chengdu University of Information Technology
The Department Of Computer Science
2005
Array Variables (数组变量 )
? 数组 是多个数据元素的有限有序集合,
元素的类型可以是基本数据类型或对象
引用,可以随机访问数组中的元素
? 在 Java语言中,数组是以对象的形式存

Declaring Arrays (声明数组 )
? 数组类型是在基本数据类型名或者类类型后
面加上方括号对,[]”表示,数组成员为方括
号前的基本数据类型或类的对象引用,声明
数组变量的语法如下,
一维数组 <修饰符 > <类型名 >[] <变量名 >;
<修饰符 > <类型名 > <变量名 >[];
二维或多维 <修饰符 > <类型名 >[]…[] < 变量名 >;
<修饰符 > <类型名 > <变量名 >[]…[];
int[] numbers;
String[] names;
int[][] matrix;
注意:请尽量不声明二维以上的数组变量
Accessing Arrays (访问数组 )
? 数组对象有一个整型的域 length,它的值表
示数组的长度
System.out.println(numbers.length);
? 数组中的元素通过下面的形式访问,
<数组变量名 >[元素序数 ] (0≤元素序数<数组长度 )
System.out.println(numbers[0]);
numbers[numbers.length-1]=10;
Array Modifiers (数组变量的修饰符 )
? 数组变量在使用上与一般的变量相同,可以
作为类的域,也可以作为局部变量或参数变

? 当保留字 final修饰数组变量时,数组变量只
能被初始化一次,但数组成员仍然可以修改,
无法将数组成员为 final或 volatile
final int[] numbers={1,2,3};
numbers={3,4,5};
numbers[0]=3;
numbers[1]=4;
numbers[2]=5;
错误
正确
Array Initialization (数组初始化 )
? 数组变量如果作为类的域,则默认的初始值
为 null,如果作为构造函数、方法的局部变
量或参数变量,则必须首先初始化
? 数组变量的初始化可以分为三种形式,初始
化为 null,隐式初始化 或 显式初始化
? 对于暂时不引用任何数组对象的数组变量可
以将其初始化为 null
int[] numbers=null;
Array Initialization (数组初始化 )
? 隐式初始化 时,数组中每个元素的值为所属数据
类型的默认值,对象引用类型为 null,隐式初始化
采用以下语法,
<类型名 >[] <变量名 >=new <类型名 >[长度 ]
<类型名 > <变量名 >[]=new <类型名 >[长度 ]
? 如果数组是多维数组,则必须在初始化时确定第
一维的长度
int[] numbers=new int[10];
String[] names=new String[5];
int[][] matrixA=new int[5][5];
int[][] matrixB=new int[5][];
Array Initialization (数组初始化 )
? 显式初始化 可以分为三种形式,
(1) 在隐式初始化后,通过遍历数组,为数组中的
每一个元素赋值
(2) 在 声明数组变量时,将包含各个元素值的花括
号对,{…},作为初始值,括号中的各元素值用逗
号隔开
(3) 创建匿名数组 (Anonymous Array),作为数组变
量的初始值或对数组变量重新赋值
int[] numbers=new int[10];
for(int i=0;i<numbers.length;i++)
numbers[i]=i;
String[] names=new String[3];
names[0]=“Zhang”;
names[1]=“Wang”;
names[2]=“Li”;
int[] numbers={0,1,2,3,4,5,6,7,8,9}
String[] names={“Zhang”,“Wang”,“Li”} int[] numbers=new int[]{0,1,2,3,4,5,6,7,8,9};
String[] names=new String[3];
names=new String[]{“Zhang”,“Wang”,“Li”};
Arrays of Arrays (数组的数组 )
? 由于数组的元素可以是对象引用,而数组本
身是对象,因此 N(N≥2)维数组又可以看作
为 X(X<N)维数组,数组的每个元素是 N-X
维数组
? 对于多维数组 N[x][y]…[z],对于已确定长
度的维,可以通过 N[x][y]…[m] 的形式访问
该维所对应的数组元素
float[][] mat=new float[4][];
for(int i=0;i<mat.length;i++)
mat[i]=new float[4];
float[] vector0=mat[0];
0
1
2
3
mat
mat
.le
ngt
h
0 1 2 3
0 1 2 3
0 1 2 3
0 1 2 3
mat[0]
mat[1]
mat[2]
mat[3]
mat[0].length
Arrays of Arrays (数组的数组 )
? 在 Java语言中,多维数组某一维上所对应的
各个数组元素的长度可以不相同
float[][] mat=new float[4][];
for(int i=0;i<mat.length;i++)
mat[i]=new float[i+1];
float[] vector2=mat[1];
0
1
2
3
mat
mat
.le
ngt
h
0
0 1
0 1 2
0 1 2 3
mat[0]
mat[1](vector2)
mat[2]
mat[3]
Arrays of Arrays (数组的数组 )
? 在 声明多维数组变量时,可将包含各个子数组元
素的花括号对,{…},作为初始值,括号中的各个
子数组元素用逗号隔开
float[][] pascalsTriangle={{1},
{1,1},
{1,2,1},
{1,3,3,1},
{1,4,6,4,1}};
float[] vector2=pascalsTriangle[1];
// vector2 = {1,1}
String (字符串类 )
? Java语言中用 java.lang.String 类来表示字符
串数据,同时 String类也提供了许多与字符
串操作相关的方法
? 在 Java语言中,字符串是由多个 Unicode字
符组成的序列,在 String类的内部使用了一
个 char[]数组来存放字符串中的字符
String类的构造函数
String()
String(String original)
String(char[] value)
String(char[] value,int offset,int count)
String(byte[] bytes)
String(byte[] bytes,int offset,int count)
String(byte[] bytes,String charset)
String(byte[] bytes,int offset,int count,String charset)
String(StringBuffer buffer)
String() 构造函数
? 默认函数 String()用于创建一个不包含任何字
符的空串
String empty=new String();
等价于使用直接量,” 初始化字符串
String empty=“”;
String(String original) 构造函数
? 构造函数 String(String original)创建的字符串
对象具有与作为参数传入的字符串对象相同
的字符序列,该构造函数又称为,拷贝构造
函数,
? 由于字符串对象创建后其值不可改变,失去
了该拷贝构造函数的意义,因此该尽量避免
使用该构造函数
String and char Arrays
? 由于 String类内部使用 char[]数组来存放字符串中的
字符,因此 String类与 char[]数组之间可以互相转换
? 通过构造函数 String(char[])或 String(char[],int,int)可
以由 char[]数组创建字符串对象
? String类的 length()方法,返回的是 String类内部
char[]数组的长度,也就是字符串的长度
? String类也提供了许多与 char相关的方法
char[] chars={?g?,?o?,?o?,?d?};
String goodString=new String(chars);
String goString=new String(chars,0,2);
System.out.println(goodString);
System.out.println(goString);
good
go
char charAt(int index)
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin)
char[] toCharArray()
String replace(char oldChar,char newChar)
int indexOf(int ch)
int indexOf(int ch,int fromIndex)
int lastIndexOf(int ch)
int lastIndexOf(int ch,int fromIndex)
static String copyValueOf(char[] data)
String and byte Arrays
? 16位 Unicode字符数据序列可以根据一定的
字符编码 (character encoding)规则转换为 8位
的字节数据序列
? JVM必须支持的字符编码有
US-ASCII,ISO-8859-1,UTF-8,UTF-16
UTF-16BE,UTF-16LE
? 中文字符编码有 GB2312,GBK或 Big5
字符串中的字符 c根据,UTF-8编码”转换为字节序列的编码方
式如下,
如果 c∈ [\u0001,\u007f],则直接将 c转换为一个字节
(byte)c
如果 c∈ [\u0080,\u07ff]或 c=\u0000,则将 c转换为两个字节
(byte)(0xc0 | (0x1f & (c >> 6)))
(byte)(0x80 | (0x3f & c))
如果 c∈ [\u0800,\uffff],则将 c转换为三个字节
(byte)(0xe0 | (0x0f & (c >> 12)))
(byte)(0x80 | (0x3f & (c >> 6)))
(byte)(0x80 | (0x3f & c))
String and byte Arrays
? 通过构造函数 String(byte[]),String(byte[],int,int)或
String(byte[],String),String(byte[],int,int,String)可
以由 byte[]数组创建字符串对象,前两个构造函数
使用当前操作系统默认的字符编码将 byte[]数组转
换为 char[]数组,后两个构造函数使用指定的字符
编码进行转换
? String类还提供了两个与 byte[]数组相关的方法,
byte[] getBytes()
byte[] getBytes(String charset)
byte[] ytes={49,50,51,43,52,53,54,61,53,55,57};
String exp=new String(bytes,“US-ASCII”);
System.out.println(exp);
123+456=579
String Comparisons (字符串比较 )
? 当判等号,==”一般用于比较两个基本数据类型的
变量的值是否相等,当判等号,==”比较两个对象
引用变量时,如果两个变量引用了同一个对象则
结果为 true,否则为 false
? 要对两个 String对象进行比较,应该使用以下方法,
boolean equals(Object otherString)
boolean equalsIgnoreCase(String otherString)
String str1=new String(“good”);
String str2=new String(“good”);
boolean b1=str1==str2;
String str3=“good”;
String str4=“good”;
boolean b2=str3==str4;
b1=? false
b2=? true
.equals(str2);
.equals(str4);
b1==true
b2==true
String Comparisons (字符串比较 )
? String类提供了以下两个方法对字符串进行
排序比较,
int compareTo(String other)
int compareToIgnoreCase(String other)
? 如果返回 正数,则表示被调用方法的字符串对象
应排在传入的参数字符串之前,如果返回 负数,
则表示被调用方法的字符串对象应排在传入的参
数字符串之后,如果返回 零,则表示两个字符串
的字符完全相等,排列不分先后
String[] table;
……
public int position(String key){
int lo=0,hi=table.length-1;
while(lo<=hi){
int mid=lo+(hi-lo)/2
int cmp=key.compareTo(table[mid]);
if(cmp==0)
return mid;
else if(cmp<0)
hi=mid-1;
else
lo=mid+1;
}
return -1;
}
Substring Operations (子串操作 )
? String类提供了以下两个取子串的方法,
String substring(int beginIndex)
String substring(int beginIndex,int endIndex) String words=“good morning”;
String sub1=words.substring(5);
String sub2=words.substring(0,4);
System.out.println(sub1);
System.out.println(sub2);
morning
good
Substring Operations (子串操作 )
? String类提供了许多与子串匹配相关的方法
boolean regionMatches(int start,String other,int
ostart,int count)
boolean regionMatches(boolean ignoreCase,int
start,String other,int ostart,int count)
boolean startsWith(String prefix)
boolean startsWith(String prefix,int start)
boolean endsWith(String suffix)
Class RegionMatch{
public static void main(String[] args){
String str=“Look,look!”;
boolean b1,b2,b3;
b1=str.regionMatches(6,“Look”,0,4);
b2=str.region atches(true,6,“Look”,0,4);
b3=str.regionMatches(true,6,“Look”,0,5);
System.out.println(“b1=”+b1);
System.out.println(“b2”=+b2);
System.out.println(“b3=”+b3);
}
}
1=false
b2=true
b3=false
字符串与基本数据类型间的转换
? String类提供了以下静态方法获得其它基本
数据类型值的字符串表示,
static String valueOf(boolean)
static String valueOf(char)
static String valueOf(float)
static String valueOf(double)
static String valueOf(int)
static String valueOf(long)
static String valueOf(Object)
字符串与基本数据类型间的转换
? 除 Boolean类外,每个包装器类都提供了一个静态
方法 parseXXX,将字符串对象转换为对应的基本
数据类型值
byte Byte.parseByte(String)
int Integer.parseInt(String)
long Long.parseLong(String)
float Float.parseFloat(String)
double Double.parseDouble(String)
new Boolean(String).booleanValue()
String类的其它方法
? String concat(String)
? String trim()
? String toLowerCase()
? String toUpperCase()
? String toLowerCase(Locale)
? String toUpperCase(Locale)
? 关于 String类的所有方法的详细用法请查阅 Sun公
司的 Java API 使用帮助文档
Assignments (作业 )
? 思考,P152 练习 6.1
P217 练习 9.3
? 编程,P211 练习 9.1 9.2
(周日前上传,创建包含源程序和编译后的
字节码文件的压缩包 )