Java笔记(基础杂记2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38801354/article/details/82426631

1 关于包装类

基本数据类型可以转换成对应的包装类,从而获取一些功能上的扩展。除了 IntegerCharacter ,其余的基本数据类型对应的包装类都是其首字母大写的形式表示。
基本数据类型转换为对应的包装类的过程叫做 装箱,包装类转化为基本数据类型的过程叫做 拆箱
装箱的形式有两种:

  • 自动装箱:
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 关于常量池

《Java内存分配之堆、栈和常量池》

包装类也是引用类型,也是对象,但是在一些情况下的对象之间的比较,却有点特殊,通样的 String 类型也有如此状况。
常量池 指的是在编译期被确定,并被保存在已编译的 .class 文件中的一些数据,除了包含代码中所定义的各种基本类型,还有对象型的常量值final)如:包装类型(FloatDouble 除外),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 类,包装类除了 FloatDouble 外,其它类型都会有使用常量池的情况。
当包装类使用 自动装箱 的形式去实例化对象的时候,它首先会在常量池中查找是否存在这个对象,如果没有就直接在常量池中创建一个,如果有就直接指向该对象。

Integer int1 = 100;
Integer int2 = 100;
Integer int3 = new Integer(100);
System.out.println(int1 == int2);
System.out.println(int1 == int3);

注意:Integer 类型使用常量池是有限制的,大小必须在 -128127 之间;包装类型与基本数据类型的比较时,包装类型会自动拆箱后再进行比较

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

猜你喜欢

转载自blog.csdn.net/qq_38801354/article/details/82426631
今日推荐