Java运行过程
- 在开发集成环境下编辑一个
java
文件,如User.java
文件。 - 通过
javac User.java
命令将该文件编译成字节码文件User.class
。(前提是编译无错) - 通过
java User
执行代码文件。 - 类的主方法(
main
)中的String[] args
是main
方法的参数。如运行java
文件时使用java User aaa
命令:其中java
表示执行命令,User
为文件类名,aaa
为传入的参数。则main
方法中的args[0]
值为aaa
。
String类
String
类是引用类型,是对象,不是基本类型。- 底层是
char[]
数组实现,且被final
关键字修饰,其值一旦创建不可更改。
String s1 = "abc"; // 常量池
String s2 = new String("abc"); // 堆内存中
System.out.println(s1==s2); // false两个对象的地址值不一样。
System.out.println(s1.equals(s2)); // true
s1="123"; //将s1指向"123"这个字面量;但"abc"仍存在于内存中。
String s3=s1+"c";
System.out.println(s3==s2); // false
System.out.println(s3.equals(s2)); // true
对于 s3,先创建StringBuilder(或 StringBuffer)对象,
通过 append 连接得到 abc ,再调用 toString() 转换得到的地址指向 s3。故 (s3==s2) 为 false
- String与StringBuffer、StringBuilder区别
1. String:字符串常量,字符串长度不可变。Java中String 是immutable(不可变)的。
用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。
2. StringBuffer:字符串变量(Synchronized,即线程安全)。
如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer;
如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。
3. 字符串变量(非线程安全)。在内部 StringBuilder 对象被当作是一个包含字符序列的变长数组。
4. 基本原则:
如果要操作少量的数据用 String ;
单线程操作大量数据用StringBuilder ;
多线程操作大量数据,用StringBuffer。
- 字面量和
new
创建的对象。
String str1 = "hello world";
String str2 = new String("hello world");
String str3 = "hello world";
String str4 = new String("hello world");
System.out.println(str1==str2); // false
System.out.println(str1==str3); // true
System.out.println(str2==str4); // false
1. String str1 = "hello world"; 和 String str3 = "hello world"; 都在编译期间生成了字面常量和符号引用;
运行期间字面常量 "hello world" 被存储在运行时常量池(当然只保存了一份)。
通过这种方式来将 String 对象跟引用绑定的话,JVM 执行引擎会先在运行时常量池查找是否存在相同的字面常量,
如果存在,则直接将引用指向已经存在的字面常量;
否则在运行时常量池开辟一个空间来存储该字面常量,并将引用指向该字面常量。
2. 通过 new 关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在的。
因此通过 new 来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的。
异常类
- 从大体来分异常为两块:
1、error---错误 : 是指程序无法处理的错误,表示应用程序运行时出现的重大错误。
例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。
2、Exception --- 异常 :异常可分为运行时异常跟编译异常
1)运行时异常:即RuntimeException及其之类的异常。
这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。
常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。
2)编译异常:RuntimeException以外的异常。
这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。
常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。
注意:finally
永远都会在catch
的return
前被执行。若finally
块中已有return
语句则直接返回不会再去执行catch
语句中的return
语句。
集合框架
- 集合分为两类:存放元素集合的
Collection
,存放键值对的Map
。 Collections接口
提供相关的算法如排序等。Set
和List
的区别:
Set: 存放元素唯一的无序集合。
List: 存放元素不唯一的有序集合。
ArrayList: 底层实现为数组,插入和删除操作效率低,查询操作效率高。
LinkedList: 底层实现为链表,插入和删除操作效率高,查询操作效率低。
多线程编程
- 创建线程的方式:
1. 继承 Thread 类
2. 实现Runnable接口
3. 通过 Callable 和 Future 创建线程。
- 继承
Thread
类:实现start
和run
方法。
1. start方法:使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
2. run方法:线程体执行。
3. join(long millisec):等待该线程终止的时间最长为 millis 毫秒。
4. 静态方法yield:暂停当前正在执行的线程对象,并执行其他线程。
5. 静态方法 sleep(long millisec):在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)