- 基本数据类型跟引用数据类型区别:前者直接存放数据的值,后者存放数据所在的地址。
- java 八进制的字面量 以 0 开头,十六进制的字面量 以 0x 开头
- 字符串:
1.当JVM遇得双引号操作符时,JVM在字符串对象池中搜索该字符串对象是否已创建,如果有,返回其引用,如果没有,先创建再返回引用。
2.如果使用new关键字,jvm会先执行1的步骤,然后再额外创建一个String对象。
如下代码
String s1 = "a";
String s2 = "b";
String s3 = "c";
String s4 = "d";
String s5 = s1 + s2 + s3 + s4;
上面代码首先产生 s1 s2 s3 s4 四个String 对象,由于String类的不可变性,执行第五行代码的时候,首先执行s1+s2 ,产生"ab" 字符串对象,然后 “asc"字符串对象,最后才产生"abcd”,所以上述代码一共产生了 7个字符串对象,有两个明显多余。可见,通过String直接相加得到字符串的效率是很低的。如果程序中需要拼接的字符串很多的话,JVM的负荷是非常大的,严重影响程序的性能。
如果遇到有大量字符串拼接的话,应该使用StringBuffer和StringBuilder,避免冗余字符串的产生。如下代码
String s1 = "a";
String s2 = "b";
String s3 = "c";
String s4 = "d";
StringBuilder builder = new StringBuilder();
builder.append(s1);
builder.append(s2);
builder.append(s3);
builder.append(s4);
String toString = builder.toString();
如果拼接过程中可能遇到线程安全的问题,用StringBuffer。
3.使用指定字符集创建字符串
String a = "中文";
String b = new String(a.getBytes(), "UTF-8");
// 常常用来解决字符乱码
关于对象池:避免频繁的创建和销毁对象,降低程序性能
关于new关键字的作用:为对象申请内存空间,并且返回引用的值
关于迭代器:为什么要设计迭代器呢?迭代器是为容器而生,本质上是一种遍历的算法。因为容器的实现千差万别,很多时候不知道如何去遍历一个集合对象的元素。java为开发者提供了使用迭代器的接口,java的所有集合类都是可以迭代的。使用迭代器,不必关心容器内部的实现细节。
输入流输出流:输入流本质就是将外部输入(键盘输入、File流等)通过流读取到内存中,输出流就是将内存中的数据通过流写出到外部(显示器、磁盘等)RandomAccessFile类既可以输入也可以输出。
序列化:ObjectOutputStream对象调用writeObject方法序列化对象; ObjectInputStream对象调用readObject方法反序列化对象
多线程:进程: 整个程序或部分程序的动态执行。 线程是进程中的一个执行单元,又称为轻量级进程。 多线程:一种机制,允许在程序中并发执行多个指令流,每个指令流都称为一个线程。线程之间彼此独立,比较容易共享数据,通过并发执行提高程序的效率和性能。
进程和线程的区别:
-
线程隶属于进程
-
进程是程序的动态形式,是CPU、内存等资源占用的基本单位,线程不能独占这些资源
-
进程之间相互独立,通信比较困难。线程之间共享一块内存区域,通信比较方便
-
进程在执行过程中,包含比较固定的入口、执行顺序和出口,线程的这些过程被应用程序控制。
Thread跟Runnable的区别: -
Thread不能继承其他类,Runnable可以
-
Thread使用线程更方便一些
-
使用Runnable,可以更方便地访问同意变量