java知识点:IO

IO四大基类

  • InputStream:字节输入流
  • OutputStream:字节输出
  • Writer: 字符输入流
  • Reader: 字符输出

BIO、NIO、AIO

  • BIO:Block IO 同步阻塞式IO,模式简单使用方便,并发处理能力低。
  • NIO:Non IO 同步非阻塞 IO,客户端和服务器端通过Channel(通道)通讯,实现了多路复用。
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO,异步 IO 的操作基于事件和回调机制。

反射

  • 反射:在运行状态中,对于任意一个类,都能够知道这个类的所有属性方法;对于任意一个对象,都能够调用它的任意一个方法属性;这种动态获取的信息以及动态调用对象的方法功能称为java语言的反射机制
  • 优点: 运行期类型的判断,动态加载类,提高代码灵活度。
  • 缺点: 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多
  • 应用:常见spring框架,动态代理模式,JDBC等

实现方式:

  • 通过new对象实现反射机制new 类().getClass()
  • 通过路径实现反射机制Class.forName(类的路径)
  • 通过类名实现反射机制类.class

String

  • String存放在字符串常量池,常量池位于堆内存中
  • String是只读字符串,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。(不变性可以通过反射机制修改
  • String类不能被继承
public static void main(String[] args) throws Exception {
        String s = "hello";
        String s1 = s;
        String s2 = s;
        //通过使用替换函数修改字符
        String s3 = s1.replace('e', 'o');
        System.out.println(s);//hello
        System.out.println(s1);//hello
        System.out.println(s2);//hello
        System.out.println(s3);//hollo

        //通过反射修改字符
        Field value = String.class.getDeclaredField("value");
        value.setAccessible(true);
        char[] chs =(char[]) value.get(s2);
        chs[0] = 'o';

        System.out.println(s); //hollo
        System.out.println(s1);//hollo
        System.out.println(s2);//hollo
        System.out.println(s3);//hollo
    }

辨析 String s1 = "hello"String s2 = new String("hello")

  • s1的"hello"存储于常量池,s2的"hello"储存与堆内存中
  • 通过intern()如果常量池中不存在,可以将堆内存的string的引用拷贝一份到常量池,如果存在则直接返回常量池中的string
public static void main(String[] args) {
        String s = "hello";
        String s1 ="hello";
        String s2 = new String("hello");
        String s3 = new String("hello");
        String s4 = new String("hello").intern();

        System.out.println(s==s1); //true
        System.out.println(s==s2);//false
        System.out.println(s==s4);//true
        System.out.println(s2==s3);//false
        System.out.println(s2==s4);//false
    }

String、StringBuffer、StringBuilder

  • 操作少量的数据用 = String
  • 单线程操作字符串缓冲区下操作大量数据 = StringBuilder
  • 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

Integer、int数值相等

public static void main(String[] args) {
	Integer a1 = 1;
	Integer a2 = 1;
	Integer a3 = new Integer(1);
	Integer a4 = new Integer(1);
	int a5= 1;
	System.out.println(a1==a2);//true
	System.out.println(a3==a1);//false
	System.out.println(a5==a1);//true
	System.out.println(a5==a3);//true
	System.out.println(a2==a3);//false

	//常量池中的Integer对象值在-128到127之间
	Integer b1 = 128;
	Integer b2 = 128;
	System.out.println(b1==b2);//false
}

包装类和基本数据类型比较

  • 包装类和基本数据类型之间的比较,包装类拆箱为基本数据类型然后再进行比较,数值相同则相等,
  • 不同基本类型可以比较,数值一样则相等
  • Integer、Short、Long具有常量值(-128~127),Double、Float没有
  • 包装类仅Integer和Long之间可以比较,数值相同则相等,其他包装类之间比较有编译错误

集合

  • 线程安全的集合类vector、statck、hashtable、enumeration
  • 只读集合Collections. unmodifiableCollection(Collection c)
  • 边遍历边移除 Collection 中的元素使用 Iterator.remove()

Iterator 和 ListIterator 有什么区别?

  • Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
  • Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
  • ListIterator实现Iterator 接口,新增添加替换元素、获取前后元素的索引位置等功能

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...