大数据面试总结
1、冒泡排序、选择排序
2、二分查找
3、 hashmap和hashtable的区别?hashmap的底层实现原理?
a、hashtable和hashmap的区别:
1、hashtable是线程安全的,会在每一个方法中都添加方法synchronize(同步机制)方法,所以线程是安全的,对于hashmap来说,方法中是没有同步机制,所以hashmap是线程不安全的。
2、两个继承的父类也是不同的,hashtable的父类是继承Dictionary类,然而对于hsahmap是继承AbstractMap类,但是hashmap和hashtable都实现了map接口。
3、在hashtable中的,key和value是不可以为null的,但是在hashmap中,null是可以作为主键,且只能存在一个,但是可以一个或者是多个键对应的值可以是null。
4、两者内部的数组的初始化和扩容的方式也是不同的,hashtable在不指定容量大小的前提下默认是11,hashmap默认是16。
b、hashmap的底层实现的原理:
原因是hashmap的底层是数组和红黑树组成的,通过哈希算法将映射到数值中的索引位置,从而进行快速的查询和存储。
put方法原理:
put的方法主要是用于将键值对插入到hashmap中,用底层的源码可以知道,会先计算key的哈希值,并调用putval()方法进行插入。ptuval()的核心就是通过哈希码来定位同桶,然后向桶中插入数据,如果桶是空的,那么就直接向桶中插入新的节点,如果桶不是空的,就会遍历红黑树,判断key是否存在,如果存在,那个原先旧的value就会被新的value所代替。如果遍历,可以key不存在,就会将新节点插入到链表的末端,当达到链表长度的阙值就将链转化成红黑树。
hashmap自动扩容:
主要的步骤就是调用resize()方法,会创建一个新的数组,重新计算哈希码和索引位置,然后分配到新的桶中。默认扩容后的数据的容量的大小是等于原先旧的2的n倍。
get方法原理:
会根据需要查询的key通过哈希算法计算出哈希码,通过哈希码来确定对应的桶的位置,如果桶是空的,那么就返回null,值不存在,如果桶不是空的,就遍历链表或者是红黑树,通过equals()方法来比较传入的键与当前的键是否相同。相同就输出,不同就继续遍历。
4、arraylist和linklist的区别?
1、数据及其内部结构不同,arraylist的内部是使用数组的形式进行存储数据,linkedlist的内部是使用双向链表进行存储数据。
2、arraylist是线程不安全的,linkedlist是线程安全的,所以arraylist的性能会linkedlist的性能比较好。
3、根据索引查询的速度不同,arraylist的查询的速度会比linkedlist的速度要快。
5、stringbuilder和stringbuffer的区别?String的特殊性?
String的特殊性?
string的特殊性是string的不变性,一个string对象一旦被创建好就无法修改了,当对一个string对象进行修改的时候,本质还是创建了一个新的string对象用来接收,原先的string对象没有被修改。
stringbuilder和stringbuffer的区别?
1、stringbuilder和stringbuffer都是可变的,可以对其进行修改,并不会产生新的对象。
2、stringbuffer是线程安全的,stringbuilder是线程不安全的。
3、在单线程的环境下,stringbuffer的性能比stringbuilder低。
6、switch支持哪几种数据类型?跟版本相关,注意string类型的区别?
主要支持的数据类型有:整型、字符型、枚举类型、字符串类型、以及java7后面的表达式类型(switch表达式)。
7、面向对象的特点?
1、封装:封装就是将数据和操作进行封装在一起,然后对外提供一个接口供外界使用,不仅保护数据的完整性,还可以提高代码的复用性和可维护性,降低模块之间的耦合性。
2、继承: 一个类可以继承另一个类的属性和方法,也可以添加和修改自己的属性和方法,提高代码的可维护性和复用性。
3、多态:同一个对象可以表现出多种形态。
4、抽象:将事务的本质和共性特征抽象出来,形成抽象类或者是接口。
8、字节流和字符流区别?
1、处理单元不同,字节流是以字节作为处理单元,字符流是以字符作为处理单元的,字节流主要使用处理二进制数据,对于字符流一般是用来处理文本数据。
2、处理数据的速度不同,字节流的读取和写入的速度比字符流的速度要快,因为字符流的底层是需要先将字符数据转化成字节数据在进行处理,然而对于字节流来说,底层是就是字节数据,所以处理速度要比字符流快。
3、数据的表现形式是不同的,字节流是以字节数据的形式读取和写入数据,所以支持的类型比较多,例如文本、视频、图像等,然而字符流底层是字符数据,所以只能读取和写入文本数据。
4、缓冲区大小是不同的,字节流的缓冲区一般比字符流的缓冲区要大,因为字节流处理的数据比字符流数据量要大,所以缓冲会比字符流要大。
9、锁的概念
提出锁的原因是在并发编程中,会出现多个进程同时运行抢占公共资源,导致出现一些并发问题。
在java中,锁是一种多线程同步机制,主要使用控制多个线程对公共资源的访问,保证线程之间的互斥性,即同一个时刻只有一个线程可以访问公共资源。
锁主要分成两种:显式锁、隐式锁。
显式锁:
显式锁是通过Java中的Lock接口及其实现类来实现的,它提供了更灵活、更强大的锁机制,相比隐式锁具有更多的优势。
隐式锁:
又被称为内置锁或synchronized锁,是Java语言提供的一种简单且方便的锁机制,可以通过在方法或代码块中使用synchronized关键字来实现对共享资源的同步访问
10、实现多线程的几种方式?
1. 继承Thread类:在Java中可以通过继承Thread类来实现多线程。通过重写Thread类中的run()方法,可以定义需要在多线程中执行的任务。
public class MyThread extends Thread {public void run(){// 在这里编写线程要执行的任务}
}
// 创建并启动线程
MyThread thread = new MyThread();
thread.start();
2. 实现Runnable接口:Java中还可以通过实现Runnable接口来实现多线程。与继承Thread类相比,实现Runnable接口更常用,因为它可以避免单继承的限制,并且使代码更加清晰。
public class MyRunnable implements Runnable{@Overridepublic void run(){// 在这里编写线程要执行的任务}
}
// 创建并启动线程
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
3、实现Callable接口:实现Callable之后,需要实现call()方法,方法中写我们需要的操作,然后创建实现接口类的对象,将对象作为参数创建FurtureTask对象,再将task对象作为参数创建thread对象,调用start方法开启线程,还可以使用task对象的get方法获取返回值。他们的区别是前二者不能获取返回值,callable接口可以获得返回值,一般在实际使用中,更多使用实现接口的方式开启线程,因为接口不会占用类的继承位置
import java.util.concurrent.Callable;//1.创建一个实现Callable的实现类, 可以通过设置泛型,指定call方法返回的类型
class CallableThread implements Callable<Integer> {@Overridepublic Integer call() throws Exception {return null;}}
4、使用线程池的方式:创建一个线程池,在Java中创建一个线程池可以通过java.util.concurrent.Executors
工厂类来实现
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolDemo {public static void main(String[] args) {// 创建一个固定大小为5的线程池ExecutorService executorService = Executors.newFixedThreadPool(5);// 提交10个任务到线程池处理for (int i = 0; i < 10; i++) {final int taskId = i;executorService.submit(() -> {System.out.println("Executing task " + taskId + " via " + Thread.currentThread().getName());// 这里可以放置实际任务代码});}// 一旦提交了所有任务,就关闭线程池,不再接受新任务executorService.shutdown();// 注意:调用shutdown()方法并不会立即关闭线程池,而是等待所有任务执行完毕后才会关闭。// 如果需要立即关闭线程池,可以调用shutdownNow()方法,它会尝试停止所有正在执行的任务,// 并返回那些尚未开始执行的任务列表。}
}
11、单例模式:(饿汉式、懒汉式)
单例模式:保证类在程序中只存在一个实例对象,而不会创建多个实例对象,可以提高效率。在单利模式中一般只提供一个getInstance()方法来获取实例对象,不提供setInstance()方法,目的是为了避免再实例化出其他实例对象。
单例模式中有两种模式:懒汉式、饿汉式
懒汉式:
当类在加载的时候并不会直接被实例化,而是在调用的时候才会被实例化,这样就保证在不需要的时候就可以不用实例化。懒汉式在多线程模式下线程是不安全的。
package thread.example;
//单线程的懒汉模式
public class LazySingle {private static LazySingle instance = null;//只有在调用该方法的时候才实例化public static LazySingle getInstance() {if(instance == null) {instance = new LazySingle();}return instance;}
}
饿汉式:
指的是当类在加载的时候就会被实例化,后续在使用的时候只能有一个实例。在多线程的过程中,以为已经提前实例化,所以线程是安全的。
package thread.example;
//饿汉模式
public class HungrySingle {
//在类加载的时候就实例化了,类加载只有一次,所以值实例化出了一份该实例对象private static HungrySingle instance = new HungrySingle();public static HungrySingle getInstance() {return instance;}
}
相关文章:
大数据面试总结
1、冒泡排序、选择排序 2、二分查找 3、 hashmap和hashtable的区别?hashmap的底层实现原理? a、hashtable和hashmap的区别: 1、hashtable是线程安全的,会在每一个方法中都添加方法synchronize(同步机制)…...

利大于弊:物联网技术对电子商务渠道的影响
For Better or For Worse: Impacts of IoT Technology in e-Commerce Channel 物联网技术使用传感器和其他联网设备来手机和共享数据,并且被视为一种可以为供应链成员带来巨大的机会的突破性技术。本文的研究背景是:一个提供物联网基础设备的电子商务平…...
Python 元组详解(tuple)
文章目录 1 概述1.1 性质1.2 下标1.3 切片 2 常用方法2.1 访问:迭代、根据下标2.2 删除:del2.3 运算符:、*2.4 计算元组中元素个数:len()2.5 返回元组中元素最大值:max()2.6 返回元组中元素最小值:min()2.7…...

Redis部署-主从模式
目录 单点问题 主从模式 解析主从模式 配置redis主从模式 info replication命令查看复制相关的状态 断开复制关系 安全性 只读 传输延迟 拓扑结构 数据同步psync replicationid offset psync运行流程 全量复制流程 无硬盘模式 部分复制流程 积压缓冲区 实时复…...

全栈冲刺 之 一天速成MySQL
一、为什么使用数据库 数据储存在哪里? 硬盘、网盘、U盘、光盘、内存(临时存储) 数据持久化 使用文件来进行存储,数据库也是一种文件,像excel ,xml 这些都可以进行数据的存储,但大量数据操作…...
服务器运行train.py报错解决
在服务器配置完虚拟环境以及安装完各种所需库后,发现报错Traceback (most recent call last): File "/root/yolov5-master/yolov5-master/train.py", line 48, in <module> import val as validate # for end-of-epoch mAP File "/root/yolov5…...

Flutter开发type ‘Future<int>‘ is not a subtype of type ‘int‘ in type cast错误
文章目录 问题描述错误源码 问题分析解决方法修改后的代码 问题描述 今天有个同事调试flutter程序时报错,问我怎么解决,程序运行时报如下错误: type ‘Future’ is not a subtype of type ‘int’ in type cast 错误源码 int order Databas…...

Nginx(十二) gzip gzip_static sendfile directio aio 组合使用测试(2)
测试10:开启gzip、sendfile、aio、directio1m,关闭gzip_static,请求/index.js {"time_iso8601":"2023-11-30T17:20:5508:00","request_uri":"/index.js","status":"200","…...

hls实现播放m3u8视频将视频流进行切片 HLS.js简介
github官网GitHub - video-dev/hls.js: HLS.js is a JavaScript library that plays HLS in browsers with support for MSE.HLS.js is a JavaScript library that plays HLS in browsers with support for MSE. - GitHub - video-dev/hls.js: HLS.js is a JavaScript library …...

Ubuntu20.04部署TVM流程及编译优化模型示例
前言:记录自己安装TVM的流程,以及一个简单的利用TVM编译模型并执行的示例。 1,官网下载TVM源码 git clone --recursive https://github.com/apache/tvmgit submodule init git submodule update顺便完成准备工作,比如升级cmake版本…...
华为OD机试真题-两个字符串间的最短路径问题-2023年OD统一考试(C卷)
题目描述: 给定两个字符串,分别为字符串A与字符串B。例如A字符串为ABCABBA,B字符串为CBABAC可以得到下图m*n的二维数组,定义原点为(0, 0),终点为(m, n),水平与垂直的每一条边距离为1,映射成坐标系如下图。 从原点(0, 0)到(0, A)为水平边,距离为1,从(0, A)到(A, C)为垂…...
python try-except
相比于直接raise ValueError,使用try-except可以使程序在发生异常后仍然能够运行。 在try的部分中,当遇到第一个Error,就跳转到except中寻找对应类型的error,后续代码不再执行,如果try中有多个Error,注意顺…...

flutter开发实战-ValueListenableBuilder实现局部刷新功能
flutter开发实战-ValueListenableBuilder实现局部刷新功能 在创建的新工程中,点击按钮更新counter后,通过setState可以出发本类的build方法进行更新。当我们只需要更新一小部分控件的时候,通过setState就不太合适了,这就需要进行…...

通过时间交织技术扩展ADC采样速率的简要原理
前言 数据采集是将自然界中存在的模拟信号通过模数转换器(ADC)转换成数字信号,再对该数字信号进行相应的接收和处理。数据采集系统作为数据采集的手段,在移动通信、图向采集、无线电等领域有重要作用。随着电子信息技术的飞速发展…...

FluxMQ—2.0.8版本更新内容
FluxMQ—2.0.8版本更新内容 前言 FLuxMQ是一款基于java开发,支持无限设备连接的云原生分布式物联网接入平台。FluxMQ基于Netty开发,底层采用Reactor3反应堆模型,具备低延迟,高吞吐量,千万、亿级别设备连接࿱…...

计算机寄存器是如何实现的
冯诺依曼体系 冯诺依曼体系为现代计算机的设计和发展奠定了基础,它的核心思想和原则在当今计算机体系结构中仍然被广泛采用和应用。所以只要谈论计算机的组成就离不开冯诺依曼体系 作为核心组成部分的CPU除了由运算器和控制器组成之外,还有一些寄存器…...
两数之和 三数之和 哈希方法
两数之和 package com; import java.util.*; public class Test5 { //两数之和 public static void main(String[] args) { int[] arr {1,2,3,4,5,6,7,94,42,35}; int target99; Arrays.sort(arr);//快速排序 for(int i0;i<arr.length;i) { int wtarget-arr[i]; int indexA…...

Object Detection in 20 Years: A Survey(2019.5)
文章目录 Abstract1. Introduction1.1. Difference from other related reviews1.2. Difficulties and Challenges in Object Detection 2. OBJECT DETECTION IN 20 YEARS2.1. 目标检测路线图2.1.1. 里程碑:传统探测器(粗略了解)2.1.2. 里程碑:基于CNN的…...
Springboot 设置时区与日期格式
1.配置文件修改(范围修改) spring:jackson:# 东8 北京时区time-zone: GMT8# 日期格式date-format: yyyy-MM-dd HH:mm:ss 2.Java代码修改(范围修改) 2.1 时区 import org.springframework.context.annotation.Bean; import org.…...

从零开始学Go web——第一天
文章目录 从零开始学Go web——第一天一、Go与web应用简介1.1 Go的可扩展性1.2 Go的模块化1.3 Go的可维护1.4 Go的高性能 二、web应用2.1 工作原理2.2 各个组成部分2.2.1 处理器2.2.2 模板引擎 三、HTTP简介四、HTTP请求4.1 请求的文本数据4.2 请求方法4.2.1 请求方法类型4.2.2…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...

多模态学习路线(2)——DL基础系列
目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization(RMSNorm) 二、激活函数 1. Sigmoid激活函数(二分类&…...

RFID推动新能源汽车零部件生产系统管理应用案例
RFID推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域,电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式,存在单点位单独头溯源、网关布线…...
Vue3 hooks
export default function(){ let name; function getName(){ return name; } return {name,getName} } use it ----------------------------------------------- import useName from hooks/useName const {name,getName} useName(); 这段代码展示了一个自定义 Vue3钩…...