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 接口,新增添加替换元素、获取前后元素的索引位置等功能。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288837.html