### Java编程思想读书笔记
#### 一、Java与C++的区别及内存管理
在学习Java的过程中,我们常常会拿它与C++进行比较。这两门语言虽然有着相似之处,但也有许多不同点。
1. **内存管理:**
- C++提供了更为底层的内存管理方式,如使用`new`和`delete`来手动分配和释放内存,以及标准模板库(STL)提供的容器类等。
- Java则采用垃圾回收机制自动管理内存,减少了程序员对于内存管理的负担。这使得Java程序更加健壮,不易出现内存泄漏等问题。
- 在堆内存方面,C++需要程序员手动管理内存的分配和释放,而Java则由垃圾回收器自动完成这一过程。
2. **性能对比:**
- Java相比C++在执行效率上可能稍逊一筹,但由于Java虚拟机(JVM)的存在,其运行时可以进行优化,使得实际应用中的性能差距并不明显。
- Java还提供`synchronized`关键字来支持线程安全的数据访问,确保同一时间只有一个线程能够访问被锁定的资源,从而避免了并发问题。
3. **线程同步:**
- Java通过内置的支持实现了线程之间的同步操作。例如,通过检测一个对象是否正在被另一个线程写入来确定当前线程是否应该等待。
- Java对线程同步的支持较为简单且易于理解,但也需要程序员掌握一定的原理才能正确使用。
#### 二、Java的特性与语法特点
1. **ActiveX与Web应用:**
- Java最初设计是为了支持ActiveX组件在Windows平台上的Web应用。虽然随着技术的发展,这种方式已经不是主流,但它体现了Java跨平台的特点。
- Java的应用场景十分广泛,包括但不限于桌面应用、移动应用开发、后端服务开发等领域。
2. **与C++的语法差异:**
- Java中不使用`virtual`关键字,因为所有的方法默认都是虚函数,除非明确声明为`final`。
- C++中可以使用模板来实现泛型编程,而Java通过接口和类的继承来达到类似的效果。
- Java中没有`void`类型的返回值,所有方法都可以返回特定类型的值或`void`。
- `Properties`类在Java中用于处理配置信息,`System.getProperties()`可以获取系统属性。
3. **类型与变量:**
- Java中`float`和`double`类型的精度有所不同,`double`的精度更高。
- Java中没有`sizeof`操作符来获取变量或数据类型的大小,因为这些信息在编译时就已经确定,并不需要在运行时动态获取。
- 变量的声明和初始化需要遵循一定的规则,例如静态变量(`static`)在类加载时就会被初始化一次。
4. **类与对象:**
- 类是对象的模板,Java中的对象都是通过类实例化得到的。构造方法用于初始化对象的状态。
- 在Java中,如果一个类没有显式地定义构造方法,则会有一个默认的无参构造方法。
- 对于类的成员变量,默认情况下如果没有显式指定访问修饰符,则默认为`package-private`(即包私有),除非是在同一个包内的其他类中,否则无法直接访问。
5. **方法与访问控制:**
- 方法是类中的行为定义,可以通过访问修饰符来控制方法的可见性。例如,`public`表示公开,可以在任何地方调用;`private`表示私有,只能在本类内部调用。
- 如果一个方法被声明为`static`,那么它不需要创建类的对象就可以被调用。
- Java中还可以声明`final`方法,这种类型的方法不能被子类重写。
#### 三、线程控制与同步
1. **线程控制方法:**
- `sleep()`方法可以让线程进入休眠状态,在指定的时间过后恢复执行。
- `suspend()`和`resume()`方法分别用来暂停和恢复线程,但是这种方式容易导致死锁问题,因此并不推荐使用。
- `wait()`和`notify()`/`notifyAll()`方法用于实现线程间的同步和唤醒机制,是更安全的线程控制方式。
- 线程在等待IO操作完成时也会进入等待状态。
- 当多个线程试图访问同一个资源时,可能会发生死锁现象。
2. **线程状态与控制方法:**
- 线程的状态主要包括新建、就绪、运行、阻塞和终止等。线程控制方法会影响线程的状态转换。
- `suspend`和`resume`方法已经被弃用,因为它们可能导致死锁问题。
- `stop`方法已被废弃,因为它会导致不确定的副作用,比如资源未正确释放。
- `destroy`方法实际上并未实现,它的功能与`suspend`相似,但在实际开发中不建议使用。
#### 四、文件I/O操作
1. **文件I/O操作:**
- Java中提供了丰富的API来进行文件读写操作,如`FileInputStream`、`FileOutputStream`等。
- 为了提高效率,Java还支持缓冲流(如`BufferedInputStream`和`BufferedOutputStream`)来减少磁盘访问次数。
- 对于简单的文本文件操作,还可以使用`Scanner`类来方便地读取文件内容。
#### 五、总结
通过以上分析,我们可以看出Java不仅是一门强大的编程语言,还具有很高的可移植性和安全性。无论是初学者还是高级开发者,都能够从中受益匪浅。在实际开发中,合理利用Java提供的各种特性和工具,能够帮助我们构建出高质量的软件产品。