![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
cafe-BABE
嵌入式
展开
-
百度笔试:牛牛有n张卡片,每张卡片要么是0,要么是5,找出所有的可能的数字里面能整除90的最大的数字
题目:牛牛有n张卡片,每张卡片要么是0,要么是5,牛牛能从其中选出若干张卡片,然后组成一些数字,现在请找出所有的可能的数字里面能整除90的最大的数字,不存在则输出-1。输入:115 5 5 5 5 5 5 5 0 5 5输出:5555555550思路:首先说出一个数学定理:如果一个数字里面的数的累加和是9的倍数,那么他就可以被9整除。这题是90,只要我们在这个数末尾加0就可以了(这也是这题给我们0的作用),因此我们统计5和0的个数;如果累加和是9的倍数其实就是5的个数是9的倍.原创 2020-09-04 15:22:39 · 841 阅读 · 5 评论 -
JAVA笔试时如何读取未知行数的输入??
在使用scanner进行读取的时候,如果不知道输入是多少行,怎么办?直接给出答案: Scanner cin = new Scanner(System.in); String s=null; while(true){ if ((s = cin.nextLine()).equals("")) break; System.out.println(s);} System.out.println("out!!");这样,如果某一行什么都没有输入,直接一个回车的话,就跳出whi原创 2020-08-24 15:27:37 · 2114 阅读 · 0 评论 -
Java中大文件读取,内存放不下怎么办?
答曰:使用内存分块映射。但是在这之前首先看看传统的java io为什么会慢?我们使用传统IO的时候使用:InputStream(比如FileInputStream),当我们进行对Java API Read和Write函数的调用,最终是调用JNI(Java Native Interface)的read、write系统调用。JNI,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。最终调用操作系统底层系统调用。 而操作系统底层的read和write调用的时候...原创 2020-08-20 20:35:46 · 1987 阅读 · 0 评论 -
【面试题之】HashMap的hash方法
手撕HashMap里面需要注意的就是hash方法的实现,一般来说,网上的hash方法的实现,主要有两种:还有一种是下面的:其实这两种都对,只是他们是不同java版本里面的,上面的是java7里面的,下面是java8里面的。这里面的代码内容实际上就是一个“扰动函数”,之所以做这个改动是因为作者觉得Java 8里面扰动做一次就够了,做4次的话,多了可能边际效用也不大,所以为了效率考虑就改成一次了。第一个函数里面的参数h实际上就是key 的hashcode(),返回一个int型散列值,而如果直原创 2020-07-21 16:13:52 · 207 阅读 · 0 评论 -
【面试题之】:手撕HashMap
前几天字节二面,面试官要求自己手写一个HashMap,当时就有些被惊到了,虽然读过HashMap的源码,也能侃侃而谈,但是说的和做的难度还是不一样的,当时吹了一会HashMap之后,面试官淡淡一笑,说:“好的,那写一下吧,,,,”。看来还是逃不过啊,最后写的不太好,所以说,大家以后还是要动起手来啊!首先HashMap的底层就是一个数组,数组里面保存了Key和Value,以及一个next指针,如果没有哈希冲突的话,next指针就是null,如果有哈希冲突,那么就会形成链表,指向下一个元素。这里我们首先要了原创 2020-07-21 16:08:52 · 729 阅读 · 0 评论 -
【JVM】利用枚举实现单例模式完全讲解!!
目录代码程序简单讲解继续深入代码首先直接给使用枚举实现单例模式的代码: public class User { //私有化构造函数 private User(){ } //定义一个静态枚举类 static enum SingletonEnum{ //创建一个枚举对象,该对象天生为单例 INSTANCE; private User user; //枚举的构造函数天生且必须是priva原创 2020-07-15 11:32:53 · 817 阅读 · 0 评论 -
【JVM】为什么静态内部类实现单例模式是线程安全?
首先给出代码://基于类初始化的线程安全的单例class SingleTon4{ private SingleTon4(){} private static class InnerClass{ private static SingleTon4 instance= new SingleTon4(); } public static SingleTon4 getInstance(){//如果没有到这里,那么不会加载上面的内部类 return InnerClass.inst原创 2020-07-14 21:36:35 · 5178 阅读 · 4 评论 -
AIO与NIO
关于什么是NIO以及NIO和BIO 的区别是什么,之前我在博客里面其实讨论过,大家可以看看我之前的帖子,今天主要简单讲讲AIO和NIO的比较。BIO和NIO:https://blog.csdn.net/qq_35590091/article/details/107121482首先,给BIO、NIO、AIO三者做一个简答的比较:在BIO里面,执行socket.read的时候,如果没有接收到数据,函数就会一直阻塞住,直到收到数据,返回读到的数据。也就是说等待就绪阶段阻塞,读写操作阶段也阻塞。而在原创 2020-07-13 15:06:24 · 429 阅读 · 0 评论 -
【JVM】java中泛型底层是如何实现的??
首先说说语法糖首先,在讲java中的泛型之前,需要介绍一下语法糖。什么是语法糖呢?简单来说,就是在计算机语言里面通过添加某种语法,这种语法不会对语言的编译结果产生实际的影响,但是可以使得程序员更方便的使用该语言,增加程序的可读性,减少代码量,提高开发效率。java里面常见的语法糖除了泛型除了之外,还有自动装箱拆箱,变长参数,他们都是语法糖。但是实际上JVM虚拟机并不支持这些语法糖中的语法,他们会在编译阶段被还原成原始的基本语法结构。再谈泛型现在我们了解到了,泛型其实是java语法糖里面的原创 2020-07-07 11:40:17 · 2285 阅读 · 4 评论 -
NIO是干什么的?保证你懂!
目录为什么使用NIO?概括那么NIO为什么可以不使用多线程呢?继续优化最后总结为什么使用NIO?首先,NIO指的是非阻塞的IO方式,或者new IO,为什么要使用这种方式?因为在NIO出现之前,java使用socket来实现网络通信功能,socket的大概流程是:服务端创建一个ServerSocket, 然后就是客户端用一个Socket去连接服务端的那个ServerSocket, ServerSocket接收到了一个的连接请求就创建一个Socket和一个线程去跟那个S..原创 2020-07-04 11:13:00 · 1075 阅读 · 0 评论 -
【并发】Lock类的底层实现原理
虽然都是用来实现锁功能,但是lock需要显式的获取和释放锁,而synchronized是隐式的获取和释放锁,虽然synchronized用起来比较方便,但lock能够以非块结构来实现互斥同步,更加自由。同步器队列同步器是lock如何完成线程同步的关键,同步器依赖内部的一个同步队列(FIFO的双端队列)来完成同步操作。具体来说,就是如果当前线程获取同步状态失败(也就是获取锁失败),同步器就会把当前线程和等待状态等信息构造成一个节点(Node),并把这个节点加入同步队列,并阻塞这个线程。同步器里面有原创 2020-06-28 13:55:18 · 445 阅读 · 0 评论 -
【JVM】synchronized为什么具有可见性,原子性,有序性?
对于为什么volatile具有:“有可见性,有序性,但没有原子性”,可以看我的另一篇博客:https://blog.csdn.net/qq_35590091/article/details/106986536synchronized是互斥同步的手段的一种,主要用来解决多个线程并发访问共享数据时,保护数据的一致性的问题。原子性 synchronized经过编译之后,对应的是class文件中的monitorenter和monitorexit这两个字节码指令。这两个字节码对应的内存模型的操...原创 2020-06-27 19:19:55 · 1339 阅读 · 1 评论 -
【JVM】为什么volatile有可见性,有序性,但没有原子性
可见性当一个变量被定义为volatile,它将具备两个特性,第一个是保证变量对所有线程具有“可见性”,具体来说就是当一个线程对该变量进行了修改,那么别的线程会立即得知(这个变化)。那么可见性的实现原理是什么呢?实现原理:如果使用这个修饰符,对该变量进行写操作之后,会立即执行store和write操作(对应的汇编代码中会加上一个lock前缀),立即将该变量从工作内存(或者说缓存)写入主内存,保证了对别的线程立即可见(因为这会导致别的线程的工作内存中该变量的缓存会失效),并且同时其他的cpu的工作内原创 2020-06-27 19:09:08 · 385 阅读 · 0 评论 -
【MySQL】快速理解什么是聚簇索引和非聚簇索引?
什么是聚簇索引?聚簇索引首先并不是一种索引类型,而是一种数据存储方式,我的理解是,是否为聚簇索引实际上指的就是b+树的具体实现方式,也就是每个节点的data域里面到底放什么东西。究竟放的是具体的数据,还是指向数据的“指针”?先给出一个结论:InnoDB存储引擎的主键使用的是聚簇索引,而非主键使用的称作:“辅助索引”、“二次索引”,而MqISAM存储引擎无论主键,还是非主键使用的索引都是一样的:“非聚簇索引”。InnoDB存储引擎主键使用:聚簇索引本质上是在b+树索引的叶子节点上的dat.原创 2020-06-12 15:36:45 · 1676 阅读 · 1 评论 -
Executor框架浅析
1、Executor框架的2级调度模型在多线程的程序里面有非常多的任务,比如线程池里面,我们不断会往阻塞队列里面提交各种任务(task),各种任务经过Executor框架完成第一级的任务调度,将这些任务映射为线程池里面固定数量的线程。然后操作系统内核会将这些线程映射到具体的cpu上,这就是第二季的任务调度。2、Executor框架的结构主要包括三部分:任务:被执行的任务需要实现runnable接口或者callable接口。 任务的执行:主要是ExecutorService接口的两个实...原创 2020-06-10 14:28:45 · 231 阅读 · 0 评论 -
CountDownLatch和CyclicBarrier简介
目录CountDownLatchCyclicBarrier同步屏障两者的区别CountDownLatchCountDownLatch和join的功能类似,也就是让一个线程等待其他线程都执行完,再执行后续的内容。但是功能更多。CountDownLatch的构造函数里面传入一个int变量作为计数器的值,表示等待N个点完成。这N个点可以放在不同线程里表示等待着N各线程的完成,也可以放在一个线程的不同位置,表示等待不同步骤的完成。然后在每个点放置CountDownLatch的countDow原创 2020-06-09 15:16:29 · 145 阅读 · 0 评论 -
线程池详解
目录为什么需要线程池?线程池的工作原理如何设计线程池的大小?线程池的具体操作: 1、线程池的创建 2、向线程池提交任务 为什么任务队列使用阻塞队列?为什么需要线程池?因为线程的创建和结束都是非常消耗资源并且耗时的,因此就会想到,是否可以重复利用已经创建的线程,以此来节约资源的消耗。此外,当一个任务到来时,直接使用已经创建的线程也可以提高响应速度。另外线程是一种稀缺资源,利用线程池对线程进行统一的管理调度,可以增强系统的稳定性。线程池的工...原创 2020-06-08 12:32:23 · 161 阅读 · 2 评论 -
ConcurrentHashMap源码浅析
什么是 ConcurrentHashMap? ConcurrentHashMap是一种线程安全且高效的Hashmap,因为hashmap不是线程安全的,在并发执行put时,可能会导致链表形成环形结构,于是entry的next节点永远不为空,因此陷入死循环。 而线程安全的hashTable则效率低下,原因是他使用synchronized来实现线程安全的,比如当一个线程使用容器put时,其他的线程会阻塞,不仅不能put,连get也不行,因此效率较低。 而concu...原创 2020-06-07 11:28:57 · 227 阅读 · 0 评论 -
HashMap部分源码浅析
HashMap的底层是数组+链表(jdk1.7是数组+链表,之后数组+链表+红黑树) ,key唯一的,value可以重复,允许存储null 键null 值,元素无序。 如果两个不同Key的元素,通过哈希函数计算出来的哈希值是一样的,就会产生哈希冲突,哈希冲突有很多种解决办法,开放地址法(发生冲突,继续寻找下一块未被占用的存储地址),拉链法,再造哈希法等等,但是HashMap使用的是拉链法。也就是在哈希冲突的地方创建一个链表。查询的时候,如果定位的地方没有链表,则直接取出,如果存在链...原创 2020-06-06 14:39:25 · 736 阅读 · 0 评论 -
自己理解的为什么hashmap线程不安全
HashMap的结构就是哈希表,底层是一个数组,这个数组中尽可能地分散所有的key,通过key的hash值得到数组下标,然后把entry插到该数组,假如有两个不同的key被分到相同的下标,也就是哈希冲突,那么该数组在该下标下就会形成链表。如果链表长度太大,会进行扩容,也就是构建一个更长的数组来存放链表,链表里面的各个元素会根据哈希算法计算新的hashcode,也就是散列值,然后每个元素根据新的hashcode存放到新的数组的对应位置。以上是哈希表的简介。这里举例2种情况可能导致线程不安全,第二种原创 2020-06-05 15:17:14 · 348 阅读 · 0 评论 -
JVM方法区和class文件之间的对应关系
根据《深入了解JVM虚拟机》里面的第二章的说法,方法区是线程共享的内存区域,主要用来存放:类加载的类型信息、常量、静态变量、即时编译器编译的代码缓存等等。上面的叙述其实比较笼统,看完之后依然不知道方法区究竟是干什么的,也不知道具体里面放了哪些东西。上网查询了一些资料,把自己的理解记录下来。1、什么是类型信息?或者说类型相关的信息??类型信息主要包括一下几个方面,类全名、父类名称、实现的接口集合、类的各种字段信息、类的各种方法信息、类的修饰符。而如果我们再回忆一下 编译器编译java源代码原创 2020-06-04 14:17:18 · 1238 阅读 · 1 评论 -
对CAS的理解
首先介绍一下什么是悲观锁,乐观锁(包括synchronized,reentrantlock)表示,总是悲观的认为,如果不加锁,就会出现线程安全问题。因此,无论共享数据是否存在竞争,都去加锁。(因为不管三七二十一都加锁,这样会经常性的从用户态转化为核心态,性能的开销很大) 而乐观锁表示:乐观的认为共享数据出现竞争的情况会很少,因此不去加锁,如果真的没出现竞争,那么操作就成功了,如果出现了竞争,那么就不断进行重试,直到没有线程竞争为止。典型的就是CAS操作。(也就是说CAS操作是一个无锁操作,...原创 2020-06-03 13:47:18 · 196 阅读 · 0 评论 -
共享单车安卓客户端app设计之扫描二维码
前一篇博客主要是将如何来将百度地图控件插入app中,这篇将如何在app中实现二维码的扫描和识别。相关apk的安装包下载地址为(可以下载下来体验一下):下载地址二维码(QR code) 二维码又叫做二维条码,但是我们在移动平台上见得最多的是QR Code,QR的全称叫做Quick Response,这是一个近几年来的移动设备上非常流行的一种编码方式。二维码就是利用某种特定的几何图形按照一定的规律分布的黑白相间的图案用来记录数据的。我们可以从QR的全称看出来,超高速的识别特点是QR Cod...原创 2020-06-02 17:21:28 · 1465 阅读 · 0 评论 -
共享单车安卓客户端app设计
首先展示一下最终的成品效果吧,首先是登陆界面:然后是地图显示界面(A表示自身位置,B表示自行车位置):此外还有密码修改界面:扫描二维码界面:下面是我写的app的apk安装包下载地址:安卓apk安装包下载共享单车客户端的几个基本功能:首先是在地图上查询自身位置,查询自行车的位置、找到了自行车的话需要扫描二维码实现开锁,以及一开始的软件登陆等等功能。这里的地图模块,我使用的是百度地图,也就是说在程序里面嵌入一个控件(Fragment),首先介绍一下Fragment。.原创 2020-06-02 16:49:37 · 2187 阅读 · 3 评论 -
对java内存模型中“有序性”的理解
书上说,对于java内存模型的有序性可以总结为一句话:“在线程内部观察,那么所有的操作都是有序的,在一个线程中观察另外一个线程,所有的操作都是无序的”。老实说,我一开始看到这句话一面懵逼,什么玩意,经过了一个晚上的思考,我似乎理解了其中的意思。1、为什么说:在线程内部观察,那么所有的操作都是有序的?首先,为什么说在在线程内部观察,那么所有的操作都是有序的?因为我们知道程序的实际执行的顺序不一定和我们程序实际写的顺序是一致的,因为虚拟机编译执行时,也就是把class文件编译成本地代码执行时,可能会原创 2020-06-01 14:04:53 · 534 阅读 · 3 评论 -
自制简易随机数发生器
如果想获得一个随机数的数组,这个随机数的范围是指定的,长度可以指定,也可以在某个范围之内随机,那么就可以参考以下方法。1、长度固定的随机数组:public class randomGenerator { public static int[] randomGen(int size,int vlaue) { int[] arr=new int[size]; for(int i=0;i<arr.length;i++) { arr[i]=(int)((vlaue+1)*M原创 2020-05-28 16:00:56 · 659 阅读 · 0 评论 -
利用异或来交换数组元素
一般的排序算法中的用于交换数组里面两个位置元素的swap函数都要使用一个temp变量作为中转,但是利用异或,可以实现无需中转变量即可完成元素的交换,其中的原理基于以下:假设两个数a和b,将a异或b的值记做temp,即:temp=a^b;那么temp^a的值为b,并且temp^b的值为a。也就是说:将两数异或的结果与其中一数再进行异或,可以得到另一个数。根据这个定理,我们可以将temp的值直接保存在其中一个数组元素里面,从而实现不借助中转变量的数组元素交换。public class原创 2020-05-28 15:37:04 · 1077 阅读 · 0 评论 -
Mybatis的一对一和一对多
“一对一”可以使用于一个订单对应一个用户,而“一对多”可以使用于一个用户对应多个订单。使用的基本方法都是基于sql的增删改查,也就是在xml文件里面使用下面几个标签:1、insert标签:在某个字段下插入一个值2、delete标签:删除某个id的数据3、select标签:根据某个id查询一个数据,也可以查询所有数据(这样返回一个list)、还可以进行模糊查询、多条件查询4、update标签:更新某个id的数据一对一普通的增删改查只是针对于一个表里面的数据进行修改。但是如果有两个表,.原创 2020-05-21 17:04:58 · 1124 阅读 · 0 评论 -
String::intern()和字符串常量池的理解
首先区分一个概念,运行时常量池是方法区的一部分,他包括了字面量(也就是字符串常量池)以及符号引用。Class文件里面也有一个常量池表,但是运行时常量池相比它来说可以动态添加,也就是说在运行的时候可以动态添加新的常量到常量池,使用的就是String类的intern().在JDK6之前运行时常量池都是在方法区的,但是在JDK7之后,将字符串常量池从方法区移到了JAVA堆中,运行时常量池剩下的东西还在方法区。具体来说就是JDK1.6中,字符串常量池里面会保存各种字符串(以字符串对象实例的形式保存),但是.原创 2020-05-14 17:06:30 · 227 阅读 · 0 评论 -
Java的i=i+1的内存模型原理
今天遇到这样的一道题目package algorithms.com.guan.javajicu; public class Inc { public static void main(String[] args) { Inc inc = new Inc(); int i = 0; inc.fermin(i); i= i ++; System.out.println(i); } voi原创 2020-05-12 17:29:11 · 665 阅读 · 0 评论 -
Java-栈和队列的三种实现方式
栈是先进后出,队列是先进先出。是2种重要的线性数据结构,和线性表相比,他们的插入和删除受到更多的约束与限定,因此称为限定的线性表结构。栈的实现(数组或者链表、LinkedList)但是这两种方法都不是线程安全的,如果要实现线程安全,需要对入栈和出栈进行同步操作。数组实现的话,主要是要实现pop和push函数,以及peek查找栈顶,然后push的时候如果容量不够的话,需要扩容。 链表实现的话,也是主要实现push和pop函数,以及peek查找栈顶,需要注意的是,push的时候,要把新的数据放在上转载 2020-05-11 09:47:44 · 526 阅读 · 0 评论 -
Java-线程局部存储
线程局部存储(thread local storage)TLS会为每一个线程维护一个和该线程绑定的变量的副本,Java平台的java.lang.ThreadLocal是TLS技术的一种实现,解决多线程中的对同一变量的访问冲突的一种技术。本地存储的作用和数据同步类似,防止多线程同时对某个共享变量的修改导致的混乱,使得每个线程都是在修改自己本地的变量,相互之间没有交集,所以不会有冲突。但是不同于线程内部的局部变量,线程本地变量是在线程外面定义的。使用ThreadLocal类的 set 和 get .原创 2020-05-09 10:59:23 · 404 阅读 · 0 评论 -
Java-sevlet利用JSON传递数据
JSONJSON的全称是JavaScript Object Notation,即JS对象表示法,是一种数据存储的方式,本质上是JS中的自定义对象,不同于其他的内置对象(Number,String,Array,Date,Math)。其格式如下所示:var gareen = {"name":"盖伦","hp":616};这样就定义了一个JSON对象,JSON对象由 名称/值对组成 名称和...原创 2020-05-08 10:46:20 · 595 阅读 · 0 评论 -
Java-守护线程
守护线程的概念是: 当一个进程里,所有的线程都是守护线程的时候,结束当前进程。是给别的线程提供服务的。java有两种线程:“守护线程”和“用户线程”,守护线程又叫做“服务进程”、“精灵线程”、“后台线程”守护线程一个典型的例子就是“垃圾回收器”如果我们要将某个线程设置为守护线程,需要在调用start()之前,先调用对象的setDaemon(true),如果是false则是用户线程模式...原创 2020-05-03 22:13:04 · 185 阅读 · 0 评论 -
Java学习笔记5
java平台与内存管理 java具有”平台独立性“,指的是可以在一个平台上编写编译程序,在另外的平台上运行程序。实现的机制为:“中间码(也就是字节码,后缀为.class)”和“JVM”,程序被编译之后,不是生成在硬件平台上的可执行代码,而是“中间码”,然后又不同硬件平台上的JVM来翻译”中间码“生成不同硬件平台的可以执行代码。因此JVM不具有“平台独立性”,因为每个平台的JVM都是不一...原创 2020-05-01 17:06:34 · 195 阅读 · 0 评论 -
Java-编译看左,运行看右
时常会在编程题里面看到这样类似的对象的定义:Animal f = new Cat(); 其中Cat为子类,Animal为父类,然后后面调用f的各种方法,判断到底调用的是父类的方法,还是子类的方法。首先给出一个结论:成员变量,静态方法:编译和运行都看左边;非静态方法:编译看左边,运行看右边。具体来说就是:在这个引用变量f指向的对象中,他的成员变量和静态方法与父类是一致的,他的非静态方法,在编...原创 2020-04-30 20:30:47 · 1259 阅读 · 2 评论 -
Java-IO流
流的本质是数据传输,根据处理的数据类型不同,可以将流分为一下几类:简要介绍字节流:以字节(8bit)为单位,继承于两个抽象类InputStream(输入流)和OutputStream(输出流)(同时都是抽象类,只提供方法声明,不提供方法的具体实现)字符流:一字符(16bit)为单位,继承于2个抽象类Reader(输入流),Writer(输出流)两者的区别是:字节流不会用到缓存,但是...原创 2020-04-27 18:14:21 · 191 阅读 · 0 评论 -
Java-内部类
首先内部类是指在一个类的内部定义的一个类,需要注意的是, 当成员内部类拥有和外部类同名的成员变量或这方法时, 默认情况下访问的是内部类的成员, 如要访问外部类的同名成员, 需要使用以下形式:外部类.this.成员变量/方法。创建的时候:内部类 引用名 =new 外部类().new 内部类()包括以下几种内部类:静态内部类声明时前面加了static。因为是静态的,因此不需要外部类...原创 2020-04-26 19:59:37 · 576 阅读 · 0 评论 -
实现接口方法时出现:The method ** of type helloworld must override a superclass method
第一种:直接删掉override注解。第二种:按eclipse的Windows->Preferences->Java->Compiler “configure project specificsettings”, Change from java 1.5 (5.0) to 1.6 (6.0)此时,会发现 做了上面步骤,为啥还要报错,那是因为 导入的项目,还没把...转载 2020-04-26 16:25:24 · 242 阅读 · 0 评论 -
Java学习笔记4
实现多重继承三种方式:(1)直接实现多个接口 (2)扩展(extends)一个类然后实现一个或多个接口 (3)通过内部类去继承其他类 list和set的区别:Set 不能有重复的元素,且是无序的,要有空值也就只能有一个,因为它不允许重复。 L ist 可以有重复元素,且是有序的,要有空值也可以有多个,因为它可重复 类方法和实例方法类的方法就是指类中用static 修饰的方法,非static...原创 2020-04-25 22:11:47 · 208 阅读 · 0 评论