1 关于包装类
基本数据类型可以转换成对应的包装类,从而获取一些功能上的扩展。除了 Integer
和 Character
,其余的基本数据类型对应的包装类都是其首字母大写的形式表示。
基本数据类型转换为对应的包装类的过程叫做 装箱,包装类转化为基本数据类型的过程叫做 拆箱
装箱的形式有两种:
- 自动装箱:
int t1 = 10;
Integer t2 = t1;
- 手动装箱:
Integer t1 = new Integer(10);
拆箱的形式也有两种:
- 自动拆箱:
Integer t1 = 10;
int t2 = t1;
- 手动拆箱:
Integer t1 = 10;
int t2 = t1.intValue();
2 关于常量池
包装类也是引用类型,也是对象,但是在一些情况下的对象之间的比较,却有点特殊,通样的 String
类型也有如此状况。
常量池 指的是在编译期被确定,并被保存在已编译的 .class
文件中的一些数据,除了包含代码中所定义的各种基本类型,还有对象型的常量值(final
)如:包装类型(Float
,Double
除外),String
类型,还有包含一些以文本形式出现的符号引用,比如:
- 类和接口的全限定名(全限定名有绝对路径的意思,比如 Java 类包的定名)
- 字段的名称和描述符
- 方法和名称和描述符
2.1 关于 String
的内存分配
对于字符串,其对象的引用都是存储在栈中的,而实际内容如果是 编译期 已经创建好(直接用双引号定义的)的就存储在常量池中,如果是 运行期(new
出来的)就存储在堆中。对于 equals
相等的字符串,常量池中永远只有一份,在堆中可以有多份。
String str1 = "123";
String str2 = "123";
String str3 = new String("123");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
注意:对于通过
new
产生一个字符串时,会先去常量池中查找是否已经有该对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此对象的拷贝对象。
Strings=newString(“xyz”);
会产生几个对象?答案是:一个或两个,如果常量池中原来没有xyz
,就是两个。
2.2 关于包装类的内存分配
如同 String
类,包装类除了 Float
和 Double
外,其它类型都会有使用常量池的情况。
当包装类使用 自动装箱 的形式去实例化对象的时候,它首先会在常量池中查找是否存在这个对象,如果没有就直接在常量池中创建一个,如果有就直接指向该对象。
Integer int1 = 100;
Integer int2 = 100;
Integer int3 = new Integer(100);
System.out.println(int1 == int2);
System.out.println(int1 == int3);
注意:
Integer
类型使用常量池是有限制的,大小必须在-128
到127
之间;包装类型与基本数据类型的比较时,包装类型会自动拆箱后再进行比较
3 关于集合
集合框架的体系结构有实现 Collection
接口和实现 Map
接口。
Collection
接口又可细分为 List
接口(ArrayList
类),Queue
接口(LinkedList
类),Set
接口(HashSet
类);
Map
接口主要有 HashMap
类。
4 关于线程
Java 中线程的创建可以有两种:
- 继承
Thread
类或其子类 - 实现
Runnable
接口的类,Runnable
接口只有一个run
方法,任何实现线程功能的类都必须实现该接口
那什么时候实现 Runnable
接口而什么时候继承 Thread
类呢?
因为Java不支持多继承,所以当该类需要继承其他父类的时候,此时就需要实现 Runnable
借口了,而且假如不打算使用及重写 Thread
类的其他方法,也无需继承 Thread
类。
线程的状态有:
- 新建
- 可运行
- 正在运行
- 阻塞
- 终止
线程的优先级由整数 1~10
表示,主线程、正常创建线程默认优先级为5,也可以使用优先级常量 MAX_PRIORITY
(10)、MIN_PRIORITY
(1)、NORM_PRIORITY
(5)设置,当并不能保证优先级高的就一定先执行,这与操作系统以及CPU等有关系。
4.1 synchronized
关键字
在线程中进行一些类如储存数据,读取数据的操作要注意数据的同步问题,此时可以使用 synchronized
关键字对特定的方法操作进行 上锁,该关键字可以添加到的位置有:
- 成员方法
- 静态方法
- 语句块:
syschronize(this){}
关于读取数据流
输入流是读取数据,输出流是写数据
常用的数据流有字节流(FileInputStream
)和字符流(InputStreamReader
)