Posts

Showing posts from November, 2023

Java基础

Image
markdown ## 何时需要重载hashcode() 与equals()方法 ``` https://blog.csdn.net/kris1025/article/details/79875638 ``` ## 何时:自定义对象作为 hashmap 的key why: Object 类 eaquls方法比较的是对象是否指向同一个地址,hashcode 是根据对象地址计算的。业务逻辑预期对象相等是指值是否相等。因此需要重载hashCode eaquls 1)重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上 2)重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对。 ## == 与eaquls区别 == 比较对象是否指向同一个地址, eaquls一般预期是比较业务逻辑上是否相等,即值是否相等。 Integer 使用 == 比较要注意 Integer类有一个默认在-128~127之间的常量缓存池,当我们的基本类型的数在这个之间的时候会指向缓存中的对象,也就是同一个对象。 该范围内的相同值==比较相等,超过该范围即使数值相等,结果也不等 e.g. ``` https://blog.csdn.net/meiyijian/article/details/77230202 ``` ``` public static void main(String[] args) { // case 1 Integer a1 = Integer.valueOf(60); Integer b1 = 60; System.out.println("1:="+(a1 == b1)); // case 2 Integer a2 = 60; Integer b2 = 60; System.out.println("2:="+(a2 == b2)); // case 3 Integer a3 = new Integer(60); Integer b3 = 60; System.out.p...

库存优化专题

markdown # 库存优化专题 - 开放平台技术部 ## this is T2 ``` 空间 人员 创建 创建 快速搜索  帮助 各空间管理员信息  E编辑 F收藏 观看 S分享 页面/…/ 性能优化专题 跳到banner的尾部  回到标题开始 库存优化专题 转至元数据结尾 由 创建, 最后修改于十月 12, 2019 转至元数据起始 背景 名词解释 整体思路 表结构设计 冻结库存调整 开启热点商品 关闭热点商品 归还库存 参考 背景 目前交易下单流程中,主要有下订单、冻结优惠券、冻结库存操作,其中冻结库存由于受限于单行行锁的原因,只能支持极限 600 TPS。 在可预见的未来,冻结库存将会成为下单流程中的瓶颈,所以承需解决库存性能瓶颈,提高整体下单的 TPS,保障未来业务的稳定高速发展 名词解释 下单过程中库存主要以商品 sku 维度来进行冻结 普通商品:下单扣库存并发不高的商品 秒杀商品:库存比较少,下单扣库存并发高的商品 热点商品:库存比较多,下单扣库存并发高的商品(库存超过 1W 以上) 秒杀商品与热点商品区别在于秒杀商品很快就会将库存扣减为0,且之后就不会再有扣库存请求了,没有必要进行热点分片。所以,下文讨论主要讨论热点商品。 整体思路 冻结库存主要分为两步 :插入幂等日志和冻结 sku 库存。其中性能单点就是下面冻结 sku 库存 update 语句,由于同时更新一条记录,受限于 MySQL 行锁,只能支持 600 TPS 。 1. 开启事务 start transaction 2. 插入幂等操作日志 insert stock_log 3. 冻结 sku 库存 update sku_item set frozen_stock = frozen_stock + 1, available_stock = available_stock -1 where available_stock > 0 4. 关闭事务 end transaction 针对 update 瓶颈其实为 I/O瓶颈,解决方法主要两种: 增加 IO 设备 (分散读写记录) 减少 IO 次数(批量一次性提交) 在热点商品场景下,初步思路采用水平拆分分片的思路来分散热点数据。原先单条 sku 记录拆分成主 sku 记录(sku_item...

String、StringBuffer和StringBuilder的区别

