1:StringBuffer(掌握)
(1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,
为了解决这个问题,Java就提供了一个字符串缓冲区类,StringBuffer,供我们使用。
(2)StringBuffer的构造方法
A:StringBuffer()
B:StringBuffer(int size) 容量
C:StringBuffer(String str)
(3)StringBuffer的常见功能
(自己补齐 方法的声明和方法的解释)
A:添加功能
public StringBuffer append(String str):在最后位置,可以把任意类型数据,添加到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offset,String str):在指定位置,把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
B:删除功能
public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身 只删除一个字符
public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身 只包括左边,不包括右边
C:替换功能
public StringBuffer replace(int start,int end,String str):从start开始到end,用str替换 包左不包右
D:反转功能
public StringBuffer reverse() 把对象本身反转
E:截取功能
(注意这个返回值是String类型!)
public String substring(int start)
public String substring(int start,int end)
(4)StringBuffer的练习
(做一遍)
A:String和StringBuffer的相互转换
String -- StringBuffer:建议通过构造方法
String s = "hello";
//通过构造方法
StringBuffer sb = new StringBuffer(s);
//通过append()方法
StringBuffer sb2 = new StringBuffer();
sb2.append(s);
StringBuffer -- String:建议通过toString()方法 不通过构造方法
StringBuffer buffer = new StringBuffer("java");
String str = new String(buffer); 构造方法
String str2 = buffer.toString(); toString()方法
B:字符串的拼接
// 用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:把字符串反转
// 用StringBuffer的reverse()功能
public static String myReverse2(String s) {
/*
通过append()方法 String -- StringBuffer
*
StringBuffer sb = new StringBuffer();
sb.append(s);
//通过构造方法
String -- StringBuffer
StringBuffer sb = new StringBuffer(s); 1
sb.reverse(); //反转 2
return sb.toString(); 返回的是String 3
*/
// 简易版 1,2,3步合为一步
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:判断一个字符串是否对称
// 一个一个的比较
// 版本1
// 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 false
// }
// }
//
// return true; 最终如果没有进去,就return true;
// }
// 一个一个的比较
// 版本2
public static boolean isSame(String s) {
boolean flag = true;//先定义一个boolean类型的flag
// 把字符串转成字符数组
char[] chs = s.toCharArray();
for (int start = 0, end = chs.length - 1; start <= end; start++, end--) {
if (chs[start] != chs[end]) {
flag = false;//一旦有问题了,flag的值就改了
break;
}
}
return flag;
}
//用字符串缓冲区的反转功能
public static boolean isSame2(String s) {
return new StringBuffer(s).reverse().toString().equals(s);
//new StringBuffer(s).reverse().toString() 表示反转后的字符串
}
(5)面试题
小细节:StringBuffer和StringBuilder,可以看成一样的,不过还是有区别:
StringBuffer:
同步的,数据安全,效率低。
StringBuilder:
不同步的,数据不安全,效率高。
A:String,StringBuffer,StringBuilder的区别?
首先回答,String和StringBuffer,StringBuilder的区别?
String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的。
再回答,StringBuffer(多线程)和StringBuilder(单线程)的区别?
StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高
注意:此处的安全指的是多线程的情况下。而我们常用的单线程的程序不会有问题的。所以,用的最多的是StringBuilder
B:StringBuffer和数组的区别?
(6)注意的问题:
String作为形式参数,特殊的引用类型 形式参数改变,String不变 因为String相当于常量,main方法里放的是常量值
StringBuffer作为形式参数。
形式参数,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:基本查找
针对数组无序的情况
public static int getIndex(int[] arr,int value) {
int index = -1;
for(int x=0; x<arr.length; x++) {
if(arr[x] == value) {
index = x;
break;
}
}
return index;
}
B:二分查找(折半查找)
针对数组有序的情况(千万不要先排序,再查找!)
public static int binarySearch(int[] arr,int value) {
int min = 0;
int max = arr.length-1;
int mid = (min+max)/2;
while(arr[mid] != value) { //if arr[mid] != value 就进入循环;
if(arr[mid] > value) {
//value在左边
max = mid - 1;
}else if(arr[mid] < value) {
//value在右边
min = mid + 1;
}
if(min > max) {
//肯定找不到 别玩了
return -1;
}
mid = (min+max)/2; 重新计算 因为没找到,还得继续在这走啊
}
return mid; //if arr[mid] == value 直接return mid;
}
(3)Arrays工具类
A:是针对数组进行操作的工具类。包括排序和查找等功能。
B:要掌握的方法(自己补齐方法)
把数组转成字符串:public static String toString(int[] a)
把数组转成字符串 可对任意数据类型进行操作 我以int举例
排序:public static void sort(int[] a)
对数组进行(升序)排序 可对任意数据类型进行操作 我以int举例
二分查找:public static int binarySearch(int[] a,int key)
二分查找
(4)Arrays工具类的源码解析
(5)把字符串中的字符,进行排序
举例:
"edacbgf"
得到结果"abcdefg"
3:Integer (掌握) int对应的包装类类型
(1)为了让基本类型的数据进行更多的操作,Java就为每种基本类型,提供了对应的包装类类型
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean
(2)Integer的构造方法
A:Integer i = new Integer(100);
B:Integer i = new Integer("100"); 注意:这里的字符串,必须是由数字字符组成。
(3)String和int的相互转换
A:String -- int:
Integer.parseInt("100");
Integer这个类就记住这一个方法
类比:找到该类型对应的包装类,调用parseXxx()
String -- float:
Float.parseFloat(s) Integer这个类就记住这一个方法
B:int -- String:
String.valueOf(100);
(4)其他的功能(了解)
进制转换 2-26进制
* 1常用的基本进制转换
* public static String toBinaryString(int i) 十进制到2进制
* public static String toOctalString(int i)
十进制到8进制
* public static String toHexString(int i)
十进制到16进制
*
* 2十进制到其他进制
* public static String toString(int i,int radix) radix指多少进制
* 由这个我们也看到了进制的范围:2-36
* 为什么呢?
0,...9,a...z
*
* 3其他进制到十进制
* public static int parseInt(String s,int radix)
(5)JDK5的新特性
自动装箱
基本类型--引用类型
自动拆箱
引用类型--基本类型
把下面的这个代码,理解即可:
Integer i = 100;
i += 200;
(6)面试题
-128到127之间的数据缓冲池问题
4:Character (了解) char对应的包装类类型
(1)Character构造方法
Character ch = new Character('a'); 字符类型
(2)要掌握的方法:(自己补齐)
A:判断给定的字符是否是大写
静态方法不需要构建对象,直接类名调用
public static boolean isUpperCase(char ch)
B:判断给定的字符是否是小写
public static boolean isLowerCase(char ch)
C:判断给定的字符是否是数字字符
public static boolean isDigit(char ch)
D:把给定的字符转成大写
public static char toUpperCase(char ch)
E:把给定的字符转成小写
public static char toLowerCase(char ch)
(3)案例:
统计 字符串中大写,小写及数字字符出现的次数