Java程序设计入门与精通
可以直接使用数组类Arrays提供的binarySearch方法实现查找要求。该方法的使用形式如下:
public static int binarySearch (Xxx a[], Xxx v)
该方法用折半查找算法在指定的数组a查找值为v的元素。其中数组a是类型为char、byte、short、int、long、float、double或者boolean的一个数组,v是与数组a的元素类型相同的值。如果在数组a查找到值为v的元素,则返回该元素的下标;否则,则返回一个负值r,位臵-(r+1)为保持数组有序时值为v的元素应该插入的位臵。
代码:
//调用binarySearch方法在数组中查找指定的值 // ArraySearch.java源程序 import java.util.*; class ArraySearch{ public static void main(String args[]){ char ch []={'a','b','c','e','f','h','i'}; char key='f';
int pos;
System.out.println(\数组为:\ for(int i=0;i< ch.length;i++)
System.out.print(ch[i]+\ \ System.out.println(\ pos=Arrays.binarySearch(ch,key);
if(pos<0)
System.out.println(\元素\在数组中不存在\ else
System.out.println(\元素\在数组中的位臵为\ }
}
运行结果如图5-13:
图5-13例5-8程序运行结果图
79
第五章 数组和字符串
注意: 调用binarySearch时数组必须已经是升序有序的,否则,可
能导致错误的结果。
5.2 字符串
字符串是组织字符的基本数据结构,从某种程度上来说有些类似于字符的数组。在Java程序中需要用到的字符串可以分为两大类,一类是创建之后不会再做修改和变动的字符串常量String类;另一类是创建之后允许再做更改和变化的字符串变量StringBuffer类。
5.2.1 字符串常量与String类
在Java中,没有内臵的字符串类型,字符串常量是作为String类的对象存在的。使用字符串的过程可以表述为声明、创建(初始化)、处理3个步骤。其中声明与创建也经常合并在
一起进行。
1.创建String类对象
创建String类字符串的方式有两种:使用类似基本类型的双引号””赋值法,或使用类的构造方法。
⑴ 使用类的构造方法创建字符串
例如:
String str1=new String(\ //使用类的构造方法创建字符串str1 String str2=new String(\
使用类的构造方法产生的字符串对象,有自己的独立空间。上例中字符串str1和字符串str2就各有自己的存储空间。
图5-14 由类的构造方法产生的字符串对象
80
Java程序设计入门与精通
Java中new String()方法的形式有好几种,常用的形式如下: String() //创建一个空字符串常量。
String(String value) //根据一个已经存在的字符串常量来创建一个新的字符串常量。 String(char[] value) //根据一个已经存在的字符数组来创建一个新的字符串常量。 String(byte[] bytes) //根据一个已经存在的字节数组来创建一个新的字符串常量。 String(byte[] bytes,int startIdnex,int numChars) //根据一个字节数组的指定部分来创建一个新的字符串常量。
String(StringBuffer buffer) //根据一个已经存在的StringBuffer对象来创建一个新的字符串常量。
说明:
因为很多系统中字符串的典型格式是由8位的ASCII字符集构成的8位字节数组,而Java的Char类使用16位表示的Unicode编码字符集。为了使8位字节数组格式的源数据,能够直接为Unicode编码的String类字符串所用,Java提供了由字节数组创建字符串的方法。
其中,参数bytes代表一个由ASCII码构成的字节数组,参数startIdnex代表起始位臵,参数numChars代表元素个数。
【例5-9】利用new方法创建String类字符串示例。 设计思路:
利用new声明并初始化赋值7个String类字符串s1、s2、s3、s4、s5、s6、s7。7次赋值使用了7种不同的构造方法。
代码:
// StringCreate.java源程序 public class StringCreate{ public static void main(String args[]){
char chars1[]={'a', 'b', 'c', 'd', 'e', 'f'};
String s1=new String(); // 创建空字符串s1
String s2=new String(chars1); //由字符数组chars1,创建字符串s2 //由数组chars1的指定部分,创建字符串s3 String s3=new String(chars1,3,3);
byte asc[]={65,66,67,68,69};
//由字节数组asc,创建字符串s4,值是\String s4=new String(asc);
//由字节数组asc的指定部分,创建字符串s5,值是\String s5=new String(asc,2,3);
//数组hz构成\面向对象\个汉字。-61与-26组合成汉字\面\,其余类推 byte hz[ ]={-61, -26, -49, -14, -74, -44, -49, -13}; //用字节数组hz按缺省的字符编码方案创建串对象s6
String s6=new String(hz);
81
第五章 数组和字符串
//从hz下标为2的字节开始,取连续的4个字节{-49, -14, -74, -44}创建s7 String s7=new String(hz,2,4);
}
System.out.println(\System.out.println(\System.out.println(\System.out.println(\System.out.println(\System.out.println(\System.out.println(\
}
程序运行结果图5-15:
图5-15例5-9程序运行结果图
⑵ 使用双引号赋值法创建字符串 例如:
String str3=\ //使用双引号赋值法创建字符串str3 String str4=\
使用双引号赋值法产生字符串是为了提高程序运行速度。系统内存中专门有一块字符串池(String Pool),每产生一个双引号赋值法字符串,系统首先到String Pool中查看是否已有相同的字符串在里面,如果有,就直接拿出来使用。如果没有,才将新字符串放入String Pool中。所以,用双引号赋值法产生的相同字符在内存中只有一份。这样,字符串str3和str4实际上是指向同一内存地址。如图5-16所示。
在创建字符串时,还可以使用Java的”+”运算符,实现字符串间的连接。例如:
String str5= “hello”+”java !”; //声明并创建字符串Str5
如果字符串与其他类型的变量进行”+”运算,系统自动将其类型转换为字符串。例如: int i=5;
String str6=”i=”+i; // 声明并创建字符串str6,值为”i=5”
82