草庐IT

这些Java基础知识,诸佬们都还记得嘛(学习,复习,面试都可)

小威要向诸佬学习呀 2023-04-11 原文

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。上周接了几家中厂的面试,本篇文章将分享几次面试中经常被问到的知识点以及对学习的知识点总结和面试题的复盘。
部分记录过的知识在这里就不重复赘述了,比如昨天欢聚时代全程拷打并发,AQS,线程池等源码知识在之前文章中记录过。
本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中的大佬🤩🤩。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

文章目录

反射

首先,反射的前提条件是必须获得这个类的字节码文件。反射机制就是在程序运行的过程中,对于任意的类和对象,都能得到和调用它们的属性和方法
简单来说,就是把java类中的各种成分映射成一个个的java对象,这种动态获取类的信息以及动态调用对象方法的功能称为java的反射机制。

获取对象的三种方式:

  1. 通过全类名来获取,即Class clazz=Class.forName("com.rg.entity.Bill");
  2. 通过类名.class获取,即Class clazz=Bill.class;
  3. 通过对象.getClass()来获取,即Student s =new Student(); Class clazz =s.getClass();

Mysql索引类型

普通索引,主键索引,唯一索引,全文索引,组合索引。

普通索引:最基本的索引,没有任何限制。

组合索引:在多个字段上创建的索引,在查询条件中,应满足最左匹配原则,即在使用时应保证查询条件使用组合索引中左边的字段。

主键索引:根据主键创建的索引,每个表只有一个主键索引,值是唯一并且不允许有空值的。

唯一索引:创建索引列的值必须唯一,但是索引列允许有空值,如果是组合索引,则列值的组合必须唯一。

全文索引:全文索引主要用于检索文本中查找的关键字,在定义全文索引的列上支持值的全文查找,允许索引列上为重复值或空值。全文索引可以在char,varchar,或text类型的列上创建。

聚簇索引与非聚簇索引

聚簇索引是一种数据存储方式,其默认是根据主键创建的一颗B+树,聚簇索引的叶子节点存放了表中的所有数据,而非叶子节点不保存具体的数据,由于在InnoDB存储引擎中,每个数据页的大小都是16kb的,所以非叶子节点能够保存更多的索引。一张表中只能拥有一个聚簇索引(默认为主键)。

对于非聚簇索引,也叫辅助索引(二级索引),它的叶子节点存放的是索引的键值和该索引键指向的主键。因此非聚簇索引一般需要进行回表查询,比如在一张表中,主键索引为学生id,唯一索引为学生name,如果通过学生name查询学生的id,那么通过非聚簇索引可直接获取,效率比较高,且不需要回表。如果想要通过学生name查询到学生的具体信息(年龄,课程……),这个时候会先通过非聚簇索引查询到学生的id(主键),然后根据主键进行回表查询出具体信息。

下面是从网上找到的一张图,比较透彻。

BIO,NIO,AIO

BIO(Blocking IO)同步并阻塞服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善,实现对线程的复用,不过没有从根本上解决同步阻塞问题。

NIO(New IO):同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理
对于NIO来讲,它的实现主要有Channel通道,Selector选择器,Buffer缓冲区实现的。

Selector(选择器)它允许单个线程处理多个客户端的连接,即使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。

Buffer(缓冲区):是一个对象,它包含一些要写入或者要读出的数据Selector(选择器):选择器用于使用单个线程处理多个通道。

Channel(通道):所有的NIO都是从Channel中读取数据的。通道是双向的,可以从Buffer中读数据也可以写数据到Buffer中,而对于流,它的读写是单向的。无论读写,Channel通道只能和Buffer交互。因为有了Buffer的存在,通道可以进行异步地读写。

AIO(NIO2):异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

