【分享】一次Java基础技术分享纲要

355人浏览 / 0人评论

I/O

文件

  • File: isDir(), makeFiles()......
  • FilenameFilter......

IO(OIO)

  • 按数据流向:输入流、输出流
    • InputStream/outputStream
    • Reader/Writer
  • 按数据结构:字节流、字符流
    • XXXXStream
    • XXXXReader/Writer
    • 转换器:InputStreamReader/OutputSreamWriter
  • 按功能作用:节点流、包装流
    • StringXXX/ByteArrayXXX/FileXXX/SocketXXX
    • BufferdXXX/DataXXXX

缓冲输入文件

BufferedReader

存储和恢复数据

DataInputStream/DataOutputStream

  • 按照指定格式(字符集)读写流
  • readDouble/writeDouble
  • readUTF/writeUTF
  • ......

读写随机访问文件

RandomAccessFile: 依靠seek()方法在文件中到处移动。

  • 多线程下载文件

管道流

  • PipedInputStream
  • PipedOutputStream
  • PipedReader
  • PipedWriter

被BlockQueue代替了

SequenceInputStream(intpuStre)

标准I/O

  • InputStream: System.in

    • 可以使用BufferedReader缓存,然后按行读取
  • PrintStream: System.out、System.err

    • 使用Pri ntWriter包装时,需要将第二个参数设置为true, 否则可能看不到输出。
  • System.setIn(InputStream),

  • System.setOut(PrintStream),

  • System.setErr(PrintStream) 进行标准I/O重定向

NIO

new IO

  • 性能优化
    • java.io.*包内的类基本上都使用nio进行了改造,所以我们基本上从1.4开始就默认使用上了nio
    • 速度提升的主要原因是使用的结构更加接近于操作系统的I/O方式:通道与缓冲器。
    • 因此nio中最重要的两个类:channel & ByteBuffer(Netty中有一个重要的类:ByteBuf)
    • Channel是双向的
  • 功能扩展
    • FileInputStream/FileOutputStream/RandomAccessFile可以生成Channel
    • Channels提供从通道生成Reader和Writer的方法

获取基本类型

  • byteBuffer.asCharBuffer()
    • CharBuffer.getChar()
  • byteBuffer.asShortBuffer()
    • ShortBuffer.getShort()
  • ......

视图缓冲器

public class IntBufferDemo {
	private static int BSIZE = 1024;
	public static void main(String[] args) {
		ByteBuffer bb = ByteBuffer.allocCate(BSIZE);
		IntBuffer ib = bb.asIntBuffer();
		ib.put(new int[]{11, 23, 23. 25. 35, 66, 122, 89});
		System.out.println(ib.get(3));
		ib.put(3, 889);
		ib.filp();
		while(ib.hasRemaining()) {
			int i = ib.get(3);
			System.out.printlb(i);
		}
	}
}
|0|0|0|0|0|0|0|0| bytes
|   |   |   | a | chars
| 0 | 0 | 0 | 0 | shorts
|   0   |   97  | ints
|   0.0 |1.3E-44| floats
|   	97      | longs
|   1.3E-322	| doubles

内存映射文件

public class LargeMappedFiles {
	static int length = 0x8FFFFFF;/ 128MB
	public static void main(String[] args) {
		MappedByteBuffer out = new RandomAccessFile("test.dat", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length);
		for (int i=0, i<length; i++) {
			out.put((byte)'x');
		}
		System.out.print("finished writing");
		for(int i = length /2; i < length/2 + 6; i++) {
			System.out.printnb((char)out.get(i));
		}
	}
}
  • 隐射文件输出必须使用RandomAccessFile

文件加锁

public class FileLoking {
    public static void main(String[] args) {
        FileOutputString fos = new FileOutputStream("test.txt");
        FileLock fl = fos.getChannel().tryLock();
        if(fl != null) {
            System.out.println("locked file");
            TimeUnit.MILLISECONDS.sleep(1000);
            fl.release();
           	System.out.println("Release Lock");
        }
        fos.close();
    }
}

对文件某一个部分上锁

tryLock(long position, long size, boolean shared); // 非阻塞
lock(long position, long size, boolean shared); // 阻塞

针对独占锁和共享锁由系统底层提供。

FileLock isShared();//查询所否为共享锁

还有一些网络通信方面的:NIO/BIO/AIO等等,均为通信层的内容。

集合

https://blog.csdn.net/qq_40298351/article/details/105307475

https://www.cnblogs.com/mengfanrong/p/5079533.html

https://zhuanlan.zhihu.com/p/91808057

  • ArrayList和LinkedList比较
  • Vector和Stack
  • Queue 和Dueue
  • HashSet、TreeSet、LinkedHashSet
    • 无序、有序(比较顺序、插入顺序)
  • HashMap的桶数量和负载因子
    • 桶数量 * 负载因子 = Map总容量
    • 桶数量设置为2的n次幂?
      • 模运算
    • 负载因子大小影响。

参考资料:https://zhuanlan.zhihu.com/p/91808057

反射

Class.class

int i = 1;
double[] ds = [0.1, 0.3];
String str = "hello world";

