
面试
我不是臭弟弟
好吃懒做 无所不为
展开
-
Java中的锁
]1.乐观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程转载 2020-11-08 22:21:51 · 122 阅读 · 1 评论 -
intern()的使用:jdk6 vs jdk7/8
总结String的intern()的使用:jdk1.6中,将这个字符串对象尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址。jdk1.7开始,将这个字符串尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址。...原创 2020-08-28 21:49:46 · 159 阅读 · 0 评论 -
说一说八种基本数据类型及其包装类
简介Java基本数据类型分为四大类:整数型:byte,short,int,long浮点型:float,double逻辑型:boolean字符型:char原始类型原始类型所占的字节包装类byte1个字节Byteshort2个字节Shortint4个字节Integerlong8个字节Longfloat4个字节Floatdouble8个字节Doubleboolean1个字节Booleanchar2个字节Ch原创 2020-08-28 19:28:23 · 909 阅读 · 0 评论 -
JVM内存分配策略(或对象提升(Promotion)规则)
针对不同年龄段的对象分配原则如下所示:优先分配到Eden大对象直接分配到老年代(尽量避免程序中出现过多的大对象)长期存活的对象分配到老年代动态对象年龄判断(如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄)空间分配担保(-XX:HandlePromotionFailure)...原创 2020-07-30 00:07:48 · 229 阅读 · 0 评论 -
动态规划和滑动窗口解决最长重复子数组
问题描述给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。提示:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100动态规划这题一看就知道其实就是求最长公共子串问题,我们就以题中的示例画个图来看一下。最长的公共子数组就是上面红色所对应的[3,2,1原创 2020-07-21 15:03:05 · 349 阅读 · 0 评论 -
jdk源码学习——StringBuilder和StringBuffer源码分析
StringBuilder和StringBuffer源码分析前言javadoc小结分析类的声明成员变量看几个常见方法的不同实现StringBufferStringBuilderStringBuilder.toString()StringBuffer.toString()底层扩容机制两者对比总结思考前言StringBuilder和StringBuffer是两个容易混淆的概念,本文从源码入手,简单看二者的异同。容易知道的是,这两者有一个是线程安全的,而且线程安全的那个效率低。javadoc小结java原创 2020-07-18 10:07:05 · 573 阅读 · 0 评论 -
jdk源码学习——AbstractStringBuilder类
类图结构类的申明1.默认访问控制修饰符,说明只能在包内使用,即只能在JDK内部使用,可能有人会问我创建一个java.lang包然后里面的类就可以使用AbstractStringBuilder类了,想法不错,但jkd不允许,会报SecurityException : Prohibited package name: java.lang。故这个类只是给StringBuffer和StringBuilder类使用的。2.类名用abstract修饰说明是一个抽象类,只能被继承,不能直接创建对象。查了里面的方法原创 2020-07-17 20:08:15 · 248 阅读 · 0 评论 -
jdk源码学习——String类
String类String类String类属性String类构造函数String类的常用方法equalscompareTohashCodeconcatreplacetrimintern其他常用的简单方法总结String类String类被final所修饰,也就是说String对象是不可变量。String类实现了Serializable, Comparable, CharSequence接口。Comparable接口有compareTo(String s)方法,CharSequence接口有length原创 2020-07-17 13:28:58 · 497 阅读 · 0 评论 -
volatile很难?由浅入深怼到CPU汇编,彻底搞清楚它的底层原理
Tips:但凡是个像样的公司面试官都得问对volatile关键字理解以及其实现原理。虽然多多少少知道一些,但是问深了,终究感觉还是差了那么一点,所以这次我要把这个关键字来学个通透!本文记录个人学习volatile。主要包含以下内容,力求简单明了:1、一段代码来演示问题背景2、volatile解决内存可见性问题3、Java内存模型原子操作4、总线加锁太慢?MESI缓存一致性协议(总线嗅探机制)5、彻底掌握volatile底层原理1、多线程环境下共享变量的线程安全问题package volati原创 2020-07-06 16:11:20 · 459 阅读 · 0 评论 -
为什么 ConcurrentHashMap 的读操作不需要加锁?
前言我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇博文讨论的问题——为什么它不需要加锁呢?ConcurrentHashMap的简介我想有基础的同学知道在jdk1.7中是采用Segment + HashEntry +ReentrantLock的方式进行实现的,而1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS +Synchronized来保证并发安全进行实现原创 2020-06-29 00:23:05 · 173 阅读 · 0 评论 -
对于final关键字和concat()方法的思考
前置首先我们都知道final关键字修饰的变量必须初始化,且值不能改变。如果是基本类型则值不能改变,如果是引用类型,则引用地址不能改变,但是这个引用所指向的对象里面的内容还是可以改变的。我们先来猜猜看,以下哪一句会通不过编译器编译:public class FinalBean { private final int i = 0; private final int j; private final String name = ""; public FinalBean()原创 2020-06-24 22:54:07 · 274 阅读 · 0 评论 -
如何借助哈希算法实现高效字符串匹配?——RK算法
前言字符串匹配算法简单的有BF算法,RK算法,今天我们只谈论RK算法。BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。在讨论RK算法前,定义两个概念,方便我后面讲解。它们分别是主串和模式串。作为最简单、最暴力的字符串匹配算法,BF 算法的思想可以用一句话来概括,那就是,我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个原创 2020-06-24 17:43:17 · 963 阅读 · 0 评论 -
抽象类与接口对比
抽象类1.抽象类中可以构造方法(因为抽象类中可以有一些变量,这些变量需要通过构造方法来初始化)2.抽象类中可以存在普通属性,方法,静态属性和方法。3.如果一个类中有一个抽象方法,那么当前类一定是抽象类;反之抽象类中不一定有抽象方法。4.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。5.实例化一般指new一个对象,所以抽象类不能实例化(类都有构造方法,但是抽象类的构造方法不能new)接口1.在接口中只有方法的声明,没有方法体。,并且抽象方法可是没有方法体的(原创 2020-06-21 21:24:51 · 222 阅读 · 0 评论 -
创邻科技面试题答案
题目一:小明的女朋友最喜欢在网上买买买了,可是钱包里钞票有限,不能想买啥就买啥。面对琳琅满目的物品,她想买尽可能多的种类,每种只买一件,同时总价格还不能超过预算上限。于是她请小明写程序帮她找出应该买哪些物品,并算出这些物品的总价格。输入规范:每个输入包含两行。第一行是预算上限。第二行是用空格分隔的一组数字,代表每种物品的价格。所有数字都为正整数并且不会超过10000。输出规范:对每个输入,输出应买物品的总价格。输入示例1:10050 50输出示例1:100输入示例2:18850 4原创 2020-06-20 16:47:16 · 1275 阅读 · 0 评论