Java:String、Arrays

来源:互联网 发布:plc编程标准 编辑:程序博客网 时间:2024/06/05 19:14

字符串

Java字符串就是Unicode字符序列,例如,串Java\u2122由5个Unicode字符J、a、v、a和™。
Java在标准Java类中提供了一个预定义类:String。


和C++不同,String类不能修改。如果希望将”hello”修改成“help!”,需要先提取需要的字符,然后再拼接上替换的字符串:

String greeting="Hello";greeting=greeting.substring(0,3)+"p!";

字符串构造器 StringBuffer/StringBuilder

当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。
和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder类在Java 5中被提出,它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步访问)。
由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。

StringBuffer sBuffer = new StringBuffer(" test");sBuffer.append(" String Buffer");System.out.println(sBuffer); 

StringBuffer/StringBuilder的常用方法

int length()//返回长度(字符数)。char charAt(int index)//返回此序列中指定索引处的 char 值。void setCharAt(int index, char ch)//将给定索引处的字符修改为 ch。int indexOf(String str)//返回第一次出现的指定子字符串在该字符串中的索引。int indexOf(String str, int fromIndex)//从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。int lastIndexOf(String str)//返回最右边出现的指定子字符串在此字符串中的索引。int lastIndexOf(String str, int fromIndex)//返回最后一次出现的指定子字符串在此字符串中的索引。public StringBuffer append(String s)//将指定的字符串追加到此字符序列。public StringBuffer reverse()//将此字符序列用其反转形式取代。public delete(int start, int end)//移除此序列中某个范围内的子字符串。public deleteCharAt(int index)//移除由index指定的那个字符public insert(int offset, int i)//将 int 参数的字符串表示形式插入此序列中。replace(int start, int end, String str)//使用给定 String 中的字符替换此序列的子字符串中的字符int capacity()//返回当前容量。void ensureCapacity(int minimumCapacity)//确保容量至少等于指定的最小值。void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)//将字符从此序列复制到目标字符数组 dst。void setLength(int newLength)//设置字符序列的长度。CharSequence subSequence(int start, int end)//返回一个新的字符序列,该字符序列是此序列的子序列。String substring(int start)//返回一个新的 String,它包含此字符序列当前所包含的字符子序列。String substring(int start, int end)//返回一个新的 String,它包含此序列当前所包含的字符子序列。String toString()//返回此序列中数据的字符串表示形式。

String的常用方法

子串

String类的substring方法可以从一个较大的字符串提取出一个子串。substring(a,b)中的a是开始复制的位置,而b是不想复制的第一个位置,子串的长度即为b-a。
至于a和b的取值范围,a是0~s.length()-1,b是0~s.length()。如果ab相等,则子串不包含任何元素,为“”;如果a等于0,b等于s.length(),则子串就是原字符串。

String greeting="Hello";String s=greeting.substring(0,3);//s="Hel"

也可以写成

String greeting="Hello";String s=greeting.substring(2);//s="llo"

这里substring只有一个形参startIndex,返回从startIndex开始到末尾的子字符串。


注意,在C++里,s.substr(a,n);中的a也是开始复制的位置,但n是复制的长度。感觉Java版本的substring更加直观。

拼接

与C++一样,Java语言允许使用+号拼接两个字符串。
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。例如:

int age=13;String rating="PG"+age;

rating被设置为“PG13”。

检测是否相等

可以使用equals方法检测两个字符串是否相等,对于表达式:

s.equals(t)

s和t可以是字符串变量,也可以是常量,例如下面表达式是合法的。

"Hello".equals(greeting)

如果想要不区分大小写,可以使用equalsIgnoreCase方法。

"Hello".equalsIgnoreCase("hello")

注意,和C++不同,不能使用“==”运算符检测两个字符串是否相等。因为

return (s1 == s2);

只是检测s1和s2所指向的字符串对象是否相同。考虑

String a="abc";String b="abc";

那么a==b将返回true,这是因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存一份,所以a和b指向的是同一个对象。
再比如:

String a=new String("abc"); String b=new String("abc");

那么a==b将返回false,因为此时a和b指向不同的对象。

