首页 > 编程语言 >【博学谷学习记录】超强总结,用心分享 。java基础知识。

【博学谷学习记录】超强总结,用心分享 。java基础知识。

时间:2022-11-13 20:47:06浏览次数:36  
标签:java synchronized 异常 基础知识 线程 超强 Java 方法

Java 基础 知识

  1.面向对象的特征

     封装:就是把对象的属性和行为结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的公开,别人只能用我提供的功能实现需求,而不知道是如何实现的,增加安全性。

     继承:子类继承父类的数据属性和行为,并能根据自己的需求扩展出新的行为,提高代码的复用性。

        多态:指允许不同的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。封装和继承几乎都是为多态而准备的,在执行期间判断引用对象的实际类型,根据其实际的类型调用其响应的方法。

     抽象:表示对问题领域进行分析、设计中得出的抽象的概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,在java中抽象用abstract关键字来修饰,用abstract修饰类时,此类就不能被实例化,从这里可以看出,抽象类(接口)就是为了继承而存在的。

   2.java的基本数据类型

      

 

 

     3.JDK JRE JVM 的区别

      

 

 

         jdk是整个java的核心,是java开发工具包,包括了java运行环境JRE、java工具和java基础类库

        jre是运行java程序所必须的环境的集合,包含java虚拟机和java程序的一些核心类库

        jvm是java虚拟机的缩写,是整个java实现跨平台的最核心的部分,能够运行以java语言写作的软件程序

    4 重载和重写的区别

      重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符不同,发生在编译时。

      重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类就不能重写该方法。

    5 Java 中==和 equals 的区别

      ==的作用:

        基本类型:比较的是值是否相同

        引用类型:比较的是地址是否相同

      equasl的作用:

        引用类型:默认情况下,比较的是地址值

             特殊情况下,String、Integer、Date这类类库中equals被重写,比较的是内容而不是地址

      两者区别:==比较的是两个字符串内存地址的数值是否相等,属于数字比较;equals比较的是两个字符串的内容,属于内容的比较

    6.String、StringBuffer、StringBuilder 三者之间的区别

      String 字符串常量:

          String 中的 String 类中使用 final 关键字修饰字符数组来保存字符串,private
          final char value[] ,String 对象是不可变的,也就可以理解为常量,线程安全。

      StringBuffer 字符串变量(线程安全)

          AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了

          一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。
          StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的

     StringBuilder 字符串变量(非线程安全):StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

        小结:

        (1)如果要操作少量的数据用 String;
        (2)多线程操作字符串缓冲区下操作大量数据用 StringBuffer;
        (3)单线程操作字符串缓冲区下操作大量数据用 StringBuilder

    7 接口和抽象类的区别是什么?

      实现:抽象类的子类使用extends来继承;接口必须使用implements来实现接口。

      构造函数:抽象类可以有构造函数,接口不能有构造函数

      main方法:抽象类可以有main方法,并且我们能够运行它,接口不能有main方法。

      实现数量:类可以实现很多个接口,但是只能继承一个抽象类

      访问修饰符:接口中的方法默认使用public修饰,抽象类中的方法可以使任意访问修饰符

    8.string 常用的方法有哪些?

      indexOf():返回指定字符的索引。
      charAt():返回指定索引处的字符。
      replace():字符串替换。
      trim():去除字符串两端空白。
      split():分割字符串,返回一个分割后的字符串数组。
      getBytes():返回字符串的 byte 类型数组。
      length():返回字符串长度。
      toLowerCase():将字符串转成小写字母。
      toUpperCase():将字符串转成大写字符。
      substring():截取字符串。
      equals():字符串比较。

    9 什么是单例模式?有几种

      单例模式:某个类的实例在 多线程环境下只会被创建一次出来。

      单例模式有饿汉式单例模式、懒汉式单例模式和双检锁单例模式三种

      饿汉式:线程安全,一开始就初始化。

      

 

 

 


      懒汉式:非线程安全,延迟初始化。

      

 

 

 


      双检锁:线程安全,延迟初始化。

      

 

 

     

    10 反射

      在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为 Java 语言的反射机制。

      获取 Class 对象的 3 种方法 :
        调用某个对象的 getClass()方法
          Person p=new Person();
          Class clazz=p.getClass();
        调用某个类的 class 属性来获取该类对应的 Class 对象
          Class clazz=Person.class;
        使用 Class 类中的 forName()静态方法(最安全/性能最好)
          Class clazz=Class.forName("类的全路径"); (最常用)

       11 jdk1.8 的新特性

       1 Lambda 表达式
        Lambda 允许把函数作为一个方法的参数。
       2 方法引用
        方法引用允许直接引用已有 Java 类或对象的方法或构造方法。

 

 

      上例中我们将 System.out::println 方法作为静态方法来引用。

    3 函数式接口

      有且仅有一个抽象方法的接口叫做函数式接口,函数式接口可以被隐式转换为Lambda 表达式。通常函数式接口上会添加@FunctionalInterface 注解。

    4 接口允许定义默认方法和静态方法      

      从 JDK8 开始,允许接口中存在一个或多个默认非抽象方法和静态方法。

    5 Stream API

       新添加的 Stream API(java.util.stream)把真正的函数式编程风格引入到 Java

       中。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。

    

 

 

       6 日期/时间类改进      

        之前的 JDK 自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方工具包,比如 commons-lang包等。不过 JDK8 出现之后这个改观了很多,比如日期时间的创建、比较、调整、格式化、时间间隔等。

        这些类都在 java.time 包下,LocalDate/LocalTime/LocalDateTime。

      7 Optional 类

        Optional 类是一个可以为 null 的容器对象。如果值存在则 isPresent()方法会返
        回 true,调用 get()方法会返回该对象。

      8 Java8 Base64 实现

        Java 8 内置了 Base64 编码的编码器和解码器。

    12 Java 的异常

        Throwable 是所有 Java 程序中错误处理的父类,有两种资类:Error 和Exception。

        Error:表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误,导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
        Exception:表示可恢复的例外,这是可捕捉到的。
        1.运行时异常:都是 RuntimeException 类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序
                逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java 编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用 try-catch语句捕获它,也没有用 throws 子句声明抛出它,也会编译通过。
        2.非运行时异常(编译异常):是 RuntimeException 以外的异常,类型上都属于 Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException、SQLException 等以及用户自定义的 Exception 异常,一般情况下不自定义检查异常。
        常见的 RunTime 异常几种如下:
          NullPointerException - 空指针引用异常
          ClassCastException - 类型强制转换异常。
          IllegalArgumentException - 传递非法参数异常。
          ArithmeticException - 算术运算异常
          ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
          IndexOutOfBoundsException - 下标越界异常
          NegativeArraySizeException - 创建一个大小为负数的数组错误异常
          NumberFormatException - 数字格式异常
          SecurityException - 安全异常
          UnsupportedOperationException - 不支持的操作异常

      13 BIO、NIO、AIO 有什么区别?
        BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
        NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过Channel(通道)通讯,实现了多路复用。
        AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

      14、Threadloal 的原理 
        ThreadLocal:为共享变量在每个线程中创建一个副本,每个线程都可以访问自己内部的副本变量。通过 threadlocal 保证线程的安全性。其实在 ThreadLocal 类中有一个静态内部类 ThreadLocalMap(其类似于 Map),用键值对的形式存储每一个线程的变量副本,ThreadLocalMap 中元素的 key 为当前ThreadLocal 对象,而 value 对应线程的变量副本。ThreadLocal 本身并不存储值,它只是作为一个 key 保存到 ThreadLocalMap中,但是这里要注意的是它作为一个 key 用的是弱引用,因为没有强引用链,弱引用在 GC的时候可能会被回收。这样就会在 ThreadLocalMap 中存在一些 key 为 null 的键值对(Entry)。因为 key 变成 null 了,我们是没法访问这些 Entry 的,但是这些 Entry 本身是不会被清除的。如果没有手动删除对应 key 就会导致这块内存即不会回收也无法访问,也就是内存泄漏。使用完 ThreadLocal 之后,记得调用 remove 方法。 在不使用线程池的前提下,即使不调用 remove 方法,线程的"变量副本"也会被 gc 回收,即不会造成内存泄漏的情况。

      15、同步锁、死锁、乐观锁、悲观锁  
        同步锁:
          当多个线程同时访问同一个数据时,很容易出现问题。为了避免这种情况出现,我们要保证线程同步互斥,就是指并发执行的多个线程,在同一时间内只允许一个线程访问共享数据。Java 中可以使用 synchronized 关键字来取得一个对象的同步锁。

        死锁:
          何为死锁,就是多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。
        乐观锁:
          总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS 算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于 write_conditio 机制,其实都是提供的乐观锁。在 Java 中 java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的。
        悲观锁:
          总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java 中synchronized 和 ReentrantLock 等独占锁就是悲观锁思想的实现。

      16.synchronized 底层实现原理? 
         synchronized 可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。
          Java 中每一个对象都可以作为锁,这是 synchronized 实现同步的基础:
            普通同步方法,锁是当前实例对象
             静态同步方法,锁是当前类的 class 对象
            同步方法块,锁是括号里面的对象
      17、 synchronized 和 volatile 的区别是什么? 
          volatile 本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
          volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的。
          volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。
          volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。
          volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化。
 
      18、synchronized 和 Lock 有什么区别?  
          首先 synchronized 是 java 内置关键字,在 jvm 层面,Lock 是个 java 类;synchronized 无法判断是否获取锁的状态,Lock 可以判断是否获取到锁;synchronized 会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发
