JAVA学习小结
一.内部类
基础概念,用途和访问特点
什么是内部类:写在一个类中的另一个类称之为内部类;
内部类的用途:用于封装那些单独存在时没有意义,且是外部类的一部分的类(汽车发动机,人的心脏);提升代码的组织性,且更利于进行事件处理等操作。
访问特点
- 内部类可以访问外部类的所有变量(包括私有);
- 外部类访问内部类的成员时,必须创建对象。
内部类的分类及其相关知识
二.JDBC API
Connection:
语句:
Connection connection = DriverManager.getConnection(url, user, password);
作用:建立与数据库的连接。
参数:url
:数据库连接的URL。user
:数据库用户名。password
:数据库密码。
Statement:
语句:
Statement statement = connection.createStatement();
作用:创建用于执行静态SQL语句的对象。
PreparedStatement:
语句:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
作用:创建预编译的SQL语句对象。
参数:
sql
:待执行的SQL语句,可以包含占位符?
。
ResultSet:
语句:
ResultSet resultSet = statement.executeQuery(sql);
作用:执行SQL查询语句并返回结果集。
参数:
sql
:查询的SQL语句。
DriverManager:
语句:
Class.forName(driver);
作用:加载并注册数据库驱动程序。
参数:
driver
:数据库驱动程序的类名。
增删查改小练习
package com.demo;
import java.sql.*;
public class operation {
public static void add(int id, String name, int age, String gender) throws Exception{
//1.注册驱动
// Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.cj.jdbc.Driver");
// 修改部分结束
//2.获取连接
String url = "jdbc:mysql://localhost:3306/demo"; // 移除多余的空格
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//System.out.println(conn); //测试是否连接上mysql数据库
//3.定义sql语句
String sql = "insert into tb_demo(id, name, age, gender) values (?, ?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.setString(2, name);
pstmt.setInt(3, age);
pstmt.setString(4, gender);
//执行SQL
int count = pstmt.executeUpdate(); //影响行数
//处理结果
//System.out.println(count > 0);
//释放资源
pstmt.close();
conn.close();
}
public static void deleteById(int id) throws Exception{
//1.注册驱动
// Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.cj.jdbc.Driver");
// 修改部分结束
//2.获取连接
String url = "jdbc:mysql://localhost:3306/demo"; // 移除多余的空格
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//System.out.println(conn); //测试是否连接上mysql数据库
//3.定义sql语句
String sql = "delete from tb_demo where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id); // 根据 id 来删除数据
//执行SQL
int count = pstmt.executeUpdate(); //影响行数
//处理结果
//System.out.println(count > 0);
//释放资源
pstmt.close();
conn.close();
}
public static void finding() throws Exception {
//1.注册驱动
// Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.cj.jdbc.Driver");
// 修改部分结束
//2.获取连接
String url = "jdbc:mysql://localhost:3306/demo"; // 移除多余的空格
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//System.out.println(conn); //测试是否连接上mysql数据库
//3.定义sql语句
String sql = "select * from tb_demo";
PreparedStatement pstmt = conn.prepareStatement(sql);
//执行查询
ResultSet rs = pstmt.executeQuery();
//处理查询结果
while (rs.next()) {
// 获取查询结果的每一行数据
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String gender = rs.getString("gender");
// 打印数据
System.out.println("id: " + id + ", name: " + name + ", age: " + age + ", gender: " + gender);
}
//释放资源
rs.close();
pstmt.close();
conn.close();
}
public static void update(int id, String name, int age, String gender) throws Exception {
//1.注册驱动
// Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.cj.jdbc.Driver");
// 修改部分结束
//2.获取连接
String url = "jdbc:mysql://localhost:3306/demo"; // 移除多余的空格
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//System.out.println(conn); //测试是否连接上mysql数据库
//3.定义sql语句
String sql = "UPDATE tb_demo SET name = ?, age = ?, gender = ? WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name); // 设置新的名字
pstmt.setInt(2, age); // 设置新的年龄
pstmt.setString(3, gender); // 设置新的性别
pstmt.setInt(4, id); // 设置更新条件,假设根据 id 来更新数据
//执行更新操作
int count = pstmt.executeUpdate(); // 影响行数
//处理结果
//System.out.println(count > 0);
//释放资源
pstmt.close();
conn.close();
}
}
算法
一.离散化
相关知识【算法基础——第八讲】离散化_离散化算法-CSDN博客
关键代码(映射 + 排序去重)
//映射
int getidx(int x)
{
return lower_bound(X.begin(), X.end(), x) - X.begin() + 1;
}
//排序去重
sort(X.begin(), X.end());
X.erase(unique(X.begin(), X.end()), X.end());
二.树状数组
相关知识:树状数组(详细分析+应用),看不懂打死我!-CSDN博客
个人板子及理解
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long
const int N = 1e5 + 9;
ll a[N], t[N];
int n, q;
int lowbit(int x) {return x & (-x);} //找出与所有与该点相关的覆盖区间
void update(int k, ll x)
{
for(int i = k; i <= n; i += lowbit(i)) t[i] += x; //单点更新后随之更新覆盖区间
}
ll getsum(ll k)
{
ll res = 0;
for(int i = k; i > 0; i -= lowbit(i)) res += t[i];
return res;
}
int main ()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> q;
for(int i = 1; i <= n; ++ i) cin >> a[i];
for(int i = 1; i <= n; ++ i) update(i, a[i]);
while(q --)
{
int op; cin >> op;
if(op == 1)
{
ll k, x; cin >> k >> x;
update(k, x);
}
else
{
ll l, r; cin >> l >> r;
cout << getsum(r) - getsum(l - 1) << '\n'; //前缀和思想
}
}
return 0;
}