BIO、NIO、AIO适用场景:
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO方式适用于连接数目多且连接比较短(轻损作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

线程中的run和start方法区别

run()方法被称为线程执行体,它的方法体代表了线程需要完成的任务,而start()方法用来启动线程。
调用start()方法启动线程时,系统会把该run()方法当成线程执行体来处理。但如果直接调用线程对象的run()方法,则run()方法立即就会被执行,而且在run()方法返回之前其他线程无法并发执行。也就是说,如果直接调用线程对象的run()方法,系统把线程对象当成一个普通对象,而run()方法也是一个普通方法,而不是线程执行体。

快速排序

快速排序的实现方式有很多种,这里介绍一种实现方法–填坑法,即每次让key指向数组的第一个下标(此操作会空出一个空位),然后从右边寻找小于key的数,找到后将其放在左边的坑位上,然后左边指针开始移动,找到比key大的数后放到右边空缺的位置,最后将key放到空缺的坑位上,依此循环。

public class QuickSort {
    public static void main(String[] args) {
       int [] arr={ 7, 3, 2, 10, 8, 1, 9, 5, 4, 6 };
       quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void quickSort(int[] arr,int begin,int end){
        if(begin>=end){
            return;
        }
        //key为数组的首个元素,此时空出第一个坑位
        int left=begin,right=end,key=arr[begin];
        //从右边往前开始找比key小的数
        while(begin<end){
            while(arr[end]>key && begin<end){
                end--;
            }
            //找到后将右边数字填到左边的坑位上
            arr[begin]=arr[end];
            //从左边往前开始找比key大的数
            while (arr[begin]<key && begin<end){
                begin++;
            }
            //找到后将左边数字填到右边的坑位上
            arr[end]=arr[begin];
        }
        //将key放到遍历到的begin下标处
        arr[begin]=key;
        //改变key的值,方便后续循环遍历
        int key1=arr[left];
        quickSort(arr,left,key1-1);
        quickSort(arr,key1+1,right);
    }
}

求根结点到叶子节点数字之和

题目:
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。

例如:

输入:root = [1,2,3]
输出:25
解释: 从根到叶子节点路径 1->2 代表数字 12 从根到叶子节点路径 1->3 代表数字
13 因此,数字总和 = 12 + 13 = 25

思路:本题可以采用回溯的思想来解析,若为叶子节点,说明遍历到底部了,返回上一层遍历。详细代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
     int res = 0;
    public int sumNumbers(TreeNode root) {
        dfs(root,0);
        return res;
    }
    public void dfs(TreeNode root,int cur){
        if(root==null) return;
        cur=cur*10+root.val;
        if(root.left==null&&root.right==null){
            res+=cur;
        }
        dfs(root.left,cur);
        dfs(root.right,cur);
    }
}

图书推荐

本期推荐消息中间件RocketMQ相关的书籍,给各大朋友们赠送的小福利,可参与活动免费获得哦~

本书从分布式系统的基础概念讲起,逐步深入分布式系统中间件进阶实战,并在最后结合一个大型项目案例进行讲解,重点介绍了使用Spring Cloud框架整合各种分布式组件的过程,让读者不但可以系统地学习分布式中间件的相关知识,而且还能对业务逻辑的分析思路、实际应用开发有更为深入的理解。
全书共分12章,前3个章节是学习分布式系统架构的准备阶段。第1章开篇部分,讲解演进过程中分布式系统是如何出现的;第2章Spring部分,讲解如何搭建目前流行的Spring Boot和Spring Cloud框架;第3章容器部分,讲解目前最流行的Docker容器技术和Kubernetes容器编排工具;第4~8章深入讲解消息中间件RocketMQ的相关知识,理论与实战并存;第9章将深入RocketMQ底层,探索阅读源码的乐趣,掌握精通RocketMQ的同时学会阅读源码的方法;第10章和第11章讲解分布式系统中必须考虑的问题:分布式事务与分布式锁;第12章以一个电商系统业务为例,让读者体验一个项目从无到有的过程,并学以致用。
本书内容由浅入深、结构清晰、实例丰富、通俗易懂、实用性强,适合需要全方位学习分布式中间件相关技术的人员,也适合培训学校作为培训教材,还可作为大、中专院校相关专业的教学参考书。

京东自营购买链接:书籍链接

好了,本篇文章就先分享到这里了,后续会继续分享其他方面的知识,感谢大佬认真读完支持咯~

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

有关这些Java基础知识,诸佬们都还记得嘛(学习,复习,面试都可)的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  3. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  6. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  7. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  8. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  9. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  10. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

随机推荐