一,String和Stringbuffer的区别
简单来说,就是变量和常量的区别。
1.StringBuffer对象的内容可以修改,而String对象产生之后就不可以被修改,重新赋值其实是两个对象。
2.String不可变,String没有用来改变已有字符串中的某个字符的方法,有一个优点,编译器可以把字符串社会共享的
String:
- 对于String来说,对象值得改变其实就是创建了一个显得对象,然后把新的值保存进去。
- String被final修饰,不可以被继承
- String创建的对象的值存在于常量池,不用的时候不会被销毁
- String运行的时间较长
- String适用于比较短而小的字符串
StringBuffer
- StringBuffer创建的 对象是可变的
- StringBuffer的改变不像String的那样重新创建对象,而是通过构造器方法
- Stringbuffer创建的对象值存在于栈区,不用的时候会被销毁
- Stringbuffer运行时间比较短
- StringBuffer适用于比较长的字符串,比较多的字符串
二.@Bean注解
@Bean注解是项目启动是自动加载bean对象的一个操作,你dubug有@Bean注解的方法时,虽然已经到方法的 }结束,在控制台看到的对象还是null,不要慌,那是因为后面还有操作,继续下去,就会看到对象的初始化过程。 用@Autowire注入,对象就会有值。
三.synchronized和Lock有什么不同
- synchronized是Java的内置关键词,在jvm层面,Lock是个Java类。
- synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁
- synchronized会自动的释放锁(1线程执行完同步代码块就会释放锁;或者线程执行过程中发生异常会释放锁);Lock需在finally中手动释放锁(unlock()方法会释放锁 ),否则容易造成线程死锁;
- synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去;而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束。
- synchronized的锁可重入、不可判断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
- Lock锁适合大量同步的代码同步问题,synchronized锁适合代码少量的同步问题。
- Lock有 ReentrantLock等等
四.进程和线程
进程是操作系统资源分配的最小单元。一个进程拥有的资源有自己的堆、栈、虚拟空间(页表)、文件描述等信息。从编程的角度来说,可以把它看作是一个类或者一个PCB(Process control block 进程控制块的结构体)。操作系统对一个正在运行的程序的一种抽象,可以吧进程看做程序运行的一次运行过程。
线程是操作系统能够进行运算调度的最小单元。它包含在进程中,是进程中实际运行的单位。一个进程中够可以并发多个线程,每个线程执行不同的任务。线程比进程更轻量。
两个区别
- 根本区别,进程是操作系统进行资源分配的最小单元,线城市操作系统进行运算调度的最小单元;
- 从属关系不同,进程中包含了线程,线程属于进程。
- 开销不同,进程的创建、销毁和切换的开销都远大于线程。
- 拥有的资源不同,每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。
- 控制和影响不同,子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程。
- CPU利用率不同,进程的CPU利用率比较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。
- 操作者不同,进程操纵者一般是操作系统,线程的操纵者一般是编程人员。