- JAVA58
- 面试50
- SPRINGBOOT29
- SPRING25
- K8S23
- DESIGN PATTERN14
- 设计模式14
- REACT10
- 前端10
- SPARK10
- 大数据8
- DOCKER7
- 分布式7
- DDD6
- 架构设计6
- MYBATIS5
- KAFKA4
- SPRINGMVC4
- MYSQL4
- LINUX3
- FLINK3
- ORM3
- REDIS3
- MAVEN2
- MVC2
- 云原生2
- project2
- ALGORITHM2
- PROBLEM2
- JVM2
- Spring1
- SpringFrameWork1
- ABOUT1
- 算法1
- HBASE1
- DRUID1
- 缓存1
实例代码
import java.util.ArrayList;
import java.util.Random;
/**
* className: TestOom
* description:
* author: MrR
* date: 2024/11/27 12:29
* version: 1.0
*/
public class TestOom {
private static ArrayList<User> userLists = new ArrayList<>();
public static void main(String[] args) throws InterruptedException {
String []sexList = new String[]{"男","女"};
for(int i=0;i<500;i++){
String name = "user_"+String.valueOf(i);
int age = i;
String info = "info_"+String.valueOf(i);
String sex = sexList[new Random().nextBoolean()?1:0];
User user = new User(name, age, info, sex);
userLists.add(user);
}
Thread.currentThread().join();
}
}
class User {
private String name;
private int age;
private String info;
private String sex;
public User(String name, int age, String info, String sex) {
this.name = name;
this.age = age;
this.info = info;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
工具说明
- jinfo:可以输出并修改运行时的java 进程的opts。
- jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
- jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
- jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量)。
JPS
Java版的ps命令,查看java进程及其相关的信息,如果你想找到一个java进程的pid,那可以用jps命令替代linux中的ps命令了,简单而方便。
幂等性介绍
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用;比如说支付场景,用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。
再比如在金融业务中,如果两个机构发出交易动作,这个时候会向数据库中插入一条成交记录,如果此时因为网络问题或者用户多次点击操作,会向数据库中插入两条成交记录,因此不符合幂等性设计。
为什么需要幂等性设计
一、MyBatis
1、MyBatis简介
1.1、MyBatis历史
MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。
iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
1、@SpringBoot注解
我们可以把 @SpringBootApplication
看作是 @Configuration
、@EnableAutoConfiguration
、@ComponentScan
注解的集合。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}
ioc中主要是容器对对象的管理,主要通过注解和xml文件方式进行装配。第三方的jar包通常不能使用注解的方式装配,因为里面大多是class文件,不能修改源码,所以通常使用xml文件的方式装配。 自己写的类可以使用注解+扫描的方式管理。
3.1、场景模拟
3.1.1、声明接口
声明计算器接口Calculator,包含加减乘除的抽象方法
public interface Calculator {
int add(int i, int j);
int sub(int i, int j);
int mul(int i, int j);
int div(int i, int j);
}
4.1、JdbcTemplate
4.1.1、简介
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
4.1.2、准备工作
①加入依赖
<dependencies>
<!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!-- Spring 持久化层支持jar包 -->
<!-- Spring 在执行持久化层操作、与持久化层技术进行整合过程中,需要使用orm、jdbc、tx三个jar包 -->
<!-- 导入 orm 包就可以通过 Maven 的依赖传递性把其他两个也导入 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.1</version>
</dependency>
<!-- Spring 测试相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.1</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
</dependencies>
- 14. Java集合手册(基础)
- 14.1. 什么是Java的集合?使用集合有什么好处?
- 14.2. 常用的集合类以及它们的特点?
- 14.3. List
- 14.3.1. ArrayList、LinkedList、Vector 各自的特点以及优缺点?
- 14.3.2. ArrayList 了解吗?
- 14.3.3. ArrayList 的扩容机制?
- 14.3.4. ArrayList为什么线程不安全还使用他呢?
- 14.3.5. ArrayList的底层实现是数组,添加数据的话,会有问题吗?
- 14.3.6. ArrayList在增删的时候是怎么做的么?主要说一下他为啥慢。
- 14.3.7. ArrayList插入删除一定慢么?
- 14.3.8. 怎么在遍历 ArrayList 时移除一个元素?
- 14.3.9. ArrayList 和 Vector 的区别/异同?
- 14.3.10. ArrayList 和 LinkedList 的区别/异同?
- 14.3.11. ArryList 是线程不安全的?为什么?
- 14.3.12. 如何解决 ArrayList 线程不安全的问题?
- 14.4. CopyOnWriteArrayList
- 14.5. Map
- 14.5.1. HashMap的底层实现原理?
- 14.5.2. 使用的hash算法?
- 14.5.3. HashMap的扩容方式?负载因子是多少?为什是这么多?
- 14.5.4. HashMap 容量的长度为什么总是2的幂次方?
- 14.5.5. 扩容过程?
- 14.5.6. 知道HashMap 扩容时候的死循环问题吗?
- 14.5.7. jdk1.7版hashmap在多线程环境下的死循环问题介绍一下?
- 14.5.8. 如何解决 HashMap 线程不安全的问题?
- 14.5.9. put方法流程?
- 14.5.10. 红黑树的特点?
- 14.5.11. 为什么使用红黑树而不使用AVL树?
- 14.5.12. hashmap线程不安全的表现有哪些?
- 14.5.13. 在解决 hash 冲突的时候,为什么选择先用链表,再转红黑树?
- 14.5.14. HashMap默认加载因子是多少?为什么是 0.75?
- 14.5.15. 一般用什么作为HashMap的key?
- 14.5.16. HashMap为什么线程不安全?
- 14.5.17. HashMap和HashTable的区别?
- 14.5.18. LinkedHashMap底层原理?
- 14.5.19. ConcurrentHashMap能完全替代Hashtable吗?
- 14.6. Hashtable的特点介绍一下?
- 14.7. 讲一下TreeMap?
- 14.8. Set
- 14.9. HashSet底层原理?
- 14.10. HashMap(jdk1.8)
- 14.10.1. Hashmap特点
- 14.10.2. 解决hash冲突的办法有哪些?HashMap用的哪种?
- 14.10.3. 为什么要在数组长度大于64之后,链表才会进化为红黑树
- 14.10.4. 哈希表底层采用何种算法计算hash值?还有哪些算法可以计算出hash值?
- 14.10.5. 当两个对象的hashCode相等时会怎样
- 14.10.6. 何时发生哈希碰撞和什么是哈希碰撞,如何解决哈希碰撞?
- 14.10.7. HashMap的put方法流程
- 14.10.8. HashMap的扩容方式
- 14.10.9. 一般用什么作为HashMap的key?
- 14.10.10. 为什么Map桶中节点个数超过8才转为红黑树?
- 14.10.11. HashMap为什么线程不安全?
- 14.10.12. get流程
- 14.11. Hashtable
- 14.12. ConcurrentHashMap
- 14.13. 迭代器 (Iterator )
- 14.14. 讲一下ArrayDeque?
- 14.15. 哪些集合类是线程安全的?哪些不安全?
- 14.16. 并发容器
- 14.17. 不同集合容量与扩容系数?
- 14.18. java8的ConcurrentHashMap为何放弃分段锁?
- Java集合手册(精简版)
- 常用的集合类有哪些
- 为什么集合类没有实现Cloneable和Serializable接口?
- List,Set,Map三者的区别?
- 常用集合框架底层数据结构
- 哪些集合类是线程安全的?
- 迭代器 Iterator 是什么
- Iterator和ListIterator的区别是什么?
- Java集合的快速失败机制 “fail-fast”和安全失败机制“failsafe”是什么?
- 如何边遍历边移除 Collection 中的元素?
- Array 和 ArrayList 有何区别?
- comparable 和 comparator的区别?
- 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
- Collection 和 Collections 有什么区别?
- List集合
- Set集合
- Map集合
- HashMap的工作原理
- HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底层实现
- HashMap 的长度为什么是2的幂次方
- HashMap的put方法的具体流程?
- HashMap的扩容操作是怎么实现的?
- HashMap默认加载因子为什么选择0.75?
- 为什么要将链表中转红黑树的阈值设为8?为什么不一开始直接使用红黑树?
- HashMap是怎么解决哈希冲突的?
- HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标?
- 能否使用任何类作为 Map 的 key?
- 为什么HashMap中String、Integer这样的包装类适合作为Key?
- 如果使用Object作为HashMap的Key,应该怎么办呢?
- HashMap 多线程导致死循环问题
- ConcurrentHashMap 底层具体实现知道吗?
- HashTable的底层实现知道吗?
- HashMap和Hashtable有什么区别?
- HashMap、ConcurrentHashMap及Hashtable 的区别
- 集合的常用方法
- Collection常用方法
- List特有方法
- LinkedList特有方法
- Map
- Stack
- Queue