代码改变世界

JAVA编程思想学习笔记5-chap13-15-斗之气5段

2019-02-21 18:53  剑动情缥缈  阅读(227)  评论(0编辑  收藏  举报

1.String对象不可变,一旦发生字符变换或者变长度,一定是新建了一个String

private final char value[];
View Code

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);
    }
}
View Code
  • 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));
        }
    }
View Code

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();
    }
}
View Code

12.通过RTTI(如instance)可能会增加代码耦合度,可以通过将实现设置为包访问权限实现隐藏,但是通过反射依旧可以调用私有方法

13.泛型类、接口、方法

14.通配符:List<? extends Shape>表示具有任何从Shape继承的类型的列表,这里谈论的是存储类型的关系,非List得关系