复习
1.匿名内部类
1.什么是内部类,内部类分类,所掌握的内部类的形式以及成员访问。
2.没有名字的类
前提:必须有继承或实现。
本质:创建一个匿名的子类对象
格式:
new 父类名/接口名(){
重写方法
特有方法,可以有但是不建议
};
java.lang包,jvm自动导入该包,不需要写import语句。
public class Demo1 {
public static void test(Inter inter){ //inter= new MyInter() 继承+匿名对象
inter.show();
}
public static void main(String[] args) {
// test(new MyInter());
Inter inter = new Inter() {
@Override
public void show() {
System.out.println("---");
}
};
test(inter);
test(new Inter() {
@Override
public void show() {
System.out.println("show");
}
});
}
}
2.Object类
概述:根类,所有类都将Object作为直接或间接的父类,包括数组都继承该类的方法。
方法:
equals:比较是否指向同一个对象
== 和 equals有什么区别。
equals方法通常重写,比较对象的属性信息。
toString:返回对象的字符串描述,格式:类名@哈希值,该方法不需要手动调用会自动调用
该方法也会重写,返回对象的属性信息数据
hashCode:返回对象的哈希值
3.String类
概述:字符串类,字面值双引号数据就是该类的实例对象
是一个常量,不可改变的字符序列。实际底层是一个字符数据(字节数组)
构造方法:
new String(byte[] by)
new String(byte[] by,charsetName) charsetName,字符集名,utf-8,gbk
new String(byte[] by,index, count)
new String(byte[] by,index, count,charsetName)
new String(char[] ch)
new String(char[] ch,index,count)
方法:
判断:
equals ,isEmpty,startsWith()…
获取:
length(),charAt(index),substring(index),indexOf(),…
课程
一. String类常用功能
(一)String类的转换功能
- byte[] getBytes():将当前字符串,转成字节数组
- char[] toCharArray():将当前的字符串,转成字符数组
- toUpperCase():将当前的字符串,转成全大写形式
- toLowerCase():将当前的字符串,转成全小写形式
- static valueOf家族:可以将任意数据类型的数据,转换成字符串
案例1 : 键盘录入一个大小写混杂的纯英文字符串将字符串转换成首字母大写,其他字母全部小写例如,字符串”i lOvE jAvA”,转换成 “I love java”
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "abcdDEFg";
//将字符串转为字节数组---编码
byte[] bytes = s.getBytes(); //系统平台默认编码
System.out.println(Arrays.toString(bytes));
byte[] bytes1 = s.getBytes("gbk"); //使用指定的编码表解码
System.out.println(Arrays.toString(bytes1));
//将字符串转为字符数组
char[] chars = s.toCharArray();
System.out.println(Arrays.toString(chars));
//将字符串中的大写字母转为小写形式
String s1 = s.toLowerCase();
System.out.println(s1);
//将字符串中的小写字母转为大写形式
String s2 = s.toUpperCase();
System.out.println(s2);
//静态方法:
//将任意类型数据(基本、引用)转为字符串
String s3 = String.valueOf(true);
System.out.println(s3);
String s4 = String.valueOf(new Object());
System.out.println(s4);
//将字符数组转为字符串
char[] ch = {'a','b','c'};
String s5 = String.copyValueOf(ch);
System.out.println(s5);
String s6 = String.copyValueOf(ch, 0, 2);
System.out.println(s6);
test();
}
//键盘录入一个大小写混杂的纯英文字符串将字符串转换成首字母大写,其他字母全部小写例如,
//字符串”i lOvE jAvA”,转换成 “I love java”
public static void test(){
String s = "i lOvE jAvA";
// Scanner scanner = new Scanner(System.in);
// String s = scanner.nextLine(); //扫描结束的标志:回车键, 扫描过程遇到的tab键 空格键都可以扫描
// String s = scanner.next(); //扫描结束的标志:回车键、tab键、空格键
String s1 = s.substring(0,1);
String s2 = s.substring(1,s.length());
String s3 = s1.toUpperCase()+s2.toLowerCase();
System.out.println(s3);
}
}
/*
* 字符串的转换方法:
* 构造方法:
* new String(byte[])
* new String(char[])
* */
(二)String类其他功能
1、replace(String oldStr, String newStr):将调用者中的老串替换成新串,返回值为替换后的新字符串
2、split(String regex): 将字符串按照参数字符串regex规则进行切割, 结果是一个String[]
3、trim():去掉字符串左右两边的空格、制表符
import java.util.Arrays;
public class Demo3 {
public static void main(String[] args) {
String s = " abc123qweqe123qweq ";
//拼接方法,与另一个字符串拼接,只能操作字符串
//+:连接符,可以与任意类型数据做拼接
// String s1 = s.concat("000");
// System.out.println(s1);
//切割方法,按照参数规则切割
// String[] str = s.split("123");
// System.out.println(Arrays.toString(str));
//去除字符串两端的空格
// String s2 = s.trim();
// System.out.println(s2);
//替换方法:replace
//替换字符
String s3 = s.replace('q', 'w');
System.out.println(s3);
//替换字符串
String s4 = s.replace("123", "999");
System.out.println(s4);
//替换字符串
String s5 = s.replaceAll("123", "110");
System.out.println(s5);
}
}
/*
* String其他方法:
* concat/split/trim
* */
String类练习
public class Demo4 {
public static void main(String[] args) {
test3();
}
//1.键盘录入一个纯英文字符串(需要有大小写形式): abcWErwr,大写转小写,小写转大写
public static void test1(){
String s = "abcWErwr";
String str = "";
for (int i = 0; i < s.length(); i++){
char c = s.charAt(i);
// if(c >= 'A' && c <= 'Z'){
if(Character.isUpperCase(c)){
str = str+(c+"").toLowerCase();
}else{
str = str+(c+"").toUpperCase();
}
}
System.out.println(str);
}
//2.定义字符串,String s = "helloworld",反转字符串。
public static void test2(){
String s = "helloworld";
//1.转数组 2.实现反转 3.将数组转为字符串
char[] chars = s.toCharArray();
for(int i = 0; i < chars.length/2; i++){
char temp = chars[i];
chars[i] = chars[chars.length-1-i];
chars[chars.length-1-i] = temp;
}
String str = String.valueOf(chars);
System.out.println(str);
}
//3.模拟trim方法,实现去除字符串两端的空格。String s = " sfaafdas ";
public static void test3(){
String s = " sfaafdas ";
int start = 0;
while(s.charAt(start) == ' '){
start++;
}
int end = s.length()-1;
while(s.charAt(end) == ' '){
end--;
}
String str = s.substring(start,end+1);
System.out.println(str);
}
}
二. StringBuilder
(一) 概述
1、概述: StringBuilder是一个可变的字符序列,常用的方法是append和insert,就是在StringBuilder对象本身上,进行相关操作
2、特点:
(1) StringBuilder底层和String类型一样,也是维护了一个字符数组,外界无法直接访问.
(2) String类型和StringBuilder的关系:都是用于描述字符串.但是前者内容是不可以改
变的,后者内容是可以改变的. 做字符串拼接时, 使用StringBuilder优化内存的使用.
(二) 构造方法
1、构造方法作用:创建当前对象、将其他类型的数据,转换成当前类型
2、StringBuilder的构造方法:
StringBuilder():创建一个生成器,初始容量为16个字符
StringBuilder(int capacity):创建一个生成器,初始容量为capacity大小
StringBuilder(String str):创建一个生成器,初始值就是str这些字符,初始大小是str+16
3、获取容积的方法:
capacity():获取当前生成器的容器大小
length():获取当前生成器中的实际字符个数
public class Demo5 {
public static void main(String[] args) {
//构造方法
//创建默认大小的缓冲区
StringBuilder s1 = new StringBuilder();
System.out.println(s1.capacity()); //16 获取容量
//指定容量
StringBuilder s2 = new StringBuilder(20);
System.out.println(s2.capacity());
//带有内容的创建缓冲区
StringBuilder s3 = new StringBuilder("abc"); //将字符串转为缓冲区对象
System.out.println(s3.toString()); //将缓冲区转为字符串
System.out.println(s3.capacity());
}
}
/*
* 字符串缓冲区对象:
* 缓冲区: 理解为是一个容器,这个容器的大小可以改变
* 字符串缓冲区:在这个容器中可以操作任意类型的数据,最终得到一个唯一的字符串
*
* StringBuffer、StringBuilder:
* 这两个对象的功能是相同的,区别在,Buffer对象是老版本的jdk1.0,Builder是新版本的,jdk5.0。
* 效率上有区别:Buffer是一个线程安全对象,效率慢。
* Builder是一个线程不安全对象,效率高。
* 在不考虑线程是否安全的前提下,建议使用Builder。
*
* 概述:
* 是一个可以改变的字符序列。因为一直在同一个缓冲区中进行操作。
*
* 能对缓冲区进行的操作是:增 删 查 改
* */
(三) StringBuilder常用功能
3.1 添加功能
1、append(任意类型):可以将任意数据类型,转成字符,添加到生成器中
2、insert(int index, 任意数据类型):可以将任意数据类型,添加到指定的位置
3.2 删除功能
1、deleteCharAt(int index) :删除指定索引的字符
2、delete(int startIndex, int endIndex):删除指定范围的字符,被删除的部分包含头不包含尾
3.3 替换和反转功能
1、replace(int startIndex, int endIndex ,String str):
将字符串缓冲区中的从start开始到end-1这部分内容,替换成str
2、reverse():将原有字符序列进行反转
public class Demo6 {
public static void main(String[] args) {
//创建字符串缓冲区对象
StringBuilder s = new StringBuilder();
// 增
//将数据追加到原来数据的末尾,数据可以是任意类型。
s.append("abc").append(true).append(123);
System.out.println(s);
//在指定索引位置插入任意类型数据
//如果索引位置不存在,会出现越界异常StringIndexOutOfBoundsException
s.insert(0,"999");
System.out.println(s);
// 删
//删除区间, 包含头,不包含尾
// s.delete(0,3);
// s.delete(0,s.length()); //清空缓冲区
// System.out.println(s);
//根据位置索引,删除指定的字符,如果索引不存在,出现越界异常
// s.deleteCharAt(0);
// System.out.println(s);
// 改
//将指定区间的内容,替换新的字符串
// s.replace(0,3,"666");
// System.out.println(s);
// s.setCharAt(0,'8');
// System.out.println(s);
// 查
//获取字符长度
System.out.println(s.length());
System.out.println(s.capacity());
//反转
s.reverse();
System.out.println(s);
}
}
public class Demo7 {
public static void main(String[] args) {
// String s = "hello";
// test3(s);
// System.out.println(s); //hello
StringBuilder s = new StringBuilder("hello");
test4(s);
System.out.println(s);
}
public static void test4(StringBuilder s){ //s=s 两个引用指向同一个容器
// s.append("world");
s = new StringBuilder("world");
}
public static void test3(String s){ // s=s 两个引用指向同一个对象 hello
s = "world"; //此方法中的引用指向了新对象
}
//字符串反转
public static void test2(){
String s = "abc123zxc";
//字符串--->字符串缓冲区 反转 字符串缓冲区---->字符串
StringBuilder sb = new StringBuilder(s);
s = sb.reverse().toString();
System.out.println(s);
//s = new StringBuilder(s).reverse().toString();
}
//键盘录入一个纯英文字符串(需要有大小写形式): abcWErwr,大写转小写,小写转大写
public static void test1(){
String s = "abcWErwr";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(c >= 'A' && c <= 'Z'){
sb.append((c+"").toLowerCase());
}else{
sb.append((c+"").toUpperCase());
}
}
System.out.println(sb.toString());
}
}
/*
* 字符串转字符串缓冲区:
* new StringBuilder(str)
*
* 缓冲区转为字符串:
* StringBuilder.toString()
* new String(StringBuilder)
* */
三. 基本类型的包装类
(一) 概述
1、基本数据类型有八种,都是非常简单的数据类型
2、在这些类型中,只能表示简单的数据,不能包含一些操作数据的方法,没有办法存储描述这些数据的内容。需要准备一个引用数据类型,能将基本数据类型进行包装,提供一些操作基本类型的方法,定义一些描述数据的数据。
3、基本类型的包装类:
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
(二) Integer类型
1、各种包装类型的方法、特点基本相同,只要学习一个Integer类型,其他的也触类旁通。
2、Integer类型的对象中,维护了一个私有的成员变量,是一个int类型的字段(成员变量、属性),用于表示这个Integer对象要表示的数字。
3、提供了在int、Integer、String类型之间相互转换的方法
4、提供了一些常量
(三) Integer的构造方法
1、Integer(int i):将一个基本类型的int数,转换成Integer类型的对象
使用i给Integer对象中的成员变量赋值
2、Integer(String s):将一个字符串类型的数字,转换成Integer类型的对象
转换的作用
(四) Integer类型的成员方法
1、xxxValue():可以将Integer类型的对象,转成其他的基本数据类型:
例如:byteValue()、floatValue()
2、静态方法:
parseInt(String str):将str以十进制的方式解读为一个int数
public class Demo8 {
public static void main(String[] args) {
//常量
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.SIZE); //32
//构造方法
Integer i1 = new Integer(123); //将基本类型转为包装类
System.out.println(i1);
Integer i2 = new Integer("234"); //将整数形式的字符串转为包装类
System.out.println(i2);
//NumberFormatException 数字格式化异常
//注意: Character类的构造方法只有一个,即 Character(char ch)
System.out.println("---------------------------------------------------");
//方法
Integer in = new Integer(123);
//包装类对象 转为 基本类型
int num = in.intValue();
System.out.println(num);
//xxx xxxValue(): 是一个通用方法,将包装类对象转为其基本类型 xxx代表基本类型的关键字
//将字符串解析为基本类型
//注意:参数必须是整数形式的字符串,否则会出现数字格式化异常
int x = Integer.parseInt("234");
System.out.println(x);
//xxx parseXxx(String s): 是一个通用方法,将字符串对象转为其基本类型 xxx代表基本类型的关键字
//注意:Character类中没有该方法。
//其他方法:
//将其他进制转为 十进制数: 参数: 要解析的数据 进制
int y = Integer.parseInt("110",2);
System.out.println(y);
//十进制转为其他进制:
System.out.println(Integer.toBinaryString(6)); //转二进制
System.out.println(Integer.toOctalString(100)); //转八进制
System.out.println(Integer.toHexString(100)); //转十六进制;
//基本类型--->字符串
String s = Integer.toString(123);
//基本类型--->包装类
Integer integer = Integer.valueOf(123);
//字符串--->包装类
Integer integer1 = Integer.valueOf("123");
}
}
/*
* 基本类型的包装类:
* 基本数据类型对应的对象形式,指的就是包装类。
* 基本类型:
* byte short int long float double char boolean
* Byte Short Integer Long Float Double Character Boolean
* 包装类的使用方式很相似,因此找一个常用的代表学习即可,Integer。
* 掌握:
* 1.类中提供的常用方法
* 2.字符串 包装类 基本类型三者间的转换
* 3.jdk5新特型,自动装箱和拆箱。
*
* 包装类都是java.lang包,都是final类。
*
* 总结:
* 字符串 包装类 基本类型三者间的转换
* 字符串--->包装类:
* Integer.valueOf("123")
* new Integer("123")
* 包装类--->字符串:
* String.valueOf()
* new Integer().toString()
* 字符串--->基本类型:
* Integer.parseInt("234")
* 基本类型--->字符串:
* 123+""
* Integer.toString(123);
* String.valueOf()
* 包装类--->基本类型:
* new Integer().intValue()
* 基本类型--->包装类:
* new Integer(123);
* Integer.valueOf(123)
* */
(五) 自动装箱和拆箱(jdk1.5特性)
1、装箱和拆箱:
装箱:将基本数据类型,封装成包装类型的对象,就是装箱,使用构造方法即可
拆箱:从包装类型的对象中,将其包装的基本类型数据取出,就是拆箱,使用intValue方法即可
2、自动装箱和拆箱
自动装箱:可以直接使用基本类型数据,给对应的引用数据类型包装类对象变量赋值
自动拆箱:可以直接使用包装类对象,给基本类型变量赋值或与基本类型直接运算
public class Demo9 {
public static void main(String[] args) {
//字符类中的方法
//判断参数字符是否是数字字符
boolean b1 = Character.isDigit('1');
System.out.println(b1);
//判断参数字符是否是字母字符
boolean b2 = Character.isLetter('a');
System.out.println(b2);
//判断参数字符是否是小写字母字符
boolean b3 = Character.isLowerCase('A');
System.out.println(b3);
//判断参数字符是否是大写字母字符
boolean b4 = Character.isUpperCase('a');
System.out.println(b4);
System.out.println("-------------------------------------------------");
//jdk5自动装箱和拆箱
//装箱:基本类型封装成包装类对象
//拆箱:包装类对象转为基本类型
//好处:简化了代码的书写 弊端:过多使用会对性能有损耗
Integer in = new Integer(123);
Integer in1 = 123; //省略了: new Integer
int num = in.intValue();
int num1 = in1; //省略了: intValue()
//Boolean boo = true;
Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1 == i2); //false 各自引用指向各自对象容器
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4); //如果在byte范围类,不开辟新空间,直接使用
//如果超出了byte范围,开辟新空间。
}
}