一. Java String 类
字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
创建字符串
创建字符串最简单的方式如下:
String greeting = "菜鸟教程";
在代码中遇到字符串常量时,这里的值是 "菜鸟教程",编译器会使用该值创建一个 String 对象。
和其它对象一样,可以使用关键字和构造方法来创建 String 对象。
String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:
public class StringDemo{ public static void main(String args[]){ char[] helloArray = { 'r', 'u', 'n', 'o', 'o', 'b'};
String helloString = new String(helloArray);
System.out.println( helloString );
}}
运行结果如下:
runoob
注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。
如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。
字符串长度
用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。
下面的代码执行后,len变量等于14:
public class StringDemo {
public static void main(String args[]) {
String site = "www.runoob.com";
int len = site.length();
System.out.println( "菜鸟教程网址长度 : " + len );
}
}
运行结果如下:
菜鸟教程网址长度 : 14
String 方法
下面是 String 类支持的方法,更多详细,参看 Java String API文档:
SN(序号) | 方法描述 |
---|---|
1 | char charAt(int index)返回指定索引处的 char 值。 |
2 | int compareTo(Object o)把这个字符串和另一个对象比较。 |
3 | int compareTo(String anotherString)按字典顺序比较两个字符串。 |
4 | int compareToIgnoreCase(String str)按字典顺序比较两个字符串,不考虑大小写。 |
5 | String concat(String str)将指定字符串连接到此字符串的结尾。 |
6 | boolean contentEquals(StringBuffer sb)当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。 |
7 | static String copyValueOf(char[] data)返回指定数组中表示该字符序列的 String。 |
8 | static String copyValueOf(char[] data, int offset, int count)返回指定数组中表示该字符序列的 String。 |
9 | boolean endsWith(String suffix)测试此字符串是否以指定的后缀结束。 |
10 | boolean equals(Object anObject)将此字符串与指定的对象比较。 |
11 | boolean equalsIgnoreCase(String anotherString)将此 String 与另一个 String 比较,不考虑大小写。 |
12 | byte[] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
13 | byte[] getBytes(String charsetName)使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
14 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将字符从此字符串复制到目标字符数组。 |
15 | int hashCode()返回此字符串的哈希码。 |
16 | int indexOf(int ch)返回指定字符在此字符串中第一次出现处的索引。 |
17 | int indexOf(int ch, int fromIndex)返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。 |
18 | int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引。 |
19 | int indexOf(String str, int fromIndex)返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。 |
20 | String intern() 返回字符串对象的规范化表示形式。 |
21 | int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 |
22 | int lastIndexOf(int ch, int fromIndex)返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。 |
23 | int lastIndexOf(String str)返回指定子字符串在此字符串中最右边出现处的索引。 |
24 | int lastIndexOf(String str, int fromIndex) 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。 |
25 | int length()返回此字符串的长度。 |
26 | boolean matches(String regex)告知此字符串是否匹配给定的正则表达式。 |
27 | boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)测试两个字符串区域是否相等。 |
28 | boolean regionMatches(int toffset, String other, int ooffset, int len)测试两个字符串区域是否相等。 |
29 | String replace(char oldChar, char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
30 | String replaceAll(String regex, String replacement)使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
31 | String replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 |
32 | String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。 |
33 | String[] split(String regex, int limit)根据匹配给定的正则表达式来拆分此字符串。 |
34 | boolean startsWith(String prefix)测试此字符串是否以指定的前缀开始。 |
35 | boolean startsWith(String prefix, int toffset)测试此字符串从指定索引开始的子字符串是否以指定前缀开始。 |
36 | CharSequence subSequence(int beginIndex, int endIndex) 返回一个新的字符序列,它是此序列的一个子序列。 |
37 | String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。 |
38 | String substring(int beginIndex, int endIndex)返回一个新字符串,它是此字符串的一个子字符串。 |
39 | char[] toCharArray()将此字符串转换为一个新的字符数组。 |
40 | String toLowerCase()使用默认语言环境的规则将此 String 中的所有字符都转换为小写。 |
41 | String toLowerCase(Locale locale)使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。 |
42 | String toString() 返回此对象本身(它已经是一个字符串!)。 |
43 | String toUpperCase()使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 |
44 | String toUpperCase(Locale locale)使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。 |
45 | String trim()返回字符串的副本,忽略前导空白和尾部空白。 |
46 | static String valueOf(primitive data type x)返回给定data type类型x参数的字符串表示形式。 |
二. 数组
数组是一种数据结构, 用来存储同一类型值的集合。通过一个整型下标可以访问数组中
的每一个值。
在声明数组数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量名称:
int[] a; //声明了数组变量 a
该语句仅仅声明了变量a,并没有将a初始化为一个真正的数组,使用new运算符创建数组:
int[] a = new int[100];//这条语句创建了一个可以储存100个整数的数组
这个数组的下标从0~99,一旦创建了一个数组,就可以为这个数组赋值,例如使用一个循环:
int[] a = new int[100];
for(int i=0;i<100;i++){
a[i] = i;
}
注意
- 创建一个数字数组时,所有元素都被初始化为0。
- 创建一个boolen型的数组时,所有元素都被初始化为false。
- 创建一个对象型数组时,所有元素都被初始化为null,表示这些元素还未存放任何对象。
- 如果创建了一个 100 个元素的数组, 并且试图访问元素 a[100] (或任何在 0 ~ 99
之外的下标,) 程序就会引发“ array index out of bounds” 异常而终止执行。
要想获得数组中的元素个数,可以使用 array.length
。例如,
for (int i = 0; i < a.length; i ++)
System.out.println(a[i]);
一旦创建了数组, 就不能再改变它的大小(尽管可以改变每一个数组元素) 如果经常需
要在运行过程中扩展数组的大小, 就应该使用另一种数据结构—数组列表( array list)
for each 循环
Java 有一种功能很强的循环结构, 可以用来依次处理数组中的每个元素(其他类型的元
素集合亦可)而不必为指定下标值而分心。
这种增强的 for 循环的语句格式为:
for (variable : collection) statement
定义一个变量用于暂存集合中的每一个元素, 并执行相应的语句(当然, 也可以是语句块 )。
collection 这一集合表达式必须是一个数组或者是一个实现了 Iterable 接口的类对象(例如
ArrayList )。 例如:
int [] a ={1, 2, 3,4};
for (int element : a)
System.out.println(element);
打印数组 a 的每一个元素,一个元素占一行。
这个循环应该读作“ 循环 a 中的每一个元素”(for each element in a )。
提示:
有个更加简单的方式打印数组中的所有值, 即利用 Arrays 类的 toString 方法。 调
用 Arrays.toString(a), 返回一个包含数组元素的字符串, 这些元素被放置在括号内, 并
用逗号分隔, 例如,“ [2,3,5,7,11 ,13]”、 要想打印数组, 可以调用
System.out.println(Arrays.toString(a));
数组初始化以及匿名数组
在 Java中, 提供了一种创建数组对象并同时赋予初始值的简化书写形式。下面是一 例子:
int[] a = {2,3,5,7,11,13};
请注意, 在使用这种语句时,不需要调用 new。
甚至还可以初始化一个匿名的数组:
new int[] { 17, 19, 23, 29, 31, 37 }
这种表示法将创建一个新数组并利用括号中提供的值进行初始化, 数组的大小就是初始值的
个数。 使用这种语法形式可以在不创建新变量的情况下重新初始化一个数组。 例如:
small Primes = new int[] { 17, 19, 23, 29, 31, 37 };
数组拷贝
Java允许将一个数组变量拷贝给另一个数组变量。这时,两个数组变量将引用同一个数组(意味着改变其中一个数组的元素值,另一个数组的相同元素值也跟着改变):
public class Test {
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
int[] b = a;
b[4] = 6;
System.out.print(a[4]);
}
}
运行结果如下:
6
如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用 Arrays 类的 copyOf
方法:
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length) ;
第 2 个参数是新数组的长度。这个方法通常用来增加数组的大小:
luckyNumbers = Arrays.copyOf(luckyNumbers, 2 * luckyNumbers.length);
实例:
import java.util.*;
public class Test {
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
int[] b= Arrays.copyOf(a,2*a.length);
b[4] = 6;
System.out.print(a[4]);
}
}
运行结果如下:
5
如果数组元素是数值型,那么多余的元素将被赋值为 0 ; 如果数组元素是布尔型, 则将赋值
为 false。相反, 如果长度小于原始数组的长度,则只拷贝最前面的数据元素。
数组排序
要想对数值型数组排序,可以用Array类中的sort方法:
int[] a = new int[100];
...
Arrays.sort(a);
这个方法使用了优化的快速排序算法。
下面来研究一个例子,这个例子使用了数组,它产生了一个抽彩游戏的随机数值组合:
package com.company;
import java.util.*;
public class Test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in) ;
//获取中奖号码总个数k
System.out.print("How many numbers do you need to draw? ");
int k = in.nextInt();
//获取奖池中的号码总数n
System.out.print("What is the highest number you can draw? ");
int n = in.nextInt();
/*
*k>n抛出数组越界异常
* if (k>n) {
* System.out.println("bad value!!!");
* return;
* }
*/
// 将奖池号码总个数填入数组numbers中
int[] numbers = new int[n];
for (int i = 0; i < numbers.length; i++)
numbers [i] =i + 1;
// 将中奖号码总个数填入数组result中
int[] result = new int[k];
for (int i = 0; i < result.length; i++)
{
//在0~n-1之间取得一个随机中奖号码
int r = (int) (Math.random() * n);
// pick the element at the random location
result[i] = numbers[r];
// move the last element into the random location
numbers[r] = numbers[n - 1] ;
n--;
} //print the sorted array
Arrays.sort(result);
System.out.println("Bet the following combination. It'll make you rich!");
for (int r : result)
System.out.println(r) ;
}
}
运行后可能的结果如下(假如从49个中抽取3个):
Bet the following combination. It'll make you rich!
8
9
11
注意
-
int r = (int)(Math.random() * n);
Math.random()会得出一个01之间的随机数,*n则范围变为0n,在经过(int)强制类型转换,舍去小数点后面的数字后范围变为0~n-1。 - numbers[r] = numbers[n - 1] ;
n--; 这两条语句保证了不会出现重复的中奖号码:用numbers数组的最后一个元素替代已选中的号码,然后删除最后一个元素。