概念: 1、用来处理字符串常用的类有3种:String、StringBuffer和StringBuilder 2、三者之间的区别: 都是final类,都不允许被继承; String类长度是不可变的,StringBuffer和StringBuilder类长度是可以改变的; StringBuffer类是线程安全的,StringBuilder不是线程安全的; String 和 StringBuffer: 1、String类型和StringBuffer类型的主要性能区别:String是不可变的对象,因此每次在对String类进行改变的时候都会生成一个新的string对象,然后将指针指向新的string对象,所以经常要改变字符串长度的话不要使用string,因为每次生成对象都会对系统性能产生影响,特别是当内存中引用的对象多了以后,JVM的GC就会开始工作,性能就会降低; 2、使用StringBuffer类时,每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用,所以多数情况下推荐使用StringBuffer,特别是字符串对象经常要改变的情况; 3、在某些情况下,String对象的字符串拼接其实是被Java Compiler编译成了StringBuffer对象的拼接,所以这些时候String对象的速度并不会比StringBuffer对象慢,例如: String s1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”); 生成 String s1对象的速度并不比 StringBuffer慢。其实在Java Compiler里,自动做了如下转换: Java Compiler直接把上述第一条语句编译为: String s2 = “This is only a”; String s3 = “ simple”; String s4 = “ test”; String s1 = s2 + s3 + s4; 这时候,Java Compiler会规规矩矩的按照原来的方式去做,String的concatenation(即+)操作利用了Stri...

17. Letter Combinations of a Phone Number

Image
Medium Topics Companies Given a string containing digits from  2-9  inclusive, return all possible letter combinations that the number could represent. Return the answer in  any order . A mapping of digits to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.   Example 1: Input: digits = "23" Output: ["ad","ae","af","bd","be","bf","cd","ce","cf"] Example 2: Input: digits = "" Output: [] Example 3: Input: digits = "2" Output: ["a","b","c"]   Constraints: 0 <= digits.length <= 4 digits[i]  is a digit in the range  ['2', '9'] . solution: 涉及全部可能的结果,使用搜索算法。 这是个排列组合问题对吧?这个排列组合可以用树的形式表示出来; 使用深度搜索算法,(问题可以看看作树的搜索问题,也可认为回溯算法) 解法思路 当给定了输入字符串,比如:"23",那么整棵树就构建完成了,如下:     {:align=center} 问题转化成了从根节点到空节点一共有多少条路径; 解法实现 关键字: 排列组合 树 递归 递归带货 实现细节: 在递归的外面有个货仓  combination...

35. Search Insert Position

35. Search Insert Position Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You must write an algorithm with  O(log n)  runtime complexity. Example 1: Input: nums = [1,3,5,6], target = 5 Output: 2 Example 2: Input: nums = [1,3,5,6], target = 2 Output: 1 Example 3: Input: nums = [1,3,5,6], target = 7 Output: 4   Constraints: 1 <= nums.length <= 10 4 -10 4 <= nums[i] <= 10 4 nums  contains  distinct  values sorted in  ascending  order. -10 4 <= target <= 10 4 Solution: binary search 二分搜索 class Solution { /* 二分搜索 */ public int searchInsert ( int [] nums , int target ) { int start = 0 ; int end = nums . length - 1 ; while (start <= end){ // 每次loop需要更新索引mid为当前数组的中间位置 int mid = start + (end-start)/ 2 ; // int mid ...

关于香港的记忆

Image
      和许多九零年代出生的人一样,香港黄金时代的经典电影与流行歌曲一路伴随我成长,走过梦幻的童年时代。那时的香港正处于一个如梦如幻岁月流金的年代,是一座让人对未来的充满希望,令人着迷的城市。于是想着有朝一日,定要去拜访看看。        工作后,去过很多地方,不知何时起渐渐觉得,和我所在的城市上海比,香港应该也只是另一座摩登都市,反而没有很想去探索的欲望。每次出门旅行,倒总是倾向去异国他乡游玩。       去年因为上海lockdown,让我们错过了整个春天。被夺走的美好的东西,总想着找回来,那时候就再想,解封后一定要出趟远门,去呼吸那新鲜自由的空气!等过完春节回上海,一切还未从lockdown中缓过神来,考虑到当时情况,香港便成了可选的首站城市。      2023年农历正月初十,初春,咋暖还寒,带着一路兴奋与期待,我们坐上了上海飞往香港的飞机!     准备登机✈️ 酒店旁随机的选到的一家好吃的茶餐厅 下榻的酒店让人想起了布达佩斯大饭店    参观香港故宫博物院,看到了许多明清时期的展品,借此一窥那个时代人们的生活。 博物院的展品 街边的好吃的鸡蛋仔 在博物院的露台上俯瞰维港      赶在黄昏日落前,爬上太平山顶,追到了最后一抹夕阳的柔光,这时山间吹来阵阵凉风,拂去白日的些许闷热,一切令人 舒适 松弛。 夜幕降临,圆月升起,俯瞰华灯初上的城市 未完待续...