适配器设计模式
1.类适配器
让没有关系的类和接口产生联系,可以扩展功能,增加已有代码的复用性
2.对象适配器
使用对象进行连接,可以拓展功能
3.缺省适配器
类适配器:
class A{
public void a() {
System.out.println("我是a方法");
}
}
interface Target{
public abstract void target();
}
// 使用继承来实现 让类和接口产生联系
// 使用一个适配器类(第三方) 通过这个类让类和接口产生联系 提高接口的兼容性
class Adapter extends A implements Target{
// 实现抽象方法
@Override
public void target() {
System.out.println("我是重写的target方法");
}
}
可以在不修改原代码的情况下让A类和Target接口产生联系。
缺省适配器:
当一个类想实现一个接口时,有时候并不想实现该接口中所有方法,但是实现接口又强制重写所有方法,这种时候可以通过一个适配器类来解决这个问题。
interface A{
public abstract void a();
public abstract void b();
public abstract void c();
}
// 使用一个类作为桥梁 来连接接口与类
// 让适配器类来实现接口 -- 空实现
// 适配器类只是对接口方法的空实现
// 不希望这个适配器类直接被使用
abstract class Adapter implements A{
@Override
public void a() {
}
@Override
public void b() {
}
@Override
public void c() {
}
}
class B extends Adapter{
// 重写适配器类的方法
@Override
public void a() {
System.out.println("我是重写的a方法");
}
}
String系统类的学习
字符串是一个字符串常量
// 修改的是 字符串引用(地址)
// 指向了不同地址 而不是字符创本身被修改了
String s1 = "abc";
s1 = "bcd";
// 创建一个字符串
String s2 = "bcd";
// s3 是在堆内存中开辟一块空间
String s3 = new String("bcd");
String s4 = "bcd";
// == 号 对象的话 比的是 地址
System.out.println(s2 == s4);
System.out.println(s2.equals(s4));
System.out.println(s2 == s3);
String类中的一些方法:
char charAt(int index) // 根据索引获取字符串中的字符。
int indexof(int ch) // 传入字符,差值对应的角标。
boolean contains(CharSequence s) // 判断字符串中是否包含指定的char序列。
boolean startsWith(String prefix) // 测试此字符串是否以指定的前缀开始。 boolean endsWith(String suffix) // 测试此字符串是否以指定的后缀结束。String toUpperCase() // 将字符串中所有字符都转换为大写。
String toLowerCase() // 将字符串中所有字符都转换为小写。
String replace(char oldChar, char newChar) // 返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。
String replace(CharSequence target, CharSequence replacement) // 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String[] split(String regex, int limit) // 根据匹配给定的正则表达式来拆分此字符串。
String substring(int beginIndex) // 返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int beginIndex, int endIndex) // 返回一个新字符串,它是此字符串的一个子字符串。
String trim() // 返回字符串的副本,忽略前导空白和尾部空白。
int compareTo(String anotherString) // 按字典顺序比较两个字符串。
char[] toCharArray() // 将此字符串转换为一个新的字符数组。
boolean isEmpty() //当且仅当 length() 为 0 时返回 true。
一些功能的实现练习:
// 将字符串" abc def "反转
String string = " abc def ";
char[] charArray = string.toCharArray();
for (int i = 0; i < charArray.length/2; i++) {
char temp = charArray[i];
charArray[i] = charArray[charArray.length - 1 -i];
charArray[charArray.length - 1 -i] = temp;
}
String string2 = new String(charArray);
System.out.println(string2);
// 将字符串" abc def "去两端空格
String string = " abc def ";
// 只要找出开始 和 结束的索引
//定义开始和结束的索引
int start = 0;
int end = string.length() - 1;
while (string.charAt(start) == ' ' && start < end) {
//从前开始 一位一位向后寻找
start++;
}
while (string.charAt(end) == ' ' && end > start) {
//从后开始 一位一位向前寻找
end--;
}
// 截取字符串
String substring = string.substring(start, end + 1);
System.out.println(substring);
// 计算 "www" 在 "wwwasdwwwsnfjwwwsnsdkwwwjsd"当中出现次数
// 声明一个索引
int index = 0;
// 声明一个保存次数
int count = 0;
// 循环截取字符串
// 判断该字符串中 是否包含要查找的字符串
while (string.contains(key)) {
// 查找 www 在字符串中的索引
index = string.indexOf(key);
// 截取字符串
string = string.substring(index+key.length());
// 计数器++
count++;
}
System.out.println(count);
//打印下面两个字符串 中相同的 最大子字符串
//asakjfahellosdlmkasklhka
//mcnvbsehellolssphkp
String string = "asakjfahellosdlmkasklhka";
String string2 = "mcnvbsehellolssphkp";
String substring = "";
String maxstring = "";
//将string2的所有子串遍历
for (int i = 0; i < string2.length() - 2; i++) {
for (int j = i+1; j < string2.length() + 1; j++) {
substring = string2.substring(i, j);
if(string.contains(substring) && substring.length() > maxstring.length()) {
maxstring = substring;
}
}
}
System.out.println(maxstring);