// i.getClass(); int.class
// ds.getClass(); doutble[].class
str.getClass();

相关API:

  • java.lang.Class
    • static Class forName(String className)
    • Object newInstance()
  • java.lang.reflact.Constructor
    • Object newInstance(Object[] args)

在运行中分析类的能力

  • java.lang.Class
    • Field getField(String name) 指定名称的公有域
    • Field[] getFields() 当前类及父类的所有pulic
    • Field getDeclaredField(String name) 当前类中声明的指定名称的域
    • Field[] getDeclaredFields() 当前类的所有域
    • Method[] getMethods()
    • Method[] getDeclareMethods()
    • Constructor[] getConstructors()
    • Constructor[] getDeclaredConstructors()
  • java.lang.reflact.Field
    • Class getDeclaringClass()
    • int getModifiers()
    • String getName()
  • java.lang.reflact.Method
    • Class getDeclaringClass()
    • int getModifiers()
    • String getName()
    • Class[] getExceptionTypes()
    • Class[] getParameterTypes()
    • Class getReturnType()
  • java.lang.reflact.Constructor
    • Class getDeclaringClass()
    • int getModifiers()
    • String getName()
    • Class[] getExceptionTypes()
    • Class[] getParameterTypes()
  • java.lang.reflact.Modifier
    • static String toString(int modifiers) 返回修饰符的字符串表示
    • static boolean isAbstract(int modifiers)
    • static boolean isFinal(int modifiers)
    • static boolean isInterface(int modifiers)
    • static boolean isNative(int modifiers)
    • static boolean isPrivate(int modifiers)
    • static boolean isProtected(int modifiers)
    • static boolean isPublic(int modifiers)
    • static boolean isStatic(int modifiers)
    • static boolean isStrict(int modifiers) 如果整数参数包含strictfp修饰符,则返回true,否则返回false
    • static boolean isSynchronized(int modifiers)
    • static boolean isVolatile(int modifiers)
    • static boolean isTransient(int mod)

在运行中 查看对象

  • java.lang.reflect.AccessibleObject
    • void setAccessible(boolean flag)
    • boolean isAccessible()
    • static void setAccessible(AccessibleObject[] array, boolean flag)
  • java.lang.reflect.Field
    • Object get(Object obj)
    • void set(Object obj, Object newValue)

编写泛型数组代码

public static void main(String[] args){
    Employee[] a = new Employee[100];
    ...
    a = (Employee[])arrayGrow(a);
}

static Object[] arrayGrow(Object[] a) {
	int newLength = a.length * 11 / 10 + 10;
	Object[] newArray = new Object[newLength];
	System.arrayCopy(a, 0, newArray, 0, a。length);
	return newArray;
}

static Object arryGrow(Object a) {
	Class cl = a.getClass();
	if( !cl.isArray()) {
		return null;
	}
	Class componentType = c1.getComponentType()
	int length = Array.getLength(a);
	int newLength = length * 11 / 10 + 10;
	Object newArray = Array.newInstance(componentType, newLength);
	System.arrayCopy(a, 0, newArray, 0, length);
	return newArray;
}
  • java.lang.reflect.Array
    • static Object get(Object array, int index)
    • static xxx getXxx(Object array, int index) 适用于:·boolean, byte, char, double, float, int long, short·
    • static void set(Object array, int index, Object newValue)
    • static void setXxx(Object array, int intx, xxx newValue)适用于:·boolean, byte, char, double, float, int long, short·
    • static int getLength(Object array)
    • static Object newInstance(Class componentType, int length)
    • static Object newInstance(Class componentType, int[] lengths)

方法指针

  • java.lang.reflect.Method

    • public Object invoke(Object implicictParameter, Object[] explicitparamenters)

      调用这个对象所描述的方法,传递给定参数,并返回方法的返回值。

      对于静态方法,把null作为隐式参数传递。

动态代理

interface Foo {}

class MyFoo implements Foo {}

InvocationHandler handler = new InvocationHandler(...);

Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class });
Foo f = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).newInstance(new Object[] { handler });
// or
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler);

注解

定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
class @interface Test{

}
  • @Target 表示该注解可以用于什么地方(ElementType):
    • CONSTRUCTOR
    • FIELD
    • LOCAL_VARIABLE
    • METHOD
    • PACHAGE
    • PARAMETER
    • TYPE
  • @Retention 表示需要在什么级别保存该注解(RetentionPolicy):
    • SOURCE 编译时丢弃
    • CLASS class文件中可用,启动时被VM丢弃
    • RUNTIME VM运行时也保留,因此可以使用反射机制读取注解
  • @Documented 将此注解包含在Javadoc中
  • @Inherited 允许子类继承父类的注解

注解元素

元素类型
  • 所有基本类型(short、int、double、long、char、float、 byte、boolean)
  • String
  • enum
  • Class
  • Annotation
  • 以上类型数组
元素取值
1. 确定值
  1. 非null

注解处理器

  • 运行时处理器
    • 使用反射 内省????
  • 编译时处理器
    • 使用apt (com.sun.mirror.*包) *

参考资料:

  • https://blog.csdn.net/github_35180164/article/details/52055994
  • Lombok源码

全部评论