最后
看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。
注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友
互联网工程师必备的面试1000题
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
用户这一端,我们 以 小红 的窗口为例展示:
可以看到“系统消息”,说明这个功能也已经实现。
用户退出之后,服务器端显示:
同时,清屏、保存、退出等基础功能也已经实现,这里不再展示了哈~ ~
项目的界面展示到此结束,不再赘述了。
Login.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
/**
- 聊天系统登录程序
*/
public class Login extends JFrame implements ActionListener {
private static final long serialVersionUID = -8965773902056088264L;
private JPanel pnlLogin;
private JButton btnLogin, btnRegister, btnExit;
private JLabel lblServer, lblUserName, lblPassword, lblLogo;
private JTextField txtUserName, txtServer;
private JPasswordField pwdPassword;
private String strServerIp;
// 用于将窗口定位
private Dimension scrnsize;
private Toolkit toolkit = Toolkit.getDefaultToolkit();
/**
- 构造登陆窗体
*/
public Login() {
super(“登录聊天室”);
pnlLogin = new JPanel();
this.getContentPane().add(pnlLogin);
lblServer = new JLabel(“服务器:”);
lblUserName = new JLabel(“用户名:”);
lblPassword = new JLabel(“口 令:”);
txtServer = new JTextField(20);
txtServer.setText(“127.0.0.1”);
txtUserName = new JTextField(20);
pwdPassword = new JPasswordField(20);
btnLogin = new JButton(“登录”);
btnLogin.setToolTipText(“登录到服务器”);
btnLogin.setMnemonic(‘L’);
btnRegister = new JButton(“注册”);
btnRegister.setToolTipText(“注册新用户”);
btnRegister.setMnemonic(‘R’);
btnExit = new JButton(“退出”);
btnExit.setToolTipText(“退出系统”);
btnExit.setMnemonic(‘X’);
/***********************************************************************
-
该布局采用手动布局 setBounds设置组件位置 * setFont设置字体、字型、字号 * setForeground设置文字的颜色 *
-
setBackground设置背景色 * setOpaque将背景设置为透明
*/
pnlLogin.setLayout(null); // 组件用手动布局
pnlLogin.setBackground(new Color(52, 130, 203));
lblServer.setBounds(50, 100, 100, 30);
txtServer.setBounds(150, 100, 120, 25);
lblUserName.setBounds(50, 130, 100, 30);
txtUserName.setBounds(150, 130, 120, 25);
lblPassword.setBounds(50, 160, 100, 30);
pwdPassword.setBounds(150, 160, 120, 25);
btnLogin.setBounds(50, 200, 80, 25);
btnRegister.setBounds(130, 200, 80, 25);
btnExit.setBounds(210, 200, 80, 25);
Font fontstr = new Font(“宋体”, Font.PLAIN, 12);
lblServer.setFont(fontstr);
txtServer.setFont(fontstr);
lblUserName.setFont(fontstr);
txtUserName.setFont(fontstr);
lblPassword.setFont(fontstr);
pwdPassword.setFont(fontstr);
btnLogin.setFont(fontstr);
btnRegister.setFont(fontstr);
btnExit.setFont(fontstr);
lblUserName.setForeground(Color.BLACK);
lblPassword.setForeground(Color.BLACK);
btnLogin.setBackground(Color.ORANGE);
btnRegister.setBackground(Color.ORANGE);
btnExit.setBackground(Color.ORANGE);
pnlLogin.add(lblServer);
pnlLogin.add(txtServer);
pnlLogin.add(lblUserName);
pnlLogin.add(txtUserName);
pnlLogin.add(lblPassword);
pnlLogin.add(pwdPassword);
pnlLogin.add(btnLogin);
pnlLogin.add(btnRegister);
pnlLogin.add(btnExit);
// 设置背景图片
Icon logo1 = new ImageIcon(“images\loginlogo.jpg”);
lblLogo = new JLabel(logo1);
lblLogo.setBounds(0, 0, 340, 66);
pnlLogin.add(lblLogo);
// 设置登录窗口
setResizable(false);
setSize(340, 260);
setVisible(true);
scrnsize = toolkit.getScreenSize();
setLocation(scrnsize.width / 2 - this.getWidth() / 2, scrnsize.height
/ 2 - this.getHeight() / 2);
Image img = toolkit.getImage(“images\appico.jpg”);
setIconImage(img);
// 三个按钮注册监听
btnLogin.addActionListener(this);
btnRegister.addActionListener(this);
btnExit.addActionListener(this);
} // 构造方法结束
/**
- 按钮监听响应
*/
@SuppressWarnings({ “deprecation”, “static-access” })
public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource();
if (source.equals(btnLogin)) {
// 判断用户名和密码是否为空
if (txtUserName.getText().equals(“”)
|| pwdPassword.getText().equals(“”)) {
JOptionPane op1 = new JOptionPane();
op1.showMessageDialog(null, “用户名或密码不能为空”);
} else {
strServerIp = txtServer.getText();
login();
}
}
if (source.equals(btnRegister)) {
strServerIp = txtServer.getText();
this.dispose();
new Register(strServerIp);
}
if (source == btnExit) {
System.exit(0);
}
} // actionPerformed()结束
/**
- 登录事件响应方法
*/
@SuppressWarnings(“deprecation”)
public void login() {
// 接受客户的详细资料
Customer data = new Customer();
data.custName = txtUserName.getText();
data.custPassword = pwdPassword.getText();
try {
// 连接到服务器
Socket toServer;
toServer = new Socket(strServerIp, 1001);
ObjectOutputStream streamToServer = new ObjectOutputStream(toServer
.getOutputStream());
// 写客户详细资料到服务器socket
streamToServer.writeObject((Customer) data);
// 读来自服务器socket的登录状态
BufferedReader fromServer = new BufferedReader(
new InputStreamReader(toServer.getInputStream()));
String status = fromServer.readLine();
写在最后
还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…
ngoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存**,Hadoop,Spark,Storm,YARN,机器学习,云计算…
[外链图片转存中…(img-8uhmF5jZ-1715483379931)]