Java基础第13天+StringBuffer(掌握)、StringBuilder(掌握)、Char
1:StringBuffer(掌握) (1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了 ???一个字符串缓冲区类。StringBuffer供我们使用。 (2)StringBuffer的构造方法 A:StringBuffer():无参构造方法 B:StringBuffer(int size):指定容量的字符串缓冲区对象 C:StringBuffer(String str):指定字符串内容的字符串缓冲区对象 (3)StringBuffer的常见功能(自己补齐方法的声明和方法的解释) A:添加功能 ? /* * StringBuffer的添加功能: * public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身 * * public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身 */ public class StringBufferDemo { public static void main(String[] args) { // 创建字符串缓冲区对象 StringBuffer sb = new StringBuffer(); // public StringBuffer append(String str) // StringBuffer sb2 = sb.append("hello"); // System.out.println("sb:" + sb); // System.out.println("sb2:" + sb2); // System.out.println(sb == sb2); // true // 一步一步的添加数据 // sb.append("hello"); // sb.append(true); // sb.append(12); // sb.append(34.56); // 链式编程 sb.append("hello").append(true).append(12).append(34.56); System.out.println("sb:" + sb); // public StringBuffer insert(int offset,String // str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身 sb.insert(5,"world"); System.out.println("sb:" + sb); } } ?
? B:删除功能 ? /* * StringBuffer的删除功能 * public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身 * public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身 */ public class StringBufferDemo { public static void main(String[] args) { // 创建对象 StringBuffer sb = new StringBuffer(); // 添加功能 sb.append("hello").append("world").append("java"); System.out.println("sb:" + sb); // public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身 // 需求:我要删除e这个字符,肿么办? // sb.deleteCharAt(1); // 需求:我要删除第一个l这个字符,肿么办? // sb.deleteCharAt(1); // public StringBuffer delete(int start,int // end):删除从指定位置开始指定位置结束的内容,并返回本身 // 需求:我要删除world这个字符串,肿么办? // sb.delete(5,10); // 需求:我要删除所有的数据 sb.delete(0,sb.length()); System.out.println("sb:" + sb); } } ?
? C:替换功能 ? /* * StringBuffer的替换功能: * public StringBuffer replace(int start,int end,String str):从start开始到end用str替换 */ public class StringBufferDemo { public static void main(String[] args) { // 创建字符串缓冲区对象 StringBuffer sb = new StringBuffer(); // 添加数据 sb.append("hello"); sb.append("world"); sb.append("java"); System.out.println("sb:" + sb); // public StringBuffer replace(int start,String // str):从start开始到end用str替换 // 需求:我要把world这个数据替换为"节日快乐" sb.replace(5,10,"节日快乐"); System.out.println("sb:" + sb); } } ?
? D:反转功能 ? /* * StringBuffer的反转功能: * public StringBuffer reverse() */ public class StringBufferDemo { public static void main(String[] args) { // 创建字符串缓冲区对象 StringBuffer sb = new StringBuffer(); // 添加数据 sb.append("霞青林爱我"); System.out.println("sb:" + sb); // public StringBuffer reverse() sb.reverse(); System.out.println("sb:" + sb); } } ?
? E:截取功能(注意这个返回值) ? /* * StringBuffer的截取功能:注意返回值类型不再是StringBuffer本身了 * public String substring(int start) * public String substring(int start,int end) */ public class StringBufferDemo { public static void main(String[] args) { // 创建字符串缓冲区对象 StringBuffer sb = new StringBuffer(); // 添加元素 sb.append("hello").append("world").append("java"); System.out.println("sb:" + sb); // 截取功能 // public String substring(int start) String s = sb.substring(5); System.out.println("s:" + s); System.out.println("sb:" + sb); // public String substring(int start,int end) String ss = sb.substring(5,10); System.out.println("ss:" + ss); System.out.println("sb:" + sb); } } ?
? (4)StringBuffer的练习(做一遍) A:String和StringBuffer相互转换
? B:字符串的拼接 ? /* * 把数组拼接成一个字符串 */ public class StringBufferTest2 { public static void main(String[] args) { // 定义一个数组 int[] arr = { 44,33,55,11,22 }; // 定义功能 // 方式1:用String做拼接的方式 String s1 = arrayToString(arr); System.out.println("s1:" + s1); // 方式2:用StringBuffer做拼接的方式 String s2 = arrayToString2(arr); System.out.println("s2:" + s2); } // 用StringBuffer做拼接的方式 public static String arrayToString2(int[] arr) { StringBuffer sb = new StringBuffer(); sb.append("["); for (int x = 0; x < arr.length; x++) { if (x == arr.length - 1) { sb.append(arr[x]); } else { sb.append(arr[x]).append(","); } } sb.append("]"); return sb.toString(); } // 用String做拼接的方式 public static String arrayToString(int[] arr) { String s = ""; s += "["; for (int x = 0; x < arr.length; x++) { if (x == arr.length - 1) { s += arr[x]; } else { s += arr[x]; s += ","; } } s += "]"; return s; } } ?
? C:把字符串反转 ? /* * 把字符串反转 */ public class StringBufferTest3 { public static void main(String[] args) { // 键盘录入数据 Scanner sc = new Scanner(System.in); System.out.println("请输入数据:"); String s = sc.nextLine(); // 方式1:用String做拼接 String s1 = myReverse(s); System.out.println("s1:" + s1); // 方式2:用StringBuffer的reverse()功能 String s2 = myReverse2(s); System.out.println("s2:" + s2); } // 用StringBuffer的reverse()功能 public static String myReverse2(String s) { // StringBuffer sb = new StringBuffer(); // sb.append(s); // StringBuffer sb = new StringBuffer(s); // sb.reverse(); // return sb.toString(); // 简易版 return new StringBuffer(s).reverse().toString(); } // 用String做拼接 public static String myReverse(String s) { String result = ""; char[] chs = s.toCharArray(); for (int x = chs.length - 1; x >= 0; x--) { // char ch = chs[x]; // result += ch; result += chs[x]; } return result; } } ?
? D:判断一个字符串是否对称 ? /* * 判断一个字符串是否是对称字符串 * 例如"abc"不是对称字符串,"aba"、"abba"、"aaa"、"mnanm"是对称字符串 * * 分析: * 判断一个字符串是否是对称的字符串,我只需要把 * 第一个和最后一个比较 * 第二个和倒数第二个比较 * ... * 比较的次数是长度除以2。 */ public class StringBufferTest4 { public static void main(String[] args) { // 创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String s = sc.nextLine(); // 一个一个的比较 boolean b = isSame(s); System.out.println("b:" + b); //用字符串缓冲区的反转功能 boolean b2 = isSame2(s); System.out.println("b2:"+b2); } public static boolean isSame2(String s) { return new StringBuffer(s).reverse().toString().equals(s); } // public static boolean isSame(String s) { // // 把字符串转成字符数组 // char[] chs = s.toCharArray(); // // for (int start = 0,end = chs.length - 1; start <= end; start++,end--) { // if (chs[start] != chs[end]) { // return false; // } // } // // return true; // } public static boolean isSame(String s) { boolean flag = true; // 把字符串转成字符数组 char[] chs = s.toCharArray(); for (int start = 0,end--) { if (chs[start] != chs[end]) { flag = false; break; } } return flag; } } ?
? (5)面试题 小细节: StringBuffer:同步的,数据安全,效率低。 StringBuilder:不同步的,数据不安全,效率高。 A:String,StringBuffer,StringBuilder的区别 ?
? B:StringBuffer和数组的区别? ?
? (6)注意的问题: String作为形式参数,StringBuffer作为形式参数。 ? 2:数组高级以及Arrays(掌握) (1)排序 A:冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。同理,其他的元素就可以排好。 //冒泡排序代码 public static void bubbleSort(int[] arr){ for (int x = 0; x < arr.length - 1; x++) { for (int y = 0; y < arr.length - 1 - x; y++) { if (arr[y] > arr[y + 1]) { int temp = arr[y]; arr[y] = arr[y + 1]; arr[y + 1] = temp; } } } }
B:选择排序 把0索引的元素,和索引1以后的元素都进行比较,第一次完毕,最小值出现在了0索引。同理,其他的元素就可以排好。 public static void selectSort(int[] arr){ for(int x=0; x<arr.length-1; x++){ for(int y=x+1; y<arr.length; y++){ if(arr[y] <arr[x]){ int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } } } }
(2)查找 A:基本查找 针对数组无序的情况
B:二分查找(折半查找) 针对数组有序的情况(千万不要先排序,在查找) public static int getIndex(int[] arr,int value){ //定义最大索引,最小索引 int max = arr.length -1; int min = 0; //计算出中间索引 int mid = (max +min)/2; //拿中间索引的值和要查找的值进行比较 while(arr[mid] != value){ if(arr[mid]>value){ max = mid - 1; }else if(arr[mid]<value){ min = mid + 1; } //加入判断 if(min > max){ return -1; } mid = (max +min)/2; } return mid; }
(3)Arrays工具类 A:是针对数组进行操作的工具类。包括排序和查找等功能。 B:要掌握的方法(自己补齐方法) public static String toString(int[] a) 把数组转成字符串 public static void sort(int[] a) 对数组进行排序 public static int binarySearch(int[] a,int key) 二分查找 (4)Arrays工具类的源码解析 ? public static String toString(int[] a) public static void sort(int[] a) 底层是快速排序,知道就可以了。有空看,有问题再问我 public static int binarySearch(int[] a,int key) 开发原则: 只要是对象,我们就要判断该对象是否为null。 int[] arr = { 24,69,80,57,13 }; System.out.println("排序前:" + Arrays.toString(arr)); public static String toString(int[] a) { //a -- arr -- { 24,13 } if (a == null) return "null"; //说明数组对象不存在 int iMax = a.length - 1; //iMax=4; if (iMax == -1) return "[]"; //说明数组存在,但是没有元素。 StringBuilder b = new StringBuilder(); b.append(‘[‘); //"[" for (int i = 0; ; i++) { b.append(a[i]); //"[24,13" if (i == iMax) //"[24,13]" return b.append(‘]‘).toString(); b.append(","); //"[24," } } ----------------------------------------------------- int[] arr = {13,24,80}; System.out.println("binarySearch:" + Arrays.binarySearch(arr,577)); public static int binarySearch(int[] a,int key) { //a -- arr -- {13,80} //key -- 577 return binarySearch0(a,a.length,key); } private static int binarySearch0(int[] a,int fromIndex,int toIndex,int key) { //a -- arr -- {13,80} //fromIndex -- 0 //toIndex -- 5 //key -- 577 int low = fromIndex; //low=0 int high = toIndex - 1; //high=4 while (low <= high) { int mid = (low + high) >>> 1; //mid=2,mid=3,mid=4 int midVal = a[mid]; //midVal=57,midVal=69,midVal=80 if (midVal < key) low = mid + 1; //low=3,low=4,low=5 else if (midVal > key) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. } ?
? (5)把字符串中的字符进行排序 举例: "edacbgf" 得到结果 "abcdefg" ? /* * 把字符串中的字符进行排序。 * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: * A:定义一个字符串 * B:把字符串转换为字符数组 * C:把字符数组进行排序 * D:把排序后的字符数组转成字符串 * E:输出最后的字符串 */ public class ArrayTest { public static void main(String[] args) { // 定义一个字符串 String s = "dacgebf"; // 把字符串转换为字符数组 char[] chs = s.toCharArray(); // 把字符数组进行排序 bubbleSort(chs); //把排序后的字符数组转成字符串 String result = String.valueOf(chs); //输出最后的字符串 System.out.println("result:"+result); } // 冒泡排序 public static void bubbleSort(char[] chs) { for (int x = 0; x < chs.length - 1; x++) { for (int y = 0; y < chs.length - 1 - x; y++) { if (chs[y] > chs[y + 1]) { char temp = chs[y]; chs[y] = chs[y + 1]; chs[y + 1] = temp; } } } } }
3:Integer(掌握) 常用的基本进制转换 public static String toBinaryString(int i) public static String toOctalString(int i) public static String toHexString(int i) (1)为了让基本类型的数据进行更多的操作,Java就为每种基本类型提供了对应的包装类类型
用于基本数据类型与字符串之间的转换。 ? (2)Integer的构造方法 public Integer(int value) public Integer(String s) ? A:Integer i = new Integer(100); B:Integer i = new Integer("100"); 注意:这里的字符串必须是由数字字符组成 (3)String和int的相互转换 // int -- String int number = 100; // 方式1 String s1 = "" + number; // 方式2 String s2 = String.valueOf(number); // 方式3 // int -- Integer -- String Integer i = new Integer(number); String s3 = i.toString(); // 方式4 // public static String toString(int i) String s4 = Integer.toString(number); System.out.println("s4:" + s4); ? // String -- int String s = "100"; // 方式1 // String -- Integer -- int Integer ii = new Integer(s); // public int intValue() int x = ii.intValue(); //方式2 //public static int parseInt(String s) int y = Integer.parseInt(s); 推荐: A:String -- int Integer.parseInt("100"); B:int -- String String.valueOf(100); (4)其他的功能(了解) 进制的范围:2-36,因为0.。。。9+a。。。z一共36个 进制转换 (5)JDK5的新特性 自动装箱 基本类型--引用类型 自动拆箱 引用类型--基本类型 在使用时,Integer ?x = null;上面的代码就会出现 NullPointerException。 ? 把下面的这个代码理解即可: Integer i = 100; i += 200; (6)面试题 -128到127之间的数据缓冲池问题 ? 4:Character(了解) (1)Character构造方法 Character ch = new Character(‘a‘); (2)要掌握的方法:(自己补齐) A:public static boolean isUpperCase(char ch):A:判断给定的字符是否是大写 B:public static boolean isLowerCase(char ch):B:判断给定的字符是否是小写 C:public static boolean isDigit(char ch)?:C:判断给定的字符是否是数字字符 D:public static char toUpperCase(char ch):D:把给定的字符转成大写 E:public static char toLowerCase(char ch):E:把给定的字符转成小写 ? (3)案例: 统计字符串中大写,小写及数字字符出现的次数 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |