微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 接口,新增添加替换元素、获取前后元素的索引位置等功能

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