记java工作中的坑

1
使用json中

public static  <T> T  reSerializableJson(String jsonStr, TypeReference<T> type) {
        return JSONArray.parseObject(jsonStr, type);
    }

在这里插入图片描述
这里将默认使用HashMap, 如果我们的类字段使用ConcurrentHashMap的话,可能会出现奇奇怪怪的问题,譬如

ConcurrentHashMap的get(key)中key不能null,会报nullpointException
HashMap则不会
程序会表现运行异常,重启走json序列化反而正常的异像

2
有时候想随机获取list中的不重复元素,同时又指定了要获取的数量,这时候用list.get(new Random().nextInt(wannaLength))
担心拿到的是不是重复的,当然你也可以写代码去维护,比如再用个list去存已经取到的,然后每次获取用alreadyGetList去判断是否是重复的

wannaList = new ArrayList();
if(list.size() > wannaLent) {
wannaLength = list.size();
}
for(int i; i< wannaLength) {
	element = list.get(new Random().nextInt(list.size()));
	while(alreadyGetList.contains(element))  {
	//继续获取, 直到不存在
	element = list.get(new Random().nextInt(list.size()));
	}
}

改用如下方法: 将list进行shuffle 打乱

wannaList = new ArrayList();
if(list.size() > wannaLent) {
wannaLength = list.size();
}
Collections.shuffle(list);
for(int i; i< wannaLength) {
	element = list.get(i);
}

取整型数列中1 3 5 7 9 结尾的数字的和
int total = IntStream.range(0, source.length).filter(i -> i % 2 == 1).map(i -> source[i]).reduce(0, (x, y) -> x + y);

Arrays.asList(…) 返回的ArrayList是重写过后的ArrayList 其中元素只读不可改


public boolean test() {
// 做一堆操作
boolean a = false;
a = true && false;
return a;
}

public void test() {
boolean isDiff = true;
return isDiff || test();
}

test()永远不会执行

### Java 编程语言中常见的陷阱及解决方案 #### 并发编程中的常见陷阱 在并发编程中,Java 提供了许多工具来实现高效的任务调度和资源利用。然而,如果不小心处理,可能会引发一系列严重的问题。 1. **死锁 (Deadlock)** 当多个线程互相等待对方释放资源时会发生死锁。这种情况下,程序可能陷入无限期的阻塞状态[^1]。为了避免死锁,可以采用以下策略: - 尽量减少锁定范围,仅在必要时才加锁。 - 使用 `tryLock()` 方法代替传统的 `synchronized` 锁定机制,以便在线程无法获得锁时可以选择其他操作。 2. **竞态条件 (Race Condition)** 多个线程访问共享变量且至少有一个线程修改该变量时可能发生竞态条件。这可能导致不可预测的行为[^3]。解决方法包括: - 使用同步块 (`synchronized`) 或者更高层次的并发控制类(如 `ReentrantLock` 和 `AtomicInteger`)。 - 避免直接暴露可变对象的状态。 3. **内存可见性问题** 如果不正确地使用 volatile 关键字或者 synchronized 块,某些线程可能看不到另一个线程对共享数据所做的更改[^3]。可以通过以下方式改善: - 对于需要立即更新的数据字段,声明为 `volatile`。 - 利用原子类(如 `AtomicBoolean`, `AtomicLong`),它们内置了必要的屏障以确保一致性。 #### 异常处理中的常见陷阱 异常处理是构建稳定应用程序的重要组成部分,但在实践中容易犯一些典型错误。 1. **捕获所有异常** 不区分具体类型的异常而统一捕获所有的 Throwable 可能掩盖潜在的真实问题[^2]。推荐的做法如下: - 明确指定要捕捉的具体异常类别而非泛化的 Exception 类型。 - 录详细的日志信息并重新抛出未预期到的异常类型。 2. **忽略异常** 某些时候程序员倾向于简单地吞掉异常而不做任何反应,这样会使调试变得极其困难[^5]。应该始终妥善处置每一个被捕获的异常实例: - 至少打印堆栈跟踪消息至标准输出流或专用的日志文件里去。 - 考虑向调用方传递经过封装后的自定义业务逻辑层面上的新异常形式。 #### 容器化环境下的特殊注意事项 当运行基于 JVM 的服务处于 Docker/Kubernetes 这样的容器环境中时,还需要特别留意以下几个方面的隐患: 1. **资源分配不足** CPU、内存等硬件资源配置不合理会影响性能表现甚至造成 OOM(OutOfMemoryError)[^4]。因此需合理规划初始值与最大限制参数(-Xms,-Xmx),同时密切监视实际消耗情况调整设定值大小。 2. **网络延迟/分区容忍度差强人意** 很多分布式架构依赖远程过程调用来完成协作工作,在高负载场景下如果缺乏足够的超时设置则很容易因为单点失败拖垮整个系统链路[^4]。为此应实施断路器模式(Circuit Breaker Pattern)保护下游组件不受上游不稳定影响;另外也要定期演练故障恢复能力测试预案效果如何。 --- ```java // 示例代码展示如何安全地处理竞争条件 public class Counter { private int count; public void increment() { synchronized(this){ this.count++; } } public int getCount(){ synchronized(this){ return this.count; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值