码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Java八股文总结】之面试题(二)


    文章目录

    • 面试题
      • 一、几种锁的区别
        • 1、synchronized 和ReentrantLock的区别
      • 二、Java高级
        • 1、反射
          • 1、反射的应用场合
          • 2、Java反射API
          • 3、反射使用步骤(获取Class 对象、调用对象方法)
          • 4、获取Class对象的3种方法
          • 5、创建对象的两种方法 newInstance()
        • 2、注解
          • 1、概念
          • 2、定义注解
          • 3、4种标准元注解
        • 3、泛型
          • 1、泛型方法()
          • 2、泛型类
          • 3、类型通配符 `?`
          • 4、类型擦除

    面试题

    一、几种锁的区别

    1、synchronized 和ReentrantLock的区别

    共同点:

    1. 都是用来协调多线程对共享对象、变量的访问;
    2. 都是可重入锁,同一线程可以多次获得同一个锁;
    3. 都保证了可见性和互斥性;

    不同点:

    1. ReentrantLock 显示的获得释放锁,synchronized 隐式获得释放锁;
    2. ReentrantLock 可响应中断、可轮回,synchronized 是不可以响应中断的, 为处理锁的不可用性提供了更高的灵活性;
    3. ReentrantLock 可以实现公平锁;
    4. ReentrantLock 是 API 级别的,synchronized 是 JVM 级别的;
    5. ReentrantLock 通过 Condition 可以绑定多个条件;

    底层实现不一样,synchronized 是同步阻塞,使用的是悲观并发策略,lock 是同步非阻寒,采用的是乐观并发策略 。
    Lock 是一个接口, 而 synchronized 是Java中的关键字,synchronized 是内置的语言实现。
    synchonized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过 unLock() 去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁。
    Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用 synchronized 时,等待的线程会直等待下去, 不能够响应中断。
    通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。
    Lock可以提高多个线程进行读操作的效率,即就是实现读写锁等。

    二、Java高级

    1、反射

    在这里插入图片描述

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

    1、反射的应用场合
    1. 编译时类型和运行时类型

    在Java程序中许多对象在运行是都会出现两种类型:编译时类型 和 运行时类型, 编译时的类型由声明对象时使用的类型来决定,运行时的类型由实际赋值给对象的类型决定。如:

    Person p = new Student();
    
    • 1

    其中 编译时类型为Person,运行时类型为Student。

    1. 编译时类型无法获取具体方法

    程序在运行时还可能接收到外部传入的对象,该对象的编译时类型为Object,但是程序有需要调用该对象的运行时类型的方法。为了解决这些问题,程序需要在运行时发现对象和类的真实信息。然而,编译时根本无法预知该对象和类属于哪些类,程序只能依靠运行时信息来发现该对象和类的真实信息,此时就必须使用到反射了。

    2、Java反射API

    反射 API 用来生成 JVM 中的类、接口或对象的信息。

    • Class 类: 反射的核心类,可以获取类的属性,方法等信息。
    • Field类: Java.lang.reflect 包中的类,表示类的成员 变量,可以用来获取和设置类之中的属性值。
    • Methed券: Java.lang.reflect 包中的类,表示类的 方法,它可以用来获取类中的方法信感或者执行方法。
    • Constructor类: Java.lang.reflect 包中的类,表示类的 构造方法。
    3、反射使用步骤(获取Class 对象、调用对象方法)
    • 获取想要操作的类的 Class对象 ,它是反射的核心,通过 Class对象 我们可以任意调用类的方法。
    • 调用 Class类 中的方法,即就是反射的使用阶段。
    • 使用 反射API 来操作这些信息。
    4、获取Class对象的3种方法
    1. 调用某个对象的 getClass() 方法
    Person p = new Person();
    Class clazz = p.getClass();
    
    • 1
    • 2
    1. 调用某个类的 class属性 来获取该类对应的 Class对象
    Class clazz=Person.class;
    
    • 1
    1. 使用 Class类 中的 forName() 静态方法
    Class clazz = Class forName("类的全路径");
    
    • 1

    当我们获得了想要操作的类的 Class对象 后,可以通过Class类中的方法获取并查看该类中的方法和属性。
    在这里插入图片描述

    5、创建对象的两种方法 newInstance()
    1. Class 对象 的 newInstance()

    使用 Class 对象的 newInstance() 方法来创建该 Class 对象对应类的实例,但是这种方法要求该 Class对象 对应的类有默认的空构造器。

    1. 调用 Constructor对象 的 newInstance()
      先使用 Class 对象 获取指定的 Constructor 对象,再调用 Constructor对象 的 newInstance() 方法来创建 Class对象 对应类的实例,通过这种方法可以选定构造方法创建实例。
      在这里插入图片描述

    2、注解

    1、概念

    Annotation (注解)是Java提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation对象 ,然后通过该 Annotation对象 来获取注解中的元数据信息。

    2、定义注解

    使用关键字 @interface

    3、4种标准元注解

    元注解的作用是负责 注解其他注解。Java5.0 定义了4个标准的 meta-annotation类型,它们被用来提供对其它 annotation类型 作说明。

    • @Target 修饰的对象范围

    @Target 说明了Annotation所修饰的对象范围: Annotation可被用于 packages、types (类、接口、 枚举、Annotation类型) 、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量 (如循环变量、catch 参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

    • @Retention 定义被保留的时间长短

    @Retention 定义了该Annotation被保留的时间长短:表示需要在什么级别保存注解信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效),取值(RetentionPoicy) 由:
    ① SOURCE:在源文件中有效(即源文件保留)
    ② CLASS:在class文件中有效(即class保留)
    ③ RUNTIME:在运行时有效(即运行时保留)

    • @Documented描述-javadoc

    @ Documented 用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共API,因此可以被例如 javadoc 此类的工具文档化。

    • @Inherited 阐述了某个被标注的类型是被继承的

    @Inherited 元注解是一个标记注解,@Inherited 阐述了某个被标注的类型是被继承的。如果一个使用 了@Inherited修饰的 annotation类型 被用于一个class,则这个annotation将被用于该class 的子类。

    3、泛型

    泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法, 能够对整型数组、 字符串数组甚至其他任何类型的数组进行排序,我们就可以使用Java泛型。

    1、泛型方法()

    你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
    在这里插入图片描述

    表示该通配符所代表的类型是 T类型的子类 。
    表示该通配符所代表的类型是 T类型的父类 。

    2、泛型类

    泛型类的声明和非泛型类的声明类似, 除了在类名后面添加了类型参数声明都分。和泛型方法一样, 泛型类的类型参数声明部分也包含一个或多个党型参数, 参数间用逗号隔开,一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。 因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。
    在这里插入图片描述

    3、类型通配符 ?

    类型通配符一般是使用 ? 代替具体的类型参数。例如 list 在逻辑上是 List,List 等所有List的父类。

    4、类型擦除

    Java中的泛型基本上都是在编译器这个层次来实现的。在生成的 Java字节代码 中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为 类型擦除 。如在代码中定义的List 和 List 等类型,在编译之后都会变成List。JVM 看到的只是 List ,而由泛型附加的类型信息对 JVM 来说是不可见的。类型擦除的基本过程也比较简单,首先是找到用来替换类型参数的具体类。这个具体类一般是Object。如果指定了类型参数的上界的话,则使用这个上界。把代码中的类型参数都替换成具体的类。

  • 相关阅读:
    RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。
    多测师肖sir_高级金牌讲师_python之结构语句005
    springboot+vue框架搭建教程
    使用 zk-SNARKs 的可编程零知识证明:第 3 部分
    3. RxJava转换操作符
    CYQ.Data 操作 Redis 性能测试:对比 StackExchange.Redis
    2022年上半年网络工程师上午真题及答案
    SpringBoot+Vue实现前后端分离旅游资源信息系统
    FastJson2中FastJsonHttpMessageConverter找不到类问题
    在职读博|中国社科院-英国斯特大学灵合作办学双证管理学博士
  • 原文地址:https://blog.csdn.net/qq_46111316/article/details/128076161
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号