JAVA编程思想学习笔记5-chap13-15-斗之气5段
2019-02-21 18:53 剑动情缥缈 阅读(227) 评论(0) 编辑 收藏 举报1.String对象不可变,一旦发生字符变换或者变长度,一定是新建了一个String
private final char value[];
2.字符串+与+=:唯二操作符重载
- "aaa" + "bbb" + "ccc"执行过程会创建StringBuilder对象
public class TestString { public static void main(String[] args) { String str = "aaa"; String s = "bbb" + str + "ccc" + "ddd"; System.out.println(s); } }
- javap -c TestString得到:
3.注意StringBuilder对象在toString():避免循环内多次创建StringBuilder引起低效率问题
4.String.split(String regex):通过正则表达式分割 String.replaceFirst() String.replaceAll(String regex, String obj)
5.正则表达式
6.java.util.regex Pattern与Matcher
- Pattern编译正则表达式
- Matcher匹配正则表达式
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)); } }
7.使用一个类需要完成三步
- 加载:类加载器执行,并创建Class对象
- 链接:验证字节码,为静态域分配存储空间
- 初始化:如果具有基类,则对其初始化,执行静态初始化器和静态初始化块
8.获取Class对象的方式
- Class.forName("类名")
- 对象.getClass()
- 类.class:使用.class创建Class对象的引用时,不会进行初始化
- 包装器.Type
9.类存在继承关系,不代表其Class对象同样具备继承关系
10.RTTI表现形式
- 传统的类型转化,如Shape从List<Shape>拿出时会从Object转回Shape
- 代表对象类型的Class对象:可用于反射机制
- instanceof(Class.isInstance()):运行时类型判断
11.动态代理
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(); } }
12.通过RTTI(如instance)可能会增加代码耦合度,可以通过将实现设置为包访问权限实现隐藏,但是通过反射依旧可以调用私有方法
13.泛型类、接口、方法
14.通配符:List<? extends Shape>表示具有任何从Shape继承的类型的列表,这里谈论的是存储类型的关系,非List得关系