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}
- Java:String、Arrays
- 1341: String and Arrays
- java Arrays
- Arrays.java
- 【Java】Arrays
- Java-Arrays
- 【java】Arrays.asList、Arrays.copyOfRange
- 关于mybatis报invalid comparison: java.util.Arrays$ArrayList and java.lang.String异常
- 中南oj String and Arrays
- 黑马程序员---------java 基础知识复习(foreach、Arrays、String、StringBuffer、容器类)
- Simple Java—Strings and Arrays(一)String是引用传值吗?
- Simple Java—Strings and Arrays(三)为什么String被设计成了不可变型
- Java-Arrays-equals
- java.util.Arrays类
- Java Arrays 总结
- java.util.Arrays类
- JAVA Arrays的算法
- JAVA Arrays.binarySearch
- [Codeforces 719 E. Sasha and Array] 矩阵快速幂+线段树
- Java数组实现可以动态增长的队列
- 【codeforces】AIM Tech Round 3 (Div. 2)
- 轮子系列:一款能用易用好用的Android图片轮播轮子
- 字符串-字符串的全排列-递归实现
- Java:String、Arrays
- word_wrap、word_break和text-overflow的区别
- 数据结构之线性表
- MathJax 引擎数学符号说明
- Leetcode 234. Palindrome Linked List
- SCPPO(二十):系统统一身份认证的改造之路
- 《Android群英传》学习笔记--ADB命令技巧
- android ZLib压缩/解压缩
- C++Primer(第10章课后程序题源代码)