【无标题】

Java并发安全集合有哪些

1.copyOnWriteArrayList:使用了写时复制的方法,主要执行原理就是每当有新元素add到该数组,会先从原数组拷贝一份出来,在新数组上进行操作,操作完之后再将原来数组的引用指向新数组。但是执行add方法的时候要进行加锁,避免写时复制的时候复制出多个副本出来。

读操作不需要加锁 且读写分离

缺点是内存占用问题、只能保持最终一致性 不能保持实施一致性

2.ConcurrentHashMap

jdk1.7采用分段锁+哈希表实现

jdk1.8采用红黑树+链表+数组实现   利用cas加synchronized锁来保证线程安全

redis解决超卖问题:

使用lua脚本来实现分布式锁  ridisson就是加个守护线程隔一段时间检查锁是否还存在 通过hash算法选择节点

多机实现的分布式锁Redlock+redisson:按照顺序向5个master节点进行加锁,根据加锁的超时时间来判断是不是跳过这个节点 并且成功大于3个节点加锁成功,且还在锁的有效时间内即可认定加锁成功。

spring事务失效的几种场景:

1、将方法定义为private,使用事务有效的修饰符得是public

2、将方法定义成final或static 原因是事务底层用到了aop代理或者cglib代理实现的,在代理类中实现事务的功能,定义为final 代理类就不能重写这个方法

3、方法内部调用  在代理类是直接调用了this对象,所以调用的不是带有事务的那个对象

解决办法就是

4.一个方法如果没交给 spring 管理,就不会生成 spring 事务。

5.一个方法如果没交给 spring 管理,就不会生成 spring 事务。

如果自己 try...catch 误吞了异常,事务失效。错误的传播

更建议大家使用,基于TransactionTemplate的编程式事务。主要原因如下:避免由于spring aop问题,导致事务失效的问题。。避免由于spring aop问题,导致事务失效的问题

统计前10商品:select * from table(这里是表名字) order by id(这里是根据什么排) desc(desc是降序的意思) limit 0,10; (第零个开始 往后搜索十个)

分析Java中各种数据类型对于内存占用的情况

内存公式=对象头+实例数据+对齐填充

对齐填充 Java占用空间是8字节对齐的  所以Java对象占用bytes必须是8的整数倍

shallow size:对象自身所占用的内存大小 不包括它引用的对象  非数组:大小就是对象与它所有成员变量大小的总和。数组:数组元素对象的大小总和

retained size:当前对象大小+当前对象可直接或间接引用到的对象的大小总和,就是去除掉gcroot直接或间接引用的对象  经过GC后从堆中释放的内存

占用的内存:

空对象 16byte    12对象头+4填充

int      16 = 12(Header) + 4(int)

long 24 = 12(Header) + 8(long) + 4(Padding)

包装类型

类型占用空间
Boolean、Byte16byte
Short、Char16byte
Integer、Float16byte
Long、Double24byte

Integer 占用 16b, 32 = 12 (Header) + 16(Integer) + 4(reference)

特别的:-128~127 在常量池,只占用 4b,且不产生引用(reference)

Long 占用 24b, 40 = 12 (Header) + 24(Long) + 4(reference)

String占用40b    string本身占用 24b, 24 = 40 -16,也就是说空""也需要16b

类为什么重写了equals方法后一定要重写hashCode方法

equal和hascode方法之间的关系:

两个对象相同  equal==true  那么hascode一定要相同

两个对象hashcode相同  他们不一定相同(equal==false)

为何重写equals方法就得重写hashCode方法 - 知乎 (zhihu.com)

hashmap 数据元素通过映射关系,映射到索引位置  插入元素时,如果发生冲突,从冲突的位置拉一个链表,把冲突元素放到链表。如 果链表长度>8 且数组大小>=64,链表转为红黑树 如果红黑树节点个数<6 ,转为链表

红黑树是一种平衡的二叉树,其插入、删除、查找的最坏时间复杂度都为 O(logn),避免了二叉树最坏情况下的 O(n)时间复杂度。

平衡二叉树是比红黑树更严格的平衡树,为了保持保持平衡,需要旋转的次数 更多,也就是说平衡二叉树保持平衡的效率更低,所以平衡二叉树插入和删除 的效率比红黑树要低。

红黑树的平均查找长度是 log(n),如果长度为 8,平均查找长度为 log(8)=3, 链表的平均查找长度为 n/2,当长度为 8 时,平均查找长度为 8/2=4,这才有 转换成树的必要;链表长度如果是小于等于 6,6/2=3,而 log(6)=2.6,虽然 速度也很快的,但是转化为树结构和生成树的时间并不会短。

hashmap中负载因子的作用和意义

HashMap是一种基于哈希表的实现的Map接口的数据结构,它可以存储键值对。负载因子是指哈希表中已经存储的元素占哈希表容量的比例。

在HashMap中,负载因子的作用是控制哈希表的填装程度。当哈希表中已经存储的元素数量达到负载因子乘以容量的时候,就会对哈希表进行扩容操作,在扩容期间会重新计算哈希值和重排原来的链表,这个过程是比较耗时的。因此,通过设置合适的负载因子,可以平衡哈希表的填装程度和扩容次数,从而提高HashMap的性能。

一般来说,当负载因子过大时,哈希表的填装程度会过高,导致哈希冲突的概率增加,从而会影响HashMap操作的效率。而当负载因子过小时,哈希表的使用率不高,会浪费空间。

