作者:deniz2502915157 | 来源:互联网 | 2023-05-27 04:00
1.String对象不可变,一旦发生字符变换或者变长度,一定是新建了一个Stringprivatefinalcharvalue[];ViewCode2.字符串+与+:唯二操作符重载
1.String对象不可变,一旦发生字符变换或者变长度,一定是新建了一个String
![](https://img8.php1.cn/3cdc5/fefd/3b4/d53cb6560e11e7c3.gif)
![](https://img8.php1.cn/3cdc5/fefd/3b4/75927dfcee3d2d24.gif)
private final char value[];
View Code
2.字符串+与+=:唯二操作符重载
- "aaa" + "bbb" + "ccc"执行过程会创建StringBuilder对象
![](https://img8.php1.cn/3cdc5/fefd/3b4/d53cb6560e11e7c3.gif)
![](https://img8.php1.cn/3cdc5/fefd/3b4/75927dfcee3d2d24.gif)
public class TestString {
public static void main(String[] args) {
String str = "aaa";
String s = "bbb" + str + "ccc" + "ddd";
System.out.println(s);
}
}
View Code
![](https://img.php1.cn/3cd4a/1eebe/cd5/e62700fe09f8933e.webp)
3.注意StringBuffer对象在toString():避免循环内多次创建StringBuffer引起低效率问题
4.String.split(String regex):通过正则表达式分割 String.replaceFirst() String.replaceAll(String regex, String obj)
5.正则表达式
![](https://img.php1.cn/3cd4a/1eebe/cd5/6c257b6ba227cc3e.webp)
![](https://img.php1.cn/3cd4a/1eebe/cd5/e88efe5b0a13a7fa.webp)
6.java.util.regex Pattern与Matcher
- Pattern编译正则表达式
- Matcher匹配正则表达式
![](https://img8.php1.cn/3cdc5/fefd/3b4/d53cb6560e11e7c3.gif)
![](https://img8.php1.cn/3cdc5/fefd/3b4/75927dfcee3d2d24.gif)
public static void main(String[] args ) {
Pattern p1 = Pattern.compile("!");
print(Arrays.toString(p1.split("abc!def!fgh!")));
Pattern p = Pattern.compile("abc+");
Matcher m = p.matcher("abcabcabccacbb");
while(m.find()) {
print("match:" + m.group() + "at" + m.start() + "to" + (m.end() - 1));
}
m.reset("abcefg");
while(m.find()) {
print("match:" + m.group() + "at" + m.start() + "to" + (m.end() - 1));
}
}
View Code
7.使用一个类需要完成三步
- 加载:类加载器执行,并创建Class对象
- 链接:验证字节码,为静态域分配存储空间
- 初始化:如果具有基类,则对其初始化,执行静态初始化器和静态初始化块
8.使用.class创建Class对象的引用时,不会进行初始化
9.类存在继承关系,不代表其Class对象同样具备继承关系
10.RTTI表现形式
- 传统的类型转化,如Shape
- 代表对象类型的Class对象
- instanceof(Class.isInstance())
11.动态代理
![](https://img8.php1.cn/3cdc5/fefd/3b4/d53cb6560e11e7c3.gif)
![](https://img8.php1.cn/3cdc5/fefd/3b4/75927dfcee3d2d24.gif)
package com.chengjie;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Subject {
void service();
}
class RealSubject implements Subject{
@Override
public void service() {
System.out.println("RealSubject service!");
}
}
public class DynamicProxyImpl implements InvocationHandler {
//
private Subject sub;
public DynamicProxyImpl(Subject sub) {
this.sub = sub;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(sub, args);
}
public static void main(String[] args) {
//创建被代理对象
Subject subject = new RealSubject();
//注册进动态代理中
DynamicProxyImpl dpl = new DynamicProxyImpl(subject);
//创建代理对象
Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[] {Subject.class}, dpl);
proxy.service();
}
}
View Code
12.通过RTTI(如instance)可能会增加代码耦合度,可以通过将实现设置为包访问权限实现隐藏,但是通过反射依旧可以调用私有方法
13.泛型类、接口、方法