没有合适的资源?快使用搜索试试~ 我知道了~
首页大数据面试宝典-精简版.pdf
大数据面试宝典-精简版.pdf
需积分: 50 88 下载量 39 浏览量
更新于2023-03-16
评论 5
收藏 5.38MB PDF 举报
从Java基础,JVM,数据库,hadoop,hive,hbase,flume,zookeeper,kafka,scala,redis,机器学习,业务相关多个角度分析了大数据面试可能遇到的问题,非常详细,建议大数据专业的学者都应该阅读一下。
资源详情
资源评论
资源推荐
java基础篇
问题1
列举Java中的基本数据类型
1)四种整数类型(byte、short、int、long): byte:8 位,用于表示最小数据单位,如文件中数
据,-128~127 short:16 位,很少用,-32768 ~ 32767 int:32 位、最常用,-2^31-1~2^31 (21 亿)
long:64 位、次常用 注意事项: int i=5; // 5 叫直接量(或字面量),即 直接写出的常数。 整数字面量默
认都为 int 类型,所以在定义的 long 型数据后面加 L或 l。 小于 32 位数的变量,都按 int 结果计算。 强转符
比数学运算符优先级高。见常量与变量中的例子。
2)两种浮点数类型(float、double): float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。
double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾 注意事项: 二 进 制 浮 点 数
: 1010100010=101010001.02=10101000.102^10(2次方)=1010100.0102^11(3
次
方
)= .
10101000102^1010(10次方) 尾数: . 1010100010 指数:1010 基数:2 浮点数字面量默认都为 double 类
型,所以在定义的 float 型数据后面加F 或 f;double 类型可不写后缀,但在小数计算中一定要写 D 或 X.X
float 的精度没有 long 高,有效位数(尾数)短。 float 的范围大于 long 指数可以很大。 浮点数是不精确
的,不能对浮点数进行精确比较。
3)一种字符类型(char): char:16 位,是整数类型,用单引号括起来的 1 个字符(可以是一个中文字
符),使用 Unicode 码代表字符,0~2^16-1(65535) 。 注意事项: 不能为 0个字符。 转义字符:换行
回车 Tab 字符 " 双引号 \ 表示一个\ 两字符 char 中间用“+”连接,内部先把字符转成 int 类型,再进行加
法运算,char 本质就是个数!二进制的,显示的时候,经过“处理”显示为字符。
4)一种布尔类型(boolean):true 真 和 false 假。
5)类型转换: char--> 自动转换:byte-->short-->int-->long-->float-->double 强制转换:①会损失精度,
产生误差,小数点以后的数字全部舍弃。②容易超过取值范围。
6)记忆:8位:Byte(字节型) 16位:short(短整型)、char(字符型) 32位:int(整型)、float(单
精度型/浮点型) 64位:long(长整型)、double(双精度型) 最后一个:boolean(布尔类型
问题2
sdfas
ArrayBlockingQueue的原理和底层实现的数据结构 :
ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列,可以按照 FIFO(先进先出)原则对元
素进行排序。
线程安全是指,ArrayBlockingQueue内部通过“互斥锁”保护竞争资源,实现了多线程对竞争资源的互斥
访问。而有界,则是指ArrayBlockingQueue对应的数组是有界限的。 阻塞队列,是指多线程访问竞争
资源时,当竞争资源已被某线程获取时,其它要获取该资源的线程需要阻塞等待;所谓公平的访问队列
是指阻塞的线程,可以按照阻塞的先后顺序访问队列,先阻塞的线程先访问ArrayBlockingQueue队
列。非公平性是对先等待的线程是非公平的,当队列可用时,阻塞的线程都可以争夺访问队列的资格,
有可能先阻塞的线程最后才能够访问队列。然而为了保证公平性,通常会降低吞吐量。
1. ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须
制定容量大小。 并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最
长的队列最优先能够访问队列。
2. ArrayBlockingQueue内部通过Object[]数组保存数据的,也就是说ArrayBlockingQueue本质上是
通过数组实现的。ArrayBlockingQueue的大小,即数组的容量是在创建创建
ArrayBlockingQueue时候指定的。
3. 如下图所示,ArrayBlockingQueue和ReentrantLock是组合关系,ArrayBlockingQueue中包含一
个ReentrantLock对象。ReentrantLock是可重入的互斥锁。ArrayBlockingQueue就是根据
ReentrantLock互斥锁实现"多线程对共享资源的访问"。ReentrantLock分为公平锁和非公平锁,
关于具体使用公平锁还是非公平锁,在创建ArrayBlockingQueue时可以指定;而且,
ArrayBlockingQueue默认会使用非公平锁。
4. ArrayBlockingQueue和Condition是组合关系,ArrayBlockingQueue中包含两个Condition对象
(notEmpty和notFull)。使用通知模式实现:所谓通知模式,当生产者往满的队列里面添加元素的时
候,会阻塞生产者(调用Condition notFull.await()进行等待);当消费者消费了一个队列中的元
素后,会通知(调用Condition notFull.signal()唤醒生产者)生产者当前队列可用。反之,当消费者
消费的时候,发现队列是空的,则消费者会被阻塞(通过Condition的 notEmpty.await()进行等
待),当生产者插入了队列中的一个元素后,则会调用notEmpty.signal()唤醒消费者继续消费。
ArrayBlockingQueue的数据结构如下:
ArrayBlockingQueue方法列表:
总结下上面的方法:
// 创建一个带有给定的(固定)容量和默认访问策略的 ArrayBlockingQueue。
ArrayBlockingQueue(int capacity)
// 创建一个具有给定的(固定)容量和指定访问策略的 ArrayBlockingQueue。
ArrayBlockingQueue(int capacity, boolean fair)
// 创建一个具有给定的(固定)容量和指定访问策略的 ArrayBlockingQueue,它最初包含给定
collection 的元素,并以 collection 迭代器的遍历顺序添加元素。
ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)
// 将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回 true,
如果此队列已满,则抛出 IllegalStateException。
boolean add(E e)
// 自动移除此队列中的所有元素。
void clear()
// 如果此队列包含指定的元素,则返回 true。
boolean contains(Object o)
// 移除此队列中所有可用的元素,并将它们添加到给定 collection 中。
int drainTo(Collection<? super E> c)
// 最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定 collection 中。
int drainTo(Collection<? super E> c, int maxElements)
// 返回在此队列中的元素上按适当顺序进行迭代的迭代器。
Iterator<E> iterator()
// 将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回 true,
如果此队列已满,则返回 false。
boolean offer(E e)
// 将指定的元素插入此队列的尾部,如果该队列已满,则在到达指定的等待时间之前等待可用的空间。
boolean offer(E e, long timeout, TimeUnit unit)
// 获取但不移除此队列的头;如果此队列为空,则返回 null。
E peek()
// 获取并移除此队列的头,如果此队列为空,则返回 null。
E poll()
// 获取并移除此队列的头部,在指定的等待时间前等待可用的元素(如果有必要)。
E poll(long timeout, TimeUnit unit)
// 将指定的元素插入此队列的尾部,如果该队列已满,则等待可用的空间。
void put(E e)
// 返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的其他元素数量。
int remainingCapacity()
// 从此队列中移除指定元素的单个实例(如果存在)。
boolean remove(Object o)
// 返回此队列中元素的数量。
int size()
// 获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。
E take()
// 返回一个按适当顺序包含此队列中所有元素的数组。
Object[] toArray()
// 返回一个按适当顺序包含此队列中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
<T> T[] toArray(T[] a)
// 返回此 collection 的字符串表示形式。
String toString()
ArrayBlockingQueue源码分析(JDK1.7)
下面从ArrayBlockingQueue的创建,添加,取出,遍历这几个方面对ArrayBlockingQueue进行分析。
1.创建:
*非阻塞队列中的方法:
*
* 抛出异常的方法 Exception in thread "main" java.lang.IllegalStateException:
Queue full
*1. add(e) throw exception,将元素e插入到队列的末尾,如果插入成功,则返回true,如果插入
失败 (队列已经满) 抛出异常
*2. remove(e) throw exception,移除队首元素,若移除成功,则返回true;若移除失败(队列
为空)则抛出异常
*3. element() throw exception 获取队列首元素,若获取成功,则返回首元素,否则抛出异常
java.util.NoSuchElementException
*
* 返回特定值的方法
*
* 1.offer(E e),将元素e插入到队列末尾,如果插入成功,则返回true,如果插入失败(队列已
满),返回false
* 2.poll(E e),移除并获取队首元素,若成功,则返回队首元素,否则返回null
* 3.peek(E e),获取队首元素,若成功,则返回队首元素,否则则返回null
* 可以指定TimeOut:
*
* 3.offer(E e,long timeout, TimeUnit unit):向队列尾部存入元素e,如果队列满,则等待
一定的时间,当达到timeout时候,则返回false,否则返回true
4.poll(long timeout, TimeUnit unit):从队首获取元素,如果队列为空,则等待一定时间,
当达到timeout时,如果没有取到,则返回null,如果取到则返回取到的元素
阻塞队列中的几个重要方法:
* 1.put(E e) :用于队列尾部存入元素e,如果对满,则等待。
* 2.take():用于从对列首取出元素e,如果队列为空,则等待
注意:阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,但是要注
意这5个方法在阻塞队列中都进行了同步措施,都是线程安全的。
/**
* Creates an {@code ArrayBlockingQueue} with the given (fixed)
* capacity and default access policy.
*
* @param capacity the capacity of this queue
* @throws IllegalArgumentException if {@code capacity < 1}
只是指定ArrayBlockingQueue的容量,默认采用非公平互斥锁
*/ public ArrayBlockingQueue(int capacity) { this(capacity, false); }
/**
* Creates an {@code ArrayBlockingQueue} with the given (fixed)
上面源码进行说明:
items是保存“阻塞队列”数据的数组。它的定义如下:
fair是“可重入的独占锁(ReentrantLock)”的类型。fair为true,表示是公平锁;fair为false,表示是非公
平锁。notEmpty和notFull是锁的两个Condition条件。它们的定义如下:
说明:Lock的作用是提供独占锁机制,来保护竞争的资源;而Condition是为了更精细的对锁进行控
制,但是依赖于lock,通过某个条件对多线程进行控制。
notEmpty表示"锁的非空条件"。当某线程想从队列中获取数据的时候,而此时队列中的数据为空,则该
线程通过notEmpty.await()方法进行等待;
当其他线程向队列中插入元素之后,就调用notEmpty.signal()方法进行唤醒之前等待的线程。同理,
notFull表示“锁满的条件“。当某个线程向队列中插入元素
,而此时队列已满时,该线程等待,即阻塞通过notFull.wait()方法;其他线程从队列中取出元素之后,
就唤醒该等待的线程,这个线程调用notFull.signal()方法。
2.添加:
* capacity and the specified access policy.
*
* @param capacity the capacity of this queue
* @param fair if {@code true} then queue accesses for threads blocked
* on insertion or removal, are processed in FIFO order;
* if {@code false} the access order is unspecified.
* @throws IllegalArgumentException if {@code capacity < 1}
指定容量和ReetrantLock的类型是否为公平锁创建阻塞队列
*/
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity <= 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
/** The queued items */
final Object[] items;
/** Main lock guarding all access */
final ReentrantLock lock;
/** Condition for waiting takes */
private final Condition notEmpty;
/** Condition for waiting puts */
private final Condition notFull;
/**
* Inserts the specified element at the tail of this queue, waiting
* for space to become available if the queue is full.
*
* @throws InterruptedException {@inheritDoc}
剩余114页未读,继续阅读
大数据梦想家
- 粉丝: 4w+
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
- MW全能培训汽轮机调节保安系统PPT教学课件.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0