HashMap默认的负载因子是0.75,这被认为是一个比较合理的默认值。在实际使用中,如果需要更高的性能,可以将负载因子设置得更小,但这会增加哈希表的大小。如果需要更少的内存占用,可以将负载因子设置得更大,但这可能会影响HashMap操作的效率

hashmap会缩容吗,怎么缩容的

HashMap并没有像扩容一样的缩容机制。在Java8版本之前的HashMap实现中,如果哈希表中的元素被删除导致哈希表中的元素个数变少,不会自动缩小哈希表的容量。因此,在元素被删除后,如果需要缩小HashMap的容量,需要手动调用HashMap的`trimToSize()`方法进行缩容。

Java 8版本开始,引入了一种新的哈希表实现,即链表长度达到一定阈值时会自动转换为红黑树,这种实现方式在删除元素时会进行特殊处理,可以动态地缩小哈希表的容量。这是因为当链表长度小于8时,HashMap会自动将树形结构转换回链表结构,从而使得哈希表的容量可以动态地缩小。 需要注意的是,虽然HashMap可以动态地缩小容量,但是缩小容量的代价非常高,因为需要重新计算所有元素的哈希值,并将它们重新散列到新的哈希表中。因此,在实际应用中,我们应该尽量避免频繁地进行哈希表容量的缩小操作,而应该根据实际情况选择合适数量的初始化容量和负载因子,以充分利用HashMap的性能优势。

TreeMap是一种基于红黑树实现的有序映射。它的核心思想是通过自平衡的平衡二叉搜索树来组织键值对。TreeMap中的键值对按照键的自然顺序或自定义的比较器顺序进行排序。下面是TreeMap的实现细节: 1. TreeMap内部使用了红黑树来实现,红黑树是一种自平衡的二叉搜索树,它可以保证插入、删除、查找等基本操作的时间复杂度均为O(log n)。 2. TreeMap中的节点内部包含了三个核心属性:key,value和color。其中,key和value分别表示键和值,color为节点的颜色,只能是红色或黑色。 3. 在插入新的键值对时,TreeMap会根据键的比较结果将其插入到红黑树中的合适位置上。如果键已存在,则会用新的值替换旧的值。 4. 在删除键值对时,TreeMap会根据键的比较结果找到相应的节点,然后按照红黑树的规则将其删除。如果被删除的节点有子节点,则需要进行必要的调整操作重新平衡红黑树。 5. 在遍历TreeMap时,Map会按照键的自然顺序或自定义的比较器顺序进行遍历。这个过程可以通过递归的方式实现。 6. 在TreeMap中,根据键查找与删除键值对的时间复杂度为O(log n)。同时,由于其基于红黑树的实现,TreeMap的查找、插入、删除操作的时间复杂度都可以保证为O(log n)。 总之,TreeMap是一种非常高效的有序映射,它使用红黑树实现,可以保证操作的时间复杂度均为O(log n),因此在需要高效地进行有序映射操作的场景中得到广泛应用。

hashmap的key value均可为null,key为null的时候对应的hash返回值为0

以下是联合索引的使用场景: 1. 多列过滤:如果查询语句中有多个列同时作为过滤条件,那么使用联合索引可以获得更好的查询性能。例如,假设有一个订单表,包含订单号、订单状态、订单日期等列,如果查询语句中同时包含订单状态和订单日期作为过滤条件,则可以创建一个联合索引来提高查询效率。 2. 多列排序:如果查询语句中包含多列排序条件,使用联合索引可以大大减少排序操作的时间。例如,如果有一个学生表,包含学号、姓名、成绩等列,如果查询语句需要按照成绩和学号进行排序,则可以创建一个联合索引。 3. 外键关联:如果一个表的外键引用了另一个表的主键,则可以在引用列和主键列上创建联合索引,可以提高查询外键关联的性能。 需要注意的是,在创建联合索引时需要注意索引列的顺序,因为索引列的顺序会影响查询的效率。通常情况下,选择筛选性高的列作为索引的前缀,可以减少索引的大小,加快查询速度。同时,如果查询语句中只包含联合索引的一部分列,那么该索引对查询不会产生作用,因此需要选择最常用的查询条件作为联合索引的前缀。

一张表可以建立多个唯一索引,每个唯一索引可以包含不同的列或列组合。唯一索引可以保证该列(列组合)的值是唯一的,避免重复数据的产生。如果某个列有多个可能的唯一组合,可以建立多个唯一索引来保证数据的唯一性。 例如,有一个用户表,包括用户ID、用户名、手机号码和邮箱等列,可以分别建立以用户ID、用户名、手机号码、邮箱为唯一索引的索引,保证每个列(列组合)的值都是唯一的。这样,即使有重复的数据插入到表中,唯一索引也会阻止插入操作并抛出错误信息。 需要注意的是,虽然多个唯一索引可以保证表中的数据唯一性,但过多的索引会影响数据库性能,增加了表的维护成本和查询优化的难度。因此,应该根据具体情况,选择建立合适数量和结构的索引来提高数据库的性能和可维护性。

Nacos主要用途有:1、服务注册与发现  帮助微服务自动注册并发现服务,实现微服务之间的调用。2、配置管理 为微服务应提供动态化配置管理,支持热更新和灰度发布 方便应用的配置管理

3、服务管理  提供服务健康检查、流量管理、负载均衡等服务治理功能 保持服务的高可用稳定

应用:将依赖引入到pom文件中  在应用配置文件中配置nacos信息 包括服务地址名称端口等

在应用程序中使用@EnableDiscoveryClient注解启用服务发现功能,并使用@Service注解将服务注册到nacos中

Mybatis的一对多映射怎么做????

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值