哈希
1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案
暴力 or HashMap
HashMap<Integer,Integer> k 是 值, v 是数组的下标
哈希查找的时间复杂度为 O(1),所以可以利用 HashMap降低时间复杂度
遍历当前数组 , 判断是否存在target-nums[i] 的 key 值
由于不能返回相同的坐标,因此必须先 判断,再 put
123456789public static int[] twoSum(int[]nums,int target){ Map<Integer,Integer> map=new HashMap<>(); for(int i=0;i<nums.length;i++){ map.put(nums[i],i); if(map.containsKey(target-nums[i])) return new int[]{i,map.get(target-nums[i])}; } return null;}
2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题目的大概意思就是链表的val 都是逆序的, 并且最后返回的链表也要是逆序的
image-20220725102723575
暴力解法
先遍历链表 ,获取val ,用String 存储
然后通过将String 转换成数字相加,然后再利用split方法,得到res 的每个位数的值
—–需要注意的是相加的过程中 , 用int , long 都会导致溢出,最后使用BitInteger, 有一个测试用例的长度 有30+
得到每一位的值之后在创建新的链表返回即可;
image-20220725103034375
1234567891 ...
琐碎知识点
1、Java 中浮点数的精度丢失问题以及解决方案
在 Java 中写入new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1,但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625
Java 的浮点数只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal 类来进行精确计算.
使用步骤:
用 float 或者 double 变量构建 BigDecimal 对象。通常使用 BigDecimal 的构造方法或者静态方法的 valueOf() 方法把基本类型的变量构建成 BigDecimal 对象。
通过调用 BigDecimal 的加,减,乘,除等相应的方法进行算术运算。
把 BigDecimal 对象转换成 float,double,int 等类型。
BigDecimal 类 的构造函数:
1234BigDecimal(int var) //创建一个具有参数所指定整数值的对象。BigDecimal(double var) //创建一个具有参数所指定双精度值的对象。BigDecimal(long var) //创建一个具有参数所指定长整数值的对象。BigDecimal(String var) //创建一个具有参数所指定以字符串表示的数值的对象。
BigDecimal 类的加,减,乘,除等相应的方法:
1234BigDecimal add(BigDecimal augend) //加法运算BigDecimal subtract(BigDecimal subtrahend) //减法运算BigDecimal multiply(BigDecimal multiplicand) //乘法运算BigDecimal divide(BigDecimal divisor) //除法运算
1234567891011121314151617181920@Testvoid testDouble() { double d7 = 303.1; double d8 = 1000.0; BigDecimal b7 = new BigDecimal(Double.toString(d7)); Bi ...
mybatis(3)特殊SQL的执行&&自定义resultMap
7、特殊SQL的执行
模糊查询(追加%的方式)
查询返回结果集的处理(结果集返回)
特殊字符处理
获取自增主键
**总览 **
SpecialSqlMapper.java
123456789101112131415161718public interface SpecialSqlMapper { // 模糊查询 List<User> getUserByLike(@Param("ambiguous") String ambiguous); void deleteMoreUser(@Param("ids") String ids);// 单个字面量类型 的形参 建议加上 @Param("tableName") /** * 动态设置表名 * @param tableName * @return */ List<User> getUserList(@Param("tableName")String tableName);//添加用户的信息 并获取自增的主键 void insertUser(User user);}
SpecialSqlMapper.xml
12345678910111213141516171819202122232425262728293031323334<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="pers.dhx_.mapper.SpecialSqlMapper"><!-- List<User> getUserByLike(@Param("ambiguous") String ambiguous);--> <select id="getUserByLike" resultType="User"> <!-- select *from ...
java中当给一个对象赋值为null时发生了什么?
例如:
12String[] arr = new String[10];arr=null;
对于没有被任何引用指向的对象,垃圾回收器可以回收此对象。
java中对象引用放在栈中,对象的实例放于堆中,一个对象要是只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向。
而null对象在堆中会被java的垃圾回收机制回收
在Java中,null值表示引用不指向任何对象。运行过程中系统发现使用了这样一个引用时,可以立即停止进一步的访问,不会给系统带来任何危险。
一、null是代表不确定的对象
Java中,null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。
比如:int a = null;是错误的。Ojbect o = null是正确的。
Java中,变量的适用都遵循一个原则,先定义,并且初始化后,才可以使用。我们不能int a后,不给a指定值,就去打印a的值。这条对对于引用类型变量也是适用的。
有时候,我们定义一个引用类型变量,在刚开始的时候,无法给出一个确定的值,但是不指定值,程序可能会在try语句块中初始化值。这时候,我们下面使用变量的时候就会报错。这时候,可以先给变量指定一个null值,问题就解决了。例如:
1234567Connection conn = null;try { conn = DriverManager.getConnection("url", "user", "password");} catch (SQLException e) { e.printStackTrace();}String catalog = conn.getCatalog();
如果刚开始的时候不指定conn = null,则最后一句就会报错。
二、null本身不是对象,也不是Objcet的实例
null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。
可以做一个简单的例子:
123456//null是对象吗? 属于Object类型吗?if (null instanceof java.lang.Object) { System.out.println("null属于java.lang.Objec ...
mybatis(2)基本操作--CRUD
4、MyBatis的增删改查
4.1、新增
1234<!--int insertUser();--><insert id="insertUser">insert into t_user values(null,'admin','123456',23,'男')</insert>
4.2、删除
1234<!--int deleteUser();--><delete id="deleteUser">delete from t_user where id = 7</delete>
4.3、修改
12345<!--int updateUser();--><update id="updateUser">update t_user set username='ybc',password='123' where id = 6</update><!--User getUserById();-->
4.4、查询一个实体类对象
1234<select id="getUserById" resultType="com.atguigu.mybatis.bean.User">select * from t_user where id = 2</select><!--List<User> getUserList();-->
4.5、查询list集合
123<select id="getUserList" resultType="com.atguigu.mybatis.bean.User">select * from t_user</select>
测试
mapper接口中的方法:
12345678910111213141516171819202122232425// @Insert(value = "insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')") int insertUser(User user); void updateUser(User user); void deleteUse ...
mybatis(1)环境搭建&&配置文件
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.2、MyBatis特性
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old JavaObjects,普通的Java对象)映射成数据库中的记录
MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架
1.3、MyBatis下载
MyBatis下载地址:https://github.com/mybatis/mybatis-3
1.4、和其它持久化层技术对比
JDBC
SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
代码冗长,开发效率低
Hibernate 和 JPA
操作简便,开发效率高
程序中的长难复杂 SQL 需要绕过框架
内部自动生产的 SQL,不容易做特殊优化
基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
反射操作太多,导致数据库性能下降
MyBatis
轻量级,性能出色
SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
开发效率稍逊于HIbernate,但是完全能够接受
2、搭建MyBatis
2.1、开发环境
IDE:idea 2021.3
构建工具:maven 3.8.6
MySQL版本:MySQL 8
MyBatis版本:MyBatis 3.5.10
MySQL不同版本的注意事项
1、驱动类d ...
Spring5新特性
Spring5框架新特性
1、版本
整个Spring5框架的代码基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除
2、日志
Spring 5.0框架自带了通用的日志封装
(1)Spring5已经移除Log4jConfigListener,官方建议使用Log4j2
(2)Spring5框架整合Log4j2
第一步
引入jar包
第二步 创建log4j2.xml配置文件
1234567891011121314151617181920<?xml version="1.0" encoding="UTF-8"?><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,可以看到log4j2内部各种详细输出--><configuration status="INFO"> <!--先定义所有的appender--> <appenders> <!--输出日志信息到控制台--> <console name="Console" target="SYSTEM_OUT"> <!--控制日志输出的格式--> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </console> </appenders> <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--> <!--root:用于指定项目的根日志,如果没有单独指定Logger,则会使用root作为默认的日志输出--> <loggers> <root level=" ...
Spring基于XML实现事务管理
Spring基于XML实现事务管理
Spring 声明式事务管理是通过 AOP 实现的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建(或加入)一个事务,在执行完目标方法后,根据执行情况提交或者回滚事务。
声明式事务最大的优点就是对业务代码的侵入性低,可以将业务代码和事务管理代码很好地进行解耦。
Spring 实现声明式事务管理主要有 2 种方式:
基于 XML 方式的声明式事务管理。
通过 Annotation 注解方式的事务管理。
下面介绍如何通过 XML 的方式实现声明式事务管理,步骤如下。
1. 引入 tx 命名空间
Spring 提供了一个 tx 命名空间,借助它可以极大地简化 Spring 中的声明式事务的配置。
想要使用 tx 命名空间,第一步就是要在 XML 配置文件中添加 tx 命名空间的约束。
1234567891011121314<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-conte ...
Spring事务
Spring事务(Transaction)
事务(Transaction)是基于关系型数据库(RDBMS)的企业应用的重要组成部分。在软件开发领域,事务扮演者十分重要的角色,用来确保应用程序数据的完整性和一致性。
事务具有 4 个特性:原子性、一致性、隔离性和持久性,简称为 ACID 特性。
原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的动作要么都做要么都不做。
一致性(Consistency):事务必须保证数据库从一个一致性状态变到另一个一致性状态,一致性和原子性是密切相关的。
隔离性(Isolation):一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务是隔离的,并发执行的各个事务之间不能互相打扰。
持久性(Durability):持久性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变就是永久性的,后面的其它操作和故障都不应该对其有任何影响。
事务允许我们将几个或一组操作组合成一个要么全部成功、要么全部失败的工作单元。如果事务中的所有的操作都执行成功,那自然万事大吉。但如果事务中的任何一个操作失败,那么事务中所有的操作都会被回滚,已经执行成功操作也会被完全清除干净,就好像什么事都没有发生一样。
在现实世界中,最常见的与事务相关的例子可能就是银行转账了。假设我们需要将 1000 元从 A 账户中转到 B 账户中,这个转账操作共涉及了以下两个操作。
从 A 账户中扣除 1000 元;
往 B 账户中存入 1000 元。
如果 A 账户成功地扣除了 1000 元,但向 B 账户存入时失败的话,那么我们将凭空损失 1000 元;如果 A 账户扣款时失败,但却成功地向 B 账户存入 1000 元的话,我们的账户就凭空多出了 1000 元,那么银行就会遭受损失。因此我们必须保证事务中的所有操作要么全部成功,要么全部失败,理解了这一点,我们也就抓住了事务的核心。
作为一款优秀的开源框架和应用平台,Spring 也对事务提供了很好的支持。Spring 借助 IoC 容器强大的配置能力,为事务提供了丰富的功能支持。
场景引入 :银行转账
如果中间出现了异常,就会导致上面的执行了,但是下面的没有执行
方法: 引入事务, 如果中间出现了异常,就进行事务回滚
使用@Transactional
U ...
Spring JdbcTemplate
JdbcTemplate
在spring中使用JdbcTemplate进行数据库管理操作
在JdbcTemplate中执行SQL语句的方法大致分为3类:
execute:可以执行所有SQL语句,一般用于执行DDL语句。
update:用于执行INSERT、UPDATE、DELETE等DML语句。
query....:用于DQL数据查询语句。
JdbcTemplate概念及使用
a)Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
b)引入相关 jar 包
c)在 spring 配置文件配置数据库连接池
12345678<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="jdbc:mysql:///test" /> <property name="username" value="root" /> <property name="password" value="qwer" /> <property name="driverClassName" value="com.mysql.jdbc.Driver" /></bean>
d)配置 JdbcTemplate 对象,注入 DataSource
123456<!-- JdbcTemplate 对象 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!--注入 dataSource--> <property name="dataSource" ref="dataSource"></property><!--set方式注入--></bean>
e)创建 service 类,创建 dao 类,在 dao 注入 jdbcTemplate 对象
12<!-- 组件扫描 --><context:component ...














