[笔记]Java积累部分知识点目录1

目录

String StringBuilder StringBuffer对比
内部类和匿名内部类
抽象类的几个小问题
AssertionError的使用技巧
序列化
Serializable和Parceable对比
流的类型
注解
ThreadLocal
进程和线程
Java反射

String StringBuilder StringBuffer对比

String、StringBuilder和StringBuffer都可以存储和操作字符串
String会定义在常量池中,不方便进行编辑操作。
StringBuilder和StringBuffer都可以直接操作字符串对象,但是StringBuilder是单线程环境,没有Synchronized同步锁,不过效率比StringBuffer高。
在实际编码中,如果字符串编辑操作较少,可以用+进行连接,如果编辑操作较多,一般用StringBuffer,因为它支持多线程,是线程安全的,未来扩展容易。
Tips:string.intern()会得到对象在常量池中的引用。
java中String、StringBuffer、StringBuilder

内部类和匿名内部类

内部类就是在外部类里直接定义一个内部类
普通的内部类是一个语法糖,编译后会把外部类的实例对象作为参数,在构造函数中传给自己,所以内部类会持有外部类的引用。
静态内部类直接在方法区分配内存,不再持有外部类的引用,相应的也不能直接调用外部类,需要手动引用外部类的实例对象,为了避免内存泄露,一般用WeakReference去处理外部类的对象。
匿名内部类就是new一个抽象类或接口,然后直接在大括号里实现方法,然后调用,例如常见的thread写法

抽象类的几个小问题

1.抽象类是否可以没有方法和属性
一般来说抽象类总有方法和属性给子类去扩展或使用,但是如果没有方法和属性也可以,这样做一般是出于设计的角度,告诉用户这个类不能直接实例化,用户必须自己去实现一个它的子类。
2.abstrace和static能否共存
不能,static表示无需实例化即可调用,abstract则是必须覆盖实现,不能直接调用,冲突
3.abstract和native能否共存
不能,native本地方法表示一定有个实体来处理,abstract没有实体,不能处理
4.abstract和synchronized能否共存
不能,synchronized需要锁一个能直接调用的对象,abstract没有实体对象。

AssertionError的使用技巧

我们自己写代码框架时,有些函数是必须写,但是不希望别人调用的,比如静态工具类的构造函数,为了在调用者写代码时就给他提示错误,我们可以使用throw new AssertionError(),在构造函数里抛出异常。
这样就可以避免团队调用这个函数了。

序列化

序列化是处理对象流的机制,把对象转为流,这样在读写、传输、持久化时方便操作,且可以避免数据乱序等问题。

Serializable和Parceable对比

Android序列化有Serializable和Parceable两种接口,都能实现序列化
Serializable会把对象序列化为字节流,Parceable则是把对象分解为Intent能识别的基本类型;
Parceable效率更高更快(一般是10倍,1个数量级)
Serializable会产生大量变量,需要频繁GC
Serializable只是一种标识接口,无需实现方法(如果有不要序列化的字段,用transient修饰);Parceable中除了getter和setter之外,还需要自己写describeContents和writeToParcel方法把数据类转为Parcel,并实现一个Creator实例对象,以实现createFromParcel把parcel转回数据类。
Serializable可以网络传输和持久化保存文件,Parceable则适用于进程间通信。
Parceable不像Serializable通用,适合在内存中保存,难以持久化。
Tips:序列化除了可以通过流传输和持久化之外,还可以用于深拷贝。

流的类型

对流的类型有三种划分维度:
按照传输方向,分为输入流和输出流
按照数据的单位,分为字节流和字符流,在java.io包里,byte字节流就是InputStream/OutputStream,文字字符流就是Reader和Writer。
按照功能,分为节点流和处理流,节点流是直接操作文件和网络的,直接读出或写入字节流;处理流是对已经存在的节点流或处理流进行处理的,包括缓冲流、转换流、数据流、对象流等。
缓冲流如BufferedInputStream提供带缓冲的读写
转换流只有InputStreamReader/OutputStreamWriter,用来套在InputStream/OutputStream外面,把字节流转为字符流
数据流如DataInputStream提供java的数据流读写功能
对象流是实现了Serializable的对象,可以转换为ObjectInputStream

三个维度是可以重合的,比如FileReader是输入流、字符流、节点流;BufferedOutputStream是输出流、字节流、处理流。

流常用两种设计模式:
1.装饰者模式对流进行扩展,比如先用FileOutputStream读文件,然后用BufferedOutputStream加缓冲,然后用DataOutputStream读出文件中的字节流。InputStream/OutputStream外面,把字节流转换为字符流。
2.适配器模式把字符流和字节流进行转换,就是转换流InputStreamReader/OutputStreamWriter。

java IO 流Stream 序列化Serializable 文件File

注解

为Java源程序中的元素关联任何信息或者任何元数据,可以反射获取注解对象和注解中的元数据。
注解不可以影响程序代码的执行,java解释器会忽略注解。
系统内置标准注解
Override Deprecated SurppressWarning
元注解
@Target 注解修饰的对象的范围 如ElementType.Field、Type
@Rentation 保留时间的长短,源代码\class文件\类加载运行时等 RentationPolicy.RUNTIME
@Documented 描述API 没有成员
@Inherited 可以被继承
Android support annotation
从android-19开始提供
1.Nulless注解 @NonNull @Nullable
2.ResourceType注解 @StringRes
3.Threading注解 @WorkerThread @UIThread 指定工作的线程
4.OverrideMethods注解 @CallSuper 调用父类的方法
注解的处理
编译器的插件来处理注解,注解的元数据放进class文件
提供程序之外的信息,帮助处理数据,不直接影响代码

ThreadLocal

ThreadLocal是线程本地变量,仅使用线程自己的内存,这样可以在线程间隔离数据,不做线程间数据同步,就是说同一个ThreadLocal对象,在不同线程中操作,会分别提供互不干扰的内存。
ThreadLocal只有set、get、remove和initalValue四个函数。
ThreadLocal持有一个threadlocals对象,指向Thread的ThreadLocalMap,在ThreadLocalMap里key值为ThreadLocal对象,value值为T的具体值。一个Thread里可以有多个ThreadLocal对象。
所以,通过ThreadLocal取值,其实就是通过Thread里的Map去取值,所以仅与当前线程有关。
Java并发编程:深入剖析ThreadLocal

进程和线程

一个进程内存空间一般是2G,一个线程栈空间的大小一般是1M,这样算的话1个进程最多有2048个线程。
一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。如果需要创建超过2K以上的线程,减小你线程栈的大小就可以实现了。

Java反射

Java 中的反射首先是能够获取到Java 中要反射类的字节码, 获取字节码有三种方法,
1.Class.forName(className)
2.类名.class
3.this.getClass()。
然后将字节码中的方法,变量,构造函数等映射成相应的Method、Filed、Constructor 等类,这些类提供了丰富的方法可以被我们所使用

你可能感兴趣的:([笔记]Java积累部分知识点目录1)