javase 基础知识

文章目录

    • 1. StringBuilder and StringBuffer
    • 2.异常
    • 3.接口与抽象类
    • 4.并行,并发
    • 5.进程和线程
    • 6. volatile与synchronized区别
    • 7.getBytes()
    • 8.Iterator

1. StringBuilder and StringBuffer

  1. 运行速度,或者说是执行速度
    在这方面运行速度快慢为:StringBuilder > StringBuffer > String
      String最慢的原因:
      String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
  2. 再来说线程安全
      在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
      如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
  3. 总结一下
      String:适用于少量的字符串操作的情况
      StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
      StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

2.异常

异常(Exception)的分类:根据在编译时期还是运行时期去检查异常?
1):编译时期异常:checked异常.在编译时期,就会检查,如果没有处理异常,则编译失败.
2):运行时期异常:runtime异常.在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错).
运行异常:在编译时期,可处理,可不处理.

javase 基础知识_第1张图片

runtime异常,默认就是这种处理方式.

如果每一个方法都放弃处理异常都直接通过throws声明抛出,最后异常会抛到main方法,如果此时main方法不处理,继续抛出给JVM,底层的处理机制就是打印异常的跟踪栈信息.
runtime异常,默认就是这种处理方式.

3.接口与抽象类

接口存在的成员:

 1):接口中没有构造器,推论:接口不能创建对象(不能 new ),接口中不能定义普通方法.
 
 2):接口中定义的成员变量,实质是全局静态常量,默认使用  public static final来修饰.
          public static final String NAME = "龙17";
          
 3):接口中定义的方法都是公共的抽象方法,默认的使用  public abstract 来修饰方法.
          public abstract void walk();   一般的,我们在接口中定义方法,不喜欢使用修饰符.
          
 4):接口中定义的内部类都是公共的静态内部类,默认使用public  static来修饰内部类.
          public static interface ABC{}        
          
5):一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法。

6):接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的。

  • 虽然接口内部定义了一些抽象方法,但是并不是所有的接口内部都必须要有方法,比如Seriallizable接口,Seriallizable接口的作用是使对象能够“序列化”,但是Seriallizable接口中却没有任何内容,也就是说,如果有一个类需要实现“序列化”的功能,则这个类必须去实现Seriallizable接口,但是却并不用实现方法(因为接口中没有方法),此时,这个Serilizable接口就仅仅是一个“标识”接口,是用来标志一个类的,标志这个类具有这个“序列化”功能。
  • 接口的特点:
  1. 没有构造方法,也不能显示定义构造器,不能实例化。
  2. 接口只能继承接口,不能继承类,且接口支持多继承(类是单继承关系)。
    [修饰符] interface 接口名 extends 接口1,接口2
  3. 接口里的方法方法全是抽象的,默认修饰符是public abstract。
  4. 接口里的字段全是全局静态常量,默认修饰符是public static final。
  5. 接口里的内部类全是公共静态的,默认修饰符是public static。

  • 类和类之间存在是继承关系: 使用extends 来表示.
    接口和接口之间只能是继承关系: 使用extends 来表示.
    接口和实现类之间只能是实现关系(继承关系),使用implements来表示.

4.并行,并发

  • 并发和并行是即相似又有区别(微观概念):
    并行:指两个或多个事件在同一时刻点发生;
    并发:指两个或多个事件在同一时间段内发生。
  • 在操作系统中,在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单CPU系统中,每一时刻却仅能有一道程序执行(时间片),故微观上这些程序只能是分时地交替执行。
    倘若计算机系统中有多个CPU,则这些可以并发执行的程序便可被分配到多个处理器上,实现多任务并行执行,即利用每个处理器来处理一个可并发执行的程序,这样,多个程序便可以同时执行,因为是微观的,所以大家在使用电脑的时候感觉就是多个程序是同时执行的。
    所以,大家买电脑的时候喜欢买“核”多的,其原因就是“多核处理器”电脑可以同时并行地处理多个程序,从而提高了电脑的运行效率。
    单核处理器的计算机肯定是不能并行的处理多个任务的,只能是多个任务在单个CPU上并发运行。
    同理,线程也是一样的,从宏观角度上理解线程是并行运行的,但是从微观角度上分析却是串行运行的,即一个线程一个线程的去运行,当系统只有一个CPU时,线程会以某种顺序执行多个线程,我们把这种情况称之为线程调度。

时间片即CPU分配给各个程序的运行时间(很小的概念).

5.进程和线程

进程是指一个内存中运行中的应用程序。每个进程都有自己独立的一块内存空间,一个应用程序可以同时启动多个进程。比如在Windows系统中,一个运行的abc.exe就是一个进程。
那么我们此时就可以处理同时玩游戏和听音乐的问题了,我们可以设计成两个程序,一个专门负责玩游戏,一个专门负责听音乐。
但是问题来了,要是要设计一个植物大战僵尸游戏,我得开N个进程才能完成多个功能,这样的设计显然是不合理的。
更何况大多数操作系统都不需要一个进程访问其他进程的内存空间,也就是说进程之间的通信很不方便。
此时我们得引入“线程”这门技术,来解决这个问题。
线程是指进程中的一个执行任务(控制单元),一个进程可以同时并发运行多个线程,如:多线程下载软件。
多任务系统,该系统可以运行多个进程,一个进程也可以执行多个任务,一个进程可以包含多个线程.
一个进程至少有一个线程,为了提高效率,可以在一个进程中开启多个执行任务,即多线程。
多进程:操作系统中同时运行的多个程序。
多线程:在同一个进程中同时运行的多个任务。
我们查看Windows环境下的任务管理器:
在操作系统中允许多个任务,每一个任务就是一个进程,每一个进程也可以同时执行多个任务,每一个任务就是线程。

  • 进程与线程的区别:
    进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。
    线程:堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以影响的,又称为轻型进程或进程元。
    因为一个进程中的多个线程是并发运行的,那么从微观角度上考虑也是有先后顺序的,那么哪个线程执行完全取决于CPU调度器(JVM来调度),程序员是控制不了的。
    我们可以把多线程并发性看作是多个线程在瞬间抢CPU资源,谁抢到资源谁就运行,这也造就了多线程的随机性。
    Java程序的进程(Java的一个程序运行在系统中)里至少包含主线程和垃圾回收线程(后台线程)。
  • 多线程优势:
    多线程作为一种多任务、并发的工作方式,当然有其存在优势:
    ① 进程之前不能共享内存,而线程之间共享内存(堆内存)则很简单。
    ② 系统创建进程时需要为该进程重新分配系统资源,创建线程则代价小很多,因此实现多任务并发时,多线程效率更高.
    ③ Java语言本身内置多线程功能的支持,而不是单纯第作为底层系统的调度方式,从而简化了多线程编程.

6. volatile与synchronized区别

  • volatile作用是变量在多个线程之间可见。
    Volatile非原子性
  • 仅靠volatile不能保证线程的安全性。(原子性)
    ①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法
    ②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。
    synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。
    线程安全性
    线程安全性包括两个方面,①可见性。②原子性。
    从上面自增的例子中可以看出:仅仅使用volatile并不能保证线程安全性。而synchronized则可实现线程的安全性。

7.getBytes()

getBytes() 方法有两种形式:

  1. getBytes(String charsetName): 使用指定的字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

  2. getBytes(): 使用平台的默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

8.Iterator

关于Iterator主要有三个方法:hasNext()、next()、remove()

  1. hasNext:没有指针下移操作,只是判断是否存在下一个元素

  2. next:指针下移,返回该指针所指向的元素

  3. remove:删除当前指针所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素

  4. 迭代器一般会用在遍历集合上面。

  • 链接

你可能感兴趣的:(java)