String及其他
String
以下例开始讲解String
public class StringDemo { public static void main(String[] args) { // String s = new String(); // String s1 = ""; String s1 = "abc";//s1是一个类类型变量,"abc"是一个对象 //字符串最大的特点:一旦被初始化就不可以被改变。 String s2 = new String("abc"); //面试题:s1和s2有什么区别? //s1在内存中有一个对象,s2在内存中有两个对象。 System.out.println(s1 == s2); System.out.println(s1.equals(s2));//String类复写了Object类中的equals(), //该方法用于判断字符串是否相同 // s1 = "kk"; // System.out.println(s1); } }
String类是用于描述字符串事物的。那么它就提供了多个方法对字符串进行操作。
常见的操作有哪些?
1、获取
1.1、字符串中包含的字符数,也就是字符串的长度
int length();----获取长度
1.2、根据位置获取位置上某个字符
char charAt(int index);
1.3、根据字符获取该字符在字符串中的位置
int indexOf(int ch);----返回的是ch在字符串中第一次出现的位置
int indexOf(int ch, int fromIndex);----从fromIndex指定位置开始,获取ch在字符串中出现的位置
int indexOf(String str);----返回的是str在字符串中第一次出现的位置。
int indexOf(String str, int fromIndex);----从fromIndex指定位置开始,获取str在字符串中出现的位置
int lastIndexOf(int ch);---反向索引一个字符出现的位置
2、判断
2.1、字符串中是否包含某一个子串
boolean contains(str);
特殊之处:indexOf(str):可以索引str第一次出现的位置,如果返回-1,表示该str不在字符串中存在,所以,也可以用于对指定字符串判断是否包含。而且该方法既可以判 断,又可以获取出现的位置。
if(str.indexOf("aa") != -1)
2.2、字符串是否有内容
boolean isEmpty();----原理就是判断长度是否为0
2.3、字符串是否是以指定内容开头
boolean startWith(str);
2.4、字符串是否是以指定内容结尾
boolean endWith(str);
2.5、判断字符串的内容是否相同,复写了Object类中的equals()
boolean equals(str);
2.6、判断内容是否相同,并忽略大小写
boolean equalsIgnoreCase(str);
3、转换
3.1、将字符数组转成字符串
构造函数:String(char[])
String(char[], offset, count);将字符数组中的一部分转成字符串 ,count是个数
静态方法:static String copyValueOf(char[]);
static String copyValueOf(char[] data, int offset, int count);
static String valueOf(char[]);
3.2、将字符串转成字符数组(**)
char[] toCharArray();
3.3、将字节数组转成字符串
String(byte[])
String(byte[], offset, count);将字节数组中的一部分转成字符串
3.4、将字符串转成字节数组
byte[] getBytes();
3.5、将基本数据类型转成字符串
static String valueOf(int);
static String valueOf(double);
//3+"";//String.valueOf(3); int--->String
特殊:字符串和字节数组在转换过程中,是可以指定编码表的
4、替换
String replace(oldchar, newchar);
5、切割
String[] split(regex);
6、子串。获取字符串中的一部分
String substring(begin);
String substring(begin, end);
7、转换,去除空格,比较
7.1、将字符串转成大写或小写
String toUpperCase();
String toLowerCase();
7.2、将两个字符串两端的多个空格去除
String trim();
7.3、对两个字符串进行自然顺序的比较
int compareTo(String);
举例说明以上方法:
public class StringMethodDemo { public static void method_7() { String s = " Hello Java "; sop(s.toUpperCase()); sop(s.toLowerCase()); sop(s.trim()); String s1 = "a1c"; String s2 = "aaa"; sop(s1.compareTo(s2)); } public static void method_sub() { String s = "abcdef"; sop(s.substring(2));//从指定位置开始到结尾,如果角标不存在,会出现字符串角标越界异常 sop(s.substring(2, 4));//包含头,不包含尾。s.substring(0, s.length()); } public static void method_split() { String s = "zhangsan,lisi,wangwu"; String[] arr = s.split(","); for(int x = 0; x < arr.length; x++) { sop(arr[x]); } } public static void method_replace() { String s = "hello java"; // String s1 = s.replace('q', 'n');//如果要替换的字符不存在,返回的还是原串 String s1 = s.replace("java", "world"); sop("s="+s); sop("s1="+s1); } public static void method_trans() { char[] arr = {'a', 'b', 'c', 'd', 'e', 'f'}; String s = new String(arr, 1, 3); sop("s="+s); String s1 = "zxcvbnm"; char[] chs = s1.toCharArray(); for(int x = 0; x < chs.length; x++) { sop("ch="+chs[x]); } } public static void method_is() { String str = "ArrayDemo.java"; //判断文件名称是否是以Array单词开头 sop(str.startsWith("Array")); //判断文件名称是否是.java文件 sop(str.endsWith(".java")); //判断文件名称是否包含Demo sop(str.contains("Demo")); } public static void method_get() { String str = "abcdeakpf"; //长度 sop(str.length()); //根据索引获取字符 sop(str.charAt(4));//当访问到字符串中不存在的角标时,会发生StringIndexOutOfBoundsException。 //根据字符获取索引 sop(str.indexOf('m', 3));//如果没有找到返回-1 //反向索引一个字符出现的位置 sop(str.lastIndexOf('a')); } public static void main(String[] args) { /* String s1 = "abc"; String s2 = new String("abc"); String s3 = "abc"; System.out.println(s1 == s2); System.out.println(s1 == s3); System.out.println(s2 == s3); */ // method_get(); // method_is(); // method_trans(); // method_replace(); // method_split(); // method_sub(); method_7(); } public static void sop(Object obj) { System.out.println(obj); } }
练习1、模拟一个trim()方法,去除字符串两端的空格。
示例代码如下:
/* 1、模拟一个trim()方法,去除字符串两端的空格。 思路: 1、判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。结尾处判断空格也是如此 2、当开始和结尾都判断到不是空格时,就是要获取的字符串 */ public class StringTest { public static void sop(String str) { System.out.println(str); } public static String myTrim(String str) { int start = 0, end = str.length()-1; while(start <= end && str.charAt(start) == ' ') start++; while(start <= end && str.charAt(end) == ' ') end--; return str.substring(start, end+1); } public static void main(String[] args) { String s = " ab cd "; sop("("+s+")"); s = myTrim(s); sop("("+s+")"); } }
练习2、将一个字符串进行反转。将字符串中指定的部分进行反转,"abcdefg"--->"abfedcg"
示例代码如下:
public class StringTest1 { public static void sop(String str) { System.out.println(str); } public static String reverseString(String s, int start, int end) { char[] chs = s.toCharArray(); reverse(chs, start, end); return new String(chs); } //将字符串反转 public static String reverseString(String s) { /* char[] chs = s.toCharArray(); reverse(chs); return new String(chs); */ return reverseString(s, 0, s.length()); } private static void reverse(char[] arr) { for(int start = 0, end = arr.length - 1; start < end; start++, end--) { swap(arr, start, end); } } private static void reverse(char[] arr, int x, int y) { for(int start = x, end = y-1; start < end; start++, end--) { swap(arr, start, end); } } private static void swap(char[] arr, int x, int y) { char temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } public static void main(String[] args) { String s = "ab cd "; sop("("+s+")"); sop("("+reverseString(s)+")"); sop("("+reverseString(s, 0, 3)+")"); } }
练习3、获取一个字符串在另一个字符串中出现的次数。"abkkcdkkefkkskk"
示例代码如下:
/* 3、获取一个字符串在另一个字符串中出现的次数。"abkkcdkkefkkskk" 思路: 1、定义一个计数器 2、获取kk第一次出现的位置 3、从第一次出现的位置后剩余的字符串中继续获取kk出现的位置,每获取一次就计数一次 4、当获取不到时,计数完成 */ public class StringTest2 { public static void sop(String str) { System.out.println(str); } public static int getSubCount(String str, String key) { int count = 0; int index = 0; while((index = str.indexOf(key)) != -1 ) { sop("str = " + str); str = str.substring(index+key.length()); count++; } return count; } /* * 方式二 */ public static int getSubCount_1(String str, String key) { int count = 0; int index = 0; while((index = str.indexOf(key, index)) != -1) { sop("index="+index); index = index + key.length(); count++; } return count; } public static void main(String[] args) { String str = "kkabkkcdkkefkks"; sop("count======"+str.split("kk").length);//不建议使用 sop("count="+getSubCount_1(str, "kk")); } }
练习4、获取两个字符串中最大相同子串。
示例代码如下:
/* 4、获取两个字符串中最大相同子串。第一个动作,将短的那个串进行长度一次递减的子串打印。 "abcwerthelloyuiodef" "cvhellobnm" 思路: 1、将短的那个子串按照长度递减的方式获取到 2、将每获取到的子串去长串中判断是否包含,如果包含,已经找到 */ public class StringTest3 { public static void sop(String str) { System.out.println(str); } public static String getMaxSubString(String s1, String s2) { String max = "", min = ""; max = (s1.length() > s2.length())?s1:s2; min = (max == s1)?s2:s1; // sop("max="+max+"....min="+min); for(int x = 0; x < min.length(); x++) { for(int y =0, z = min.length() - x; z != s2.length()+1; y++, z++) { String temp = min.substring(y, z); // sop(temp); if(max.contains(temp)) { return temp; } } } return ""; } public static void main(String[] args) { String s1 = "abcwerthelloyuiodef"; String s2 = "cvhellobnm"; sop(getMaxSubString(s1, s2)); } }
StringBuffer
StringBuffer是字符串缓冲区,是一个容器。
特点:
- 长度可变化
- 可以直接操作多个数据类型
- 最终会通过toString()变成字符串
C(create)U(update)R(read)D(delete)
1、存储
StringBuffer append();---将指定的数据作为参数添加到已有数据的结尾处
StringBuffer insert(index, data);---可以将数据插入到指定index位置
2、删除
StringBuffer delete(start, end);---删除缓冲区中的数据,包含start,不包含end
StringBuffer deleteCharAt(index);---删除指定位置的字符
3、获取
char charAt(int index);
int indexOf(String str);
int lastIndexOf(String str);
int length();
String substring(int start, int end);
4、修改
StringBuffer replace(start, end, string);
void setCharAt(int index, char ch);
5、反转
StringBuffer reverse();
6、将缓冲区中的指定数据存储到指定字符数组中
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);
以下示例说明StringBuffer
public class StringBufferDemo { public static void main(String[] args) { // method_delete(); // method_update(); // StringBuffer sb = new StringBuffer("abcdef"); StringBuilder sb = new StringBuilder("abcdef"); char[] chs = new char[6]; sb.getChars(1, 4, chs, 1); for(int x = 0; x < chs.length; x++) { sop("chs["+x+"]="+chs[x]+";"); } } public static void method_add() { StringBuffer sb = new StringBuffer(); sb.append("abc").append(true).append(34);//方法调用链 sb.insert(1, "qq"); sop(sb.toString());//abctrue34 // StringBuffer sb1 = sb.append(34); // sop("(sb==sb1):"+(sb==sb1));//true // sop(sb.toString()); // sop(sb1.toString()); } public static void method_delete() { StringBuffer sb = new StringBuffer("abcde"); // sb.delete(1, 3); //清空缓冲区 // sb = new StringBuffer(); // sb.delete(0, sb.length()); // sb.delete(2, 3); sb.deleteCharAt(2); sop(sb.toString()); } public static void method_update() { StringBuffer sb = new StringBuffer("abcde"); // sb.replace(1, 4, "java"); sb.setCharAt(2, 'k'); sop(sb.toString()); } public static void sop(String str) { System.out.println(str); } }
StringBuilder
JDK1.5版本之后,出现了StringBuilder。
StringBuffer与StringBuilder的区别:
- StringBuffer是线程同步的
- StringBuilder是线程不同步的
将StringBuilder的实例用于多个线程时是不安全的。如果需要这样的同步,则建议使用StringBuffer。
注意:以后开发,建议使用StringBuilder。
升级三个因素:
- 提高效率
- 简化书写
- 提高安全
基本数据类型对象包装类
byte | Byte |
short | Short |
int | Integer |
long | Long |
boolean | Boolean |
float | Float |
double | Double |
char | Character |
基本数据类型包装类的最常见作用:就是用于基本数据类型和字符串类型之间做转换。
基本数据类型转成字符串:
基本数据类型+"";
专业做法:基本数据类型的包装类.toString(基本数据类型值)
如:Integer.toString(34);//将整数34变成字符串"34";
字符串转成基本数据类型:
应用:文本框获取的数据都是字符串
xxx a = Xxx.parseXxx(String);
例如:
int a = Integer.parseInt("123");
double b = Double.parseDouble("12.23");
boolean b = Boolean.parseBoolean("true");
Integer i = new Integer("123");
int num = i.intValue();
十进制转成其他进制
toBinaryString();
toHexString();
toOctalString();
其他进制转成十进制
parseInt(String, radix);
示例代码:
public class IntegerDemo { public static void sop(String str) { System.out.println(str); } public static void main(String[] args) { //整数类型的最大值 // sop("int max : "+Integer.MAX_VALUE); //将一个字符串转成整数 // int num = Integer.parseInt("123");//NumberFormatException,必须传入数字格式的字符串。 // long x = Long.parseLong("123"); // sop("num="+(num+4)); // sop(Integer.toBinaryString(6)); // sop(Integer.toBinaryString(-6)); // sop(Integer.toHexString(60)); int x = Integer.parseInt("3c", 16); sop("x="+x); } }
JDK1.5版本以后出现的新特性——装箱与拆箱
示例代码:
public class IntegerDemo1 { public static void sop(String str) { System.out.println(str); } public static void method() { Integer x = new Integer("123"); Integer y = new Integer(123); sop("x==y:"+(x==y)); sop("x.equals(y):"+x.equals(y)); } public static void main(String[] args) { // Integer x = new Integer(4); Integer x = 4;//自动装箱 === new Integer(4); Integer x = null; x = x /*x.intValue()*/ + 2;//x+2:x进行了自动拆箱,变成了int类型,和2进行加法运算 //再将和进行装箱赋给x Integer m = 128; Integer n = 128; sop("m==n:"+(m==n));//false Integer a = 127; Integer b = 127; sop("a==b:"+(a==b));//结果为true。因为a和b指向了同一个Integer对象 //因为当数值在byte范围内时,对于新特性,如果该数值已经存在则不会再开辟新的空间 } }