空串和null串

空串“”是长度为0的字符串,检测是否是空串可以:

if(str.length()==0)或if(str.equals(""))

而String还可以存放一个特殊的值null,要检查是否是null串,可以:

if(str==null)

split 分割字符串

Java中的 split 函数是用于按指定字符串或正则去分割某个字符串,结果以字符串数组形式返回。

String str="1234@abc";  String[] a = str.split("@");  System.out.println("处理结果: "+a[0]+","+a[1]);   //输出的是: 处理结果: 1234,abc  

对于分割的字符串,通常没什么问题,但是对某些特殊字符,如果字符串正好是正则的一部分,则需要转义才能使用,这些比较特殊的字符有

 | , + , * , ^ , $ , / , | , [ , ] , ( , ) , - , . , \

等, 因它们是正则表达式中的一部分, 所以如果想用该字符本身, 这些字符需要进行转义才能表示它本身。例如:
想用 | 竖线去分割某字符,因 | 本身是正则表达式中的一部分,所以需要 \ 去转义,因转义使用 , 而这个 \ 正好也是正则表达式的字符,所以还得用一个 \ , 所以需要两个 \。

String str="5678|XYZ";  String[] b = str.split("\\|");  //注意这里用两个 \\,而不是一个\  System.out.println("处理结果: "+b[0]+","+b[1]);   //输出的是: 处理结果: 5678,XYZ  

当存在多个分隔符,如, ; ? |时,应该把它们放在方括号[ ]内,如:

String[] strs = str.split("[;,?|]");

这样一来,就可以按照多个分隔符分割字符串str了。


注意,当string的首尾存在空格时,要先用trim()方法去除这些空格,即:

String[] strs = str.trim().split("xx");

判断char是否是数字或字母

针对单一的字符,java.lang.Character里有相应的判断方法,如下:

char c = 'a';Character.isDigit(c)://判断字符是否数字,是则返回true,否则返回falseCharacter.isLetter(c)://判断字符是否字母 Character.isLetterOrDigit(c)://判断字符是否字母或数字Character.isLowerCase(c)://判断字符是否小写字母Character.isUpperCase(c)://判断字符是否大写字母Character.isWhitespace(c)://判断字符是否空格

其他方法

java.lang.String类的其他常用方法如下:

//str的长度int length()//将字符串转换为字符数组char[] s.toCharArray()//获取指定位置的字符,如str.charAt(0)获取首字符charAt(int index)//比较int compareTo(String other) //如果字符串小于other,返回一个负数;如果大于,返回一个正数;如果相等,返回0boolean startsWith(String prefix) //如果字符串以prefix结尾,返回trueboolean endsWith(String suffix) //如果字符串以suffix结尾,返回true//查找int indexOf(String str,int fromIndex)int indexOf(int cp,int fromIndex)//从位置0或者fromIndex开始,返回与str或代码点cp匹配的第一个子串的位置。如果不存在,返回-1int lastIndexOf(String str,int fromIndex)int lastIndexOf(int cp,int fromIndex)//从串尾或者fromIndex开始,返回与str或代码点cp匹配的最后一个子串的位置。如果不存在,返回-1boolean contains(String subString)//如果str中含有子串subString,则返回true,否则返回false//替换String replace(String oldString,String newString) //用newString代替原字符串中所有的oldString,并返回之//转换大小写String toLowerCase() //将原字符串中所有大写字母改写成小写字母String toUpperCase() //将原字符串中所有小写字母改写成大写字母//删除头尾空格String trim()//字符串转整型int num = Integer.valueOf("12",16)//第一个参数是待转换的字符串,第二个参数是进制,可以取2,8,16或其他整数

数组

定义与实例化

声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字。接着,还要用new运算符创建数组。

int[] a = new int[100];

数组长度不要求是常量,new int[n]会创建一个长度为n的数组。


array.length 可以获得数组的元素个数。
然而,一旦创建了数组,就不能再改变它的大小。


可以先定义一个数组,之后再实例化它:

        String[] strings;        strings=new String[100];        System.out.print(strings.length);        //100

数组初始化

int[] a = {2,3,4,5,6,7};

此时不需要调用new。
另外,如果需要给数组中的每个元素赋同样的值,可以使用:

Arrays.fill(a,x);//给数组a中的每个元素赋值x

数组的遍历

Java提供了一种遍历数组元素的便捷语句:

for(int element : a) {    ...}

它读作“循环a中的每个元素(for each element in a)”

数组引用

    int[] init;      int[] nums={1,2,3};    int[] nums2={4,5,6};    init=nums;    init=nums2;

Java中,数组名只是引用,上面先将nums的引用传给init,此时init和nums共同指向{1,2,3};然后将nums2的引用传给init,这时init又和nums2一样指向了{4,5,6}。

二维数组

int[][] a = new int[n][m];

打印数组

int[] intArray = { 1, 2, 3, 4, 5 };String intArrayString = Arrays.toString(intArray);// print directly will print reference valueSystem.out.println(intArray);// [I@7150bd4dSystem.out.println(intArrayString);// [1, 2, 3, 4, 5]

Java中数组只是引用,而不是值本身,第三行直接打印intArray,输出的是乱码,因为intArray仅仅是一个地址引用。第4行输出的则是真正的数组值,因为它经过了Arrays.toString()的转化。对Java初学者来说,引用和值仍需重视。

数组拷贝

要拷贝数组时,如果类似C++那样写成:

int[] a=b;

那么a和b将引用同一个数组,这时如果:

a[5]=12;

那么相应的,b[5]也成了12。


如果希望原数组和拷贝的新数组彼此独立,除了for循环外,还有4种方式:

Arrays.clone方法

int[] a={1,2,3};int[] b=a.clone();

System.arraycopy方法

    int[] src = {1,3,5,7,9,11,13,15,17};    int[] dest = {2,4,6,8,10,12,14,16,18,20};//从src中的第一个元素起复制三个元素,即1,3,5复盖到dest第2个元素开始的三个元素    System.arraycopy(src, 0, dest, 1, 3);    System.out.println(Arrays.toString(dest));//结果为:[2, 1, 3, 5, 10, 12, 14, 16, 18, 20]

Arrays.copyOf 方法

    int[] src = {1,3,5,7,9,11,13,15,17};    int[] dest = {2,4,6,8,10,12,14,16,18,20};//copyOf(是复制src数组从0开始的两个元素到新的数组对象)    int[] copyof=Arrays.copyOf(src, 2);    System.out.println(Arrays.toString(copyof));//结果为:[1, 3]

Arrays.copyOfRange 方法

    int[] src = {1,3,5,7,9,11,13,15,17};    int[] dest = {2,4,6,8,10,12,14,16,18,20};//copyRange(将src数组中从0开始的第二个元素到第五个元素复制到新数组,含头不含尾)    int[] copyofRange=Arrays.copyOfRange(src,2,6);    System.out.println(Arrays.toString(copyofRange));//结果为:[5, 7, 9, 11]

数组转换成数组列表 ArrayList

当需要将数组转换成数组列表时,需要用到Arrays.asList方法:

String[] stringArray = { "a", "b", "c", "d", "e" };ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));System.out.println(arrayList);// [a, b, c, d, e]

数组转换成集合 Set

Set<String> set = new HashSet<String>(Arrays.asList(stringArray));System.out.println(set);//[d, e, b, c, a]

可以先将Array转换成ArrayList,然后再将ArrayList转换成Set。

在数组中查找元素e

String[] stringArray = { "a", "b", "c", "d", "e" };boolean b = Arrays.asList(stringArray).contains("a");System.out.println(b);// true

先将Array转换成ArrayList,这样就可以用Array.contains方法来判断元素是否包含在原数组中。

数组排序

static void sort(int[] a) 对指定的 int 型数组按数字升序进行排序。
static void sort(int[] a, int fromIndex, int toIndex) 对指定 int 型数组的指定范围按数字升序进行排序。

    int[] a={1,4,-1,5,0};    Arrays.sort(a);//数组a[]的内容变为{-1,0,1,4,5}
0 0
原创粉丝点击