生异常会释放锁),Lock 需在 finally 中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;用 synchronized 关键字的两个线程 1 和线程 2,如果当前线程 1 获得锁,线程 2 线程等待。如果线程 1 阻塞,线程 2 则会一直等待下去,而 Lock 锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;synchronized 的锁可重入、不可中断、非公平,而 Lock 锁可重入、可判断、可公平(两者皆可);Lock 锁适合大量同步的代码的同步问题,synchronized 锁适合代码少量的同步问题。

标签:java,synchronized,异常,基础知识,线程,超强,Java,方法
From: https://www.cnblogs.com/linwenguan/p/16886864.html

相关文章

  • Java比较器
    一、Comparable接口类直接实现Comparable接口,并实现compareTo方法packagecn.lxx.test;publicclassUserimplementsComparable<User>{//该类实现Comparable接......
  • Java 使用JavaMail通过Gmail发送电子邮件
    JavaMail提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API可以方便地执行一些常用的邮件传输。可以基于JavaMail开发出类似于MicrosoftOutlook......
  • Java安全之Mojarra JSF反序列化
    Java安全之MojarraJSF反序列化AboutJSFJavaServerFaces,新一代的JavaWeb应用技术标准,吸收了很多JavaServlet以及其他的Web应用框架的特性。JSF为Web应用开发定义了一......
  • 学习Java前的快捷键和软件配置
    目标熟练掌握java每天编写一篇笔记java和python都要学习每天最少要学习4个视频电脑的快捷键ctrl+c复制ctrl+v粘贴ctrl+a全选ctrl+x剪切ctrl+z......
  • java集合
    Java集合分类数据结构一:集合框架的概述1.集合、数组都是对多个数据进行存储的结构简称java容器说明:此时的存储,主要还是内存层面的存储,不涉及持久化存储(数据库、硬......
  • 互联网基础知识
    网络协议网络协议是一种网络通讯语言,为连接不同操作系统和不同硬件体系结构的互联网提供通信支持。开发者一般使用最上层应用层的协议来进行网络数据传输,数据会从上层协......
  • Java数组工具类Arrays
    Arrays所在的包是Java.util.*,Arrays提供的全部是static方法。1.转字符串1.1一维数组--publicstaticStringtoString(int[]a)参数即可以是基础类型数组,也可以是包装......
  • idea将java项目打成jar包并使用
    1.首先编写一个工具类2.进行打包操作)3.Build之后在项目的out包下面就出现了一个jar包在新建一个项目新建lib文件夹将jar包放进去4.最后即可调用......
  • Java自学,要有技巧的学
    学习Java是有一定技巧和方法的,钻牛角尖的去学习它,只能让你感觉到费神费力,最终陷入到无穷无尽的细枝末节之中。然后渐渐的消磨掉你的耐心,直到你放弃。  学习的过程都是......
  • JavaScriptの类型
    前言此篇小结来源与《你不知道的JavaScript》和《JavaScript高级程序设计》的结合??或许是的,龟速总结中...七种内置类型nullundefinedbooleannumberstringobjectsy......