总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
《算法的乐趣》共有23个章节:
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
BookDao bookDao=new BookDao();
Book book=new Book();
book.setID(ID);
// 删除图书信息
bookDao.delBook(ID);
}
/**
- 修改图书信息
*/
public void changeBookInformation (JTextField textFieldISBN, JTextField textFieldName
,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
, JTextField textFieldBookCategory, JTextField textFieldBorrowerName
, JTextField textFieldBorrowerPhone, JTable table) throws Exception{
BookDao bookDao=new BookDao();
Book book=new Book();
int selRow = table.getSelectedRow();
int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
book.setID(ID);
book.setISBN(textFieldISBN.getText());
book.setBookName(textFieldName.getText());
book.setAuthor(textFieldAuthor.getText());
float price = Float.parseFloat(textFieldPrice.getText());
book.setPrice(price);
book.setPublishHouse(textFieldPublishedHouse.getText());
book.setBookCategory(textFieldBookCategory.getText());
book.setBorrowerName(textFieldBorrowerName.getText());
book.setBorrowerPhone(textFieldBorrowerPhone.getText());
//修改图书
bookDao.changeBook(book);
}
}
归还图书:
package pers.cyz.controller;
import java.util.List;
import javax.swing.JTable;
import pers.cyz.dao.BookDao;
import pers.cyz.model.Book;
/**
-
借还书行为控制类,包含 初始化借还书 管理窗体表格
-
以及归还图书
*/
public class BorrowAction {
BookDao borrowerDao;
/**
-
初始化借还书管理窗体表格
-
@return
-
results
*/
@SuppressWarnings(“rawtypes”)
public Object[][] initializTable(String[] columnNames) throws Exception{
borrowerDao = new BookDao();
List list = borrowerDao.borrowQuery();
Object[][] results = new Object[list.size()][columnNames.length];
for(int i = 0; i < list.size(); i++) {
Book book = (Book)list.get(i);
results[i][0] = book.getID();
results[i][1] = book.getBookName();
results[i][2] = book.getBorrowerName();
results[i][3] = book.getBorrowerPhone();
}
return results;
}
/**
- 归还图书
*/
public void BorrowBook (JTable table) throws Exception{
borrowerDao=new BookDao();
Book book=new Book();
int selRow = table.getSelectedRow();
int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
book.setID(ID);
book.setBorrowerName(null);
book.setBorrowerPhone(null);
// 归还图书
borrowerDao.returnBook(book);
}
}
连接数据库类
package pers.cyz.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
-
连接 数据库类,
-
包含一个对外提供获取数据库连接的方法
*/
public class DBUtil {
// 数据库连接路径
private static final String URL = “jdbc:mysql://127.0.0.1:3306/db_books?”
- “useUnicode = true & serverTimezone = GMT”
// MySQL在高版本需要指明是否进行SSL连接
- “& characterEncoding = utf8 & useSSL = false”;
private static final String NAME = “root”;
private static final String PASSWORD = “root”;
private static Connection conn = null;
// 静态代码块(将加载驱动、连接数据库放入静态块中)
static{
try {
// 加载驱动程序
Class.forName(“com.mysql.cj.jdbc.Driver”);
// 获取数据库的连接
conn = DriverManager.getConnection(URL, NAME, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 对外提供一个方法来获取数据库连接
public static Connection getConnection(){
return conn;
}
}
登录界面设置:
package pers.cyz.view;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import pers.cyz.dao.UserDao;
import pers.cyz.model.User;
import pers.cyz.util.BackgroundImage;
import pers.cyz.util.KeyListener;
import pers.cyz.util.LimitTextLength;
/**
-
登录 界面类
*/
@SuppressWarnings(“serial”)
public class Login extends JFrame {
private final JFrame frame = new JFrame(“新晨旭个人书屋”);
private final Container container = frame.getContentPane();
// 用户名框
private JTextField texFieldtUserName = new JTextField();
// 密码框
private JPasswordField textFieldPasswd = new JPasswordField();
// 重置按钮
private JButton buttonReset = new JButton();
// 登录按钮
private JButton buttonLogin = new JButton();
public Login() {
container.setLayout(null);
// 设置背景图片
new BackgroundImage(frame,container,“login.jpg”);
// 设置用户名框以及监听事件
setTextFieldUserName();
// 设置密码框以及监听事件
setPasswdField();
// 设置登录按钮以及添加监听事件
setButtonLogin();
// 设置重置按钮以及添加监听事件
setButtonReset();
container.add(texFieldtUserName);
container.add(textFieldPasswd);
container.add(buttonLogin);
container.add(buttonReset);
// 设置窗口大小、位置、可视、默认关闭方式等
frame.setVisible(true);
// 窗口不可调整大小
frame.setResizable(false);
frame.setSize(550, 388);
frame.setLocation(300,150);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
/**
- 设置重置按钮以及监听事件
*/
private void setButtonReset() {
buttonReset.setIcon(new ImageIcon(“res/button_reset.jpg”));
buttonReset.setBounds(310,280,90,30);
buttonReset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
texFieldtUserName.setText(“”);
textFieldPasswd.setText(“”);
}
});
}
/**
- 设置登录按钮以及监听事件
*/
private void setButtonLogin() {
buttonLogin.setIcon(new ImageIcon(“res/button_login.jpg”));
buttonLogin.setBounds(150,280,90,30);
buttonLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent paramActionEvent) {
// TODO Auto-generated method stub
String username = texFieldtUserName.getText();
String passwd = new String(textFieldPasswd.getPassword());
UserDao userDao = new UserDao();
try {
List userList = userDao.query();
for (User user : userList) {
if (user.getUser().equals(username) && user.getPasswd().equals(passwd)) {
frame.setVisible(false);
new MainFrame();
} else if(username.equals(“”) || passwd.equals(“”)) {
JOptionPane.showMessageDialog(null,“用户名或密码不能为空”,“错误”
,JOptionPane.PLAIN_MESSAGE);
} else {
JOptionPane.showMessageDialog(null,“用户名或密码错误”,“错误”
,JOptionPane.PLAIN_MESSAGE);
}
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
});
}
/**
- 设置密码框以及添加监听事件
*/
private void setPasswdField() {
// 限制用户输入长度
textFieldPasswd.setDocument(new LimitTextLength(8));
textFieldPasswd.setBounds(235,210,180,30);
// 键盘事件,如果按下回车则模拟鼠标点击登录按钮
new KeyListener(textFieldPasswd,buttonLogin);
}
/**
- 设置用户名框以及添加监听事件
*/
private void setTextFieldUserName() {
// 限制用户输入长度
texFieldtUserName.setDocument(new LimitTextLength(8));
texFieldtUserName.setBounds(235,145,180,30);
// 键盘事件,如果按下回车则模拟鼠标点击登录按钮
new KeyListener(texFieldtUserName,buttonLogin);
}
}
针对在大学阶段需要课程设计以及得给老师讲解的同学们:
´・ᴗ・
( '▿ ' ) 大家在给老师讲解的时候可以从MVC设计思想开始讲起,也是Java软件设计模式(体系结构)的一种,然后再细致讲解代码即可,比如数据库是如何进行连接的?(以往的博客我有发过步骤,很简单的。)数据库的连接步骤?遇到的困难有什么?怎么解决的?大家的具体分工是什么?等等......你一定可以通过课设的!加油!´・ᴗ・
(代码的重要部分均带有注释,不明白可以再仔细看看。)
(1)窗口显示思路:将图片标签放在窗体底层面板,然后将窗体转化为容器,将容器面板设为透明,背景图片就设置好了,之后就可以直接在该容器中添加组件即可。
(2)MVC设计思想:(关键)
这个系统的主体部分采用Java语言来书写,并结合MVC框架来进行项目的创建,并将所有两个或两个以上类需要用到的代码段全部封装到了公共类。MVC框架即模型—视图—控制器体系结构,使用这个结构可以将软件的业务逻辑部分与用户界面显示部分分离开来。Model包含核心功能与数据,View为用户显示信息,Controller用来处理用户输入。使用该框架的目的以及以优点有:
Controller接受输入,通常是从鼠标运动、按钮和键盘事件引起的输入。当用户通过一个View的Controller改变了Model,则当数据发生变化的时候,Model负责通知所有的View,告知它们数据已经改变,View则可以查询Model中的数据,以便发现到底是什么改变了,然后更新显示数据。
这种改变—-传播机制保证了用户界面和模型的一致性。具体表现在:
(1)模型:模型持有所有的数据 、状态和程序逻辑。模型独立于视图和控制器。
(2)视图:用来呈现模型 。视图通常直接从模型中取得它需要显示的状态与数据,对于相同的信息可以有多个不同的显示形式或视图。
(3)控制器: 位于视图和模型中间,负责接受用户的输入,将输入进行解析并反馈给模型 ,通常一个视图具有一个控制器。
使用该模式的好处有:
(1)一个模型提供不同的多个视图表现形式,也能够为一个模型创建新的视图而无须重写模型。一旦模型的数据发生变化,模型将通知有关的视图,每个视图相应地刷新自己。
(2)模型可复用。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。
(3)提高开发效率。在开发界面显示部分时,你仅仅需要考虑的是如何布局一个好的用户界面;开发模型时,你仅仅要考虑的是业务逻辑和数据维护,这样能使开发者专注于某一方面的开发,提高开发效率。
总的来说MVC设计模式可以方便开发人员分工协作,提高开发效率,增强程序的可维护性和拓展性而且还利用Controller将Model与View分离,降低它们之间的耦合度。因此,可以使用该模式较好的匹配这个图书管理系统。
----都看到这儿了,顺手点个赞吧!!!!
░░░░░░░░░░░█░█
░░░░░░░░░░░█░█
░░░░░░░░░░█░░█
░░░░░░░░░█░░░█
总结
机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。
对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。
你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:
请转发本文支持一下
░░░░░░░░░░█░░█
░░░░░░░░░█░░░█
总结
机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。
对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。
你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:
请转发本文支持一下
[外链图片转存中…(img-MJcCwxsl-1715483417377)]
[外链图片转存中…(img-glZvefnM-1715483417378)]