System.out.println(Character.toUpperCase('a'));
第五周 API常用类(二)
一 StringBuffer类
线程安全的可变字符序列
概念:表示的是一个本身内容可变的字符串对象,包含一个缓冲区,主要用于完成字符串的动态添加、插入和替换等操作。
StringBuffer的添加功能:
public StringBuffer append(String/boolean....) :在字符串缓冲区中追加数据(在末尾追加),并且返回字符串缓冲区本身
//创建一个字符串缓冲区对象
StringBuffer sb = new StringBuffer();
sb.append("hello");
sb.append('A');
sb.append(true);
sb.append(1234);
sb.append(3.14);
System.out.println(sb);
public StringBuffer insert(int offset,String str):将当前str字符串添加到指定位置处,它返回字符串缓冲区本身
//创建一个字符串缓冲区对象
StringBuffer sb = new StringBuffer();
sb.append("a1");
sb.append("b2");
sb.append("d4");
sb.append("e5");
sb.append("f6");
sb.insert(4, "c3");
System.out.println(sb);//a1b2c3d4e5f6
StringBuffer的删除功能:
public StringBuffer deleteCharAt(int index):移除指定位置处的字符
//创建一个字符串缓冲区对象
StringBuffer sb = new StringBuffer();
sb.append("a1");
sb.append("b2");
sb.append("d4");
sb.append("e5");
sb.append("f6");
//删除‘b’这个字符
sb.deleteCharAt(2);
System.out.println(sb);//a1b2d4e5f6-->a12d4e5f6
public StringBuffer delete(int start,int end):移除从指定位置处到end-1处的子字符串
//创建一个字符串缓冲区对象
StringBuffer sb = new StringBuffer();
sb.append("a1");
sb.append("b2");
sb.append("d4");
sb.append("e5");
sb.append("f6");
//移除d4e5
sb.delete(4, 8);
System.out.println(sb);//a1b2d4e5f6-->a1b2f6
StringBuffer的反转功能:
public StringBuffer reverse() :将缓冲区中的字符序列反转取代,返回它(字符串冲)本身
//创建一个字符串缓冲区对象
StringBuffer sb = new StringBuffer();
sb.append("abcd1234");
sb.reverse();
System.out.println(sb);//4321dcba
StringBuffer的截取功能:
public String substring(int start):从指定位置开始截取,默认截取到末尾,返回值不在是缓冲区本身,而是一个新的字符串
//创建一个字符串缓冲区对象
StringBuffer sb = new StringBuffer();
sb.append("HelloWorld");
//截取world
//返回的是一个新字符,所以将截取后的值赋给新定义的str
String str = sb.substring(5);
System.out.println(str);
public String substring(int start,int end) :从指定位置开始到指定位置结束截取,包前不包后,返回值不在是缓冲区本身,而是一个新的字符串
//创建一个字符串缓冲区对象
StringBuffer sb = new StringBuffer();
sb.append("HelloWorld");
//截取oWo
//因为包前不包后,所以截止到‘r’
String str = sb.substring(4,7);
System.out.println(str);
StringBuffer的替换功能:
public StringBuffer replace(int start,int end,String str) :从指定位置到指定位置结束,用新的str字符串去替换,返回值是字符串缓冲区本身
//创建一个字符串缓冲区对象
StringBuffer sb = new StringBuffer();
sb.append("HelloWorld");
sb.replace(5, 10, "China");
System.out.println(sb);
StringBuffer练习
1.将数组拼接成字符串类型
package org.test_01;
public class StringBufferDemo {
public static void main(String[] args) {
//定义数组
int [] arr = {1,2,3};
//方法一:String类型
String str = arrayToString(arr);
System.out.println(str);
//方式二:StringBuffer类型
String str2 = arrayToString2(arr);
System.out.println(str2);
}
//方式二:StringBuffer类型
private static String arrayToString2(int[] arr) {
//创建字符串缓冲区对象
StringBuffer sb = new StringBuffer();
//添加左中括号
sb.append("[");
//遍历数组
for (int i = 0; i < arr.length; i++) {
//判断
if(i==arr.length-1) {
sb.append(arr[i]);
}else {
sb.append(arr[i]).append(",");
}
}
//添加右中括号
sb.append("]");
return sb.toString();
}
//方式1:String类型
private static String arrayToString(int[] arr) {
//定义一个字符串
String result = "";
//拼接左中括号
result += "[";
//遍历数组
for(int x = 0 ; x < arr.length; x++) {
//判断
if(x==arr.length-1) {//当遍历到最后一个数组时拼接右中括号
result += arr[x];
result += "]";
}else {
result += arr[x];
result += ",";
}
}
return result;
}
}
2.判断一个字符串是否是对称字符串(方法改进)
package org.test_01;
/**
* 用键盘录入一个字符串,判断是否对称
*/
import java.util.Scanner;
public class StringBufferTest {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//接收数据
System.out.println("请输入一个字符串");
String line = sc.nextLine();
//方法改进
boolean flag = isSame(line);
if(flag) {
System.out.println("对称");
}else {
System.out.println("不对称");
}
}
public static boolean isSame(String s) {
//创建字符串缓冲区对象
// StringBuffer sb = new StringBuffer(s);
// String str = sb.reverse().toString();
// return str.equals(s);
//一步完成
return new StringBuffer(s).reverse().toString().equals(s);
}
}
几个面试题
1.StringBuffer,String,StringBuilder的区别?
StringBuffer和StringBuilder都是一个可变的字符序列,提供一个缓冲区(两者都看做容器);
StringBuffer:线程安全的,同步的,执行效率低
StringBuilder:线程不安全的,不同步的,执行效率高,并且单线程中优先采用StringBuilder
StringBuffer 执行效率虽然低,但是由于String类型,并且他可变的字符序列,提供了缓冲区
2.StringBuffer和数组的区别?
数组: 它是可以存储多个数据的容器,并且多个数据的类型必须一致. //数组长度功能: length属性
StringBuffer: 它是容器,它在字符串缓冲区始终存储的只能是字符串类型的数据. //获取缓冲区的长度: length( );
二 数据类型包装器类
Java使用简单的数据类型, 例如整型(int)和字符(char), 这些数据类型不是对象层次结构的组成部分. 它们通过值传递而不能直接通过引用传递给方法. 有时需要对这些简单的类型建立对象表达式,例如, 当把数据放到集合中时, 需要首先将其包装成对象. 为了能够用对象的形式代表简单数据类型, Java提供了与每一种简单类型相对应的类. 本质上, 这些类包装(wrap)了简单类型的数据. 因此,通常将它们称为类型包装器或者包装器类.
基本数据类型都有一个对应的包装类型, 目的就是为了将基本数据类型可以同String类型之间互相转换.
/**
*
* byte Byte
* short Short
* int Integer
* long Long
* float Float
* double Double
* char character
* boolean Boolean
*
*/
1. Integer类
Integer类是int类型的包装类类型
获取Integer的最值
public static final int MAX_VALUE //最大值
System.out.println(Integer.MAX_VALUE); //2147483647
public static final int MIN_VALUE //最小值
System.out.println(Integer.MIN_VALUE); //-2147483648
Integer提供了静态功能:
public static String toBinaryString(int i) //以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
System.out.println(Integer.toBinaryString(10086)); //10011101100110
public static String toOctalString(int i) //以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
System.out.println(Integer.toOctalString(10086)); //23546
public static String toHexString(int i) //以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
System.out.println(Integer.toHexString(10086)); //2766
Integer的构造方法:
public Integer(int value)
public Integer(String s)
运行时的常见异常
java.lang.NumberFormatException //当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
// Integer iii = new Integer ("abc"); //打印不出来,因为该字符串不能转换为数值类型
Integer iiii = new Integer("100"); //可以打印出来,因为用parseInt方法把字符串类型转换为数值类型
// System.out.println(iii); //抛出异常java.lang.NumberFormatException
System.out.println(iiii);
int-->String&String-->int
将int类型转换为String类型
valueOf ( int i )
//int-->String
int num = 100;
//方式1:字符串拼接
String str = "" + num;
System.out.println(str);
//方式2:valueOf(int i)
//int-->Integer-->String
Integer i = Integer.valueOf(num);
String str2 = i.toString();
System.out.println(str2);
//方式3:静态toString(int i) static String toString(int i)
String str3 = Integer.toString(num);
System.out.println(str3);//验证是不是字符串类型,如果是,则会自动拼接为10020
结果:
100
100
10020
将String类型转换为int类型
static int parseInt ( String s )
//String-->int
String s ="100";
//方式1:String-->Integer-->int
Integer ii = new Integer(s);
int num1 = ii.intValue();
System.out.println(num1+20);//验证是不是数值类型,如果是,则会自动加和为120
//方式2:(常用)public static int parseInt(String s)
int num2 = Integer.parseInt(s);
System.out.println(num2+30);//验证是不是数值类型,如果是,则会自动加和为130
结果:
120
130
jdk5以后的特性:自动拆装箱
String-->StringBuffer、int-->Integer(是int类型的包装类类型)、char-->Character(char类型的包装类类型)等等
int i = 5;
Integer ii = i ;//这是自动装箱
int j = ii;//这是自动拆箱
//创建Integer对象
// Integer i = new Integer(100) ;
Integer i = 100 ;
i += 200; //先拆箱(Integer-->int),后装箱(int值---->Integer)
//引用类型 += 基本类型
System.out.println("i:"+i);
/**
* 反编译代码:
*
* Integer i = Integer.valueOf(100);
i = Integer.valueOf(i.intValue() + 200);//(int类型的100 +200)
System.out.println((new StringBuilder("i:")).append(i).toString());
*/
为什么会有自动拆装箱?
比如int和Integer,int是基本类型,Integer是是int的包装类,在jdk5之前int不能直接赋值给Integer的,正确将int类型赋值给Integer的方式是:Integer integer = new Integer(5);而jdk5以后系统会自动完成转换
三 Character类
Character是char类型的包装类类型
Character类的判断功能:
public static boolean isDigit(char ch): 确定指定字符是否为数字
System.out.println(Character.isDigit('a'));
System.out.println(Character.isDigit('0'));
public static boolean isLowerCase(int ch): 确定是否是小写字母字符
System.out.println(Character.isUpperCase('a'));
public static boolean isUpperCase(int ch): 确定是否大写字母字符
System.out.println(Character.isLowerCase('b'));
两个转换功能
public static int toLowerCase(int codePoint)
System.out.println(Character.toUpperCase('a'));
public static int toUpperCase(int codePoint)
System.out.println(Character.toLowerCase('A'));
练习:
需求:键盘录入一个字符串,统计当前字符串中大写字母字符,小写字母字符,数字字符的个数(不考虑其他字符)
public class CharacterDemo {
public static void main(String[] args) {
// 定义三个统计变量
int bigCount = 0;
int smallCount = 0;
int numCount = 0;
// 创建键盘录入对象
Scanner sc = new Scanner(System.in);
// 接收数据
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
// 字符串转字符数组
char[] chs = line.toCharArray();
// 遍历
for (int i = 0; i < chs.length; i++) {
char ch = chs[i];
// 判断统计
if (Character.isUpperCase(ch)) {
bigCount++;
} else if (Character.isLowerCase(ch)) {
smallCount++;
} else if (Character.isDigit(ch)) {
numCount++;
}
}
// 输出结果
System.out.println("大写字母字符有:" + bigCount + "个");
System.out.println("小写字母字符有:" + smallCount + "个");
System.out.println("数字字符有:" + numCount + "个");
}
}