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);//执行SQLint 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 来删除数据//执行SQLint 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;
}