【3.14面试考点】jvm,网络原理,java,打印旋转数组,mysql

数据库

ALTER TABLE <表名> MODIFY <字段名> <数据类型>

http接口类型

1)get型接口
场景:get型接口用于获取信息,多用于查询数据,如列表查询功能,点击查询按钮就调用一个get接口,然后把信息返回出来

特点:1)请求数据量小,2)参数暴露于url地址中,故存在安全隐患

2)post型接口

说明:向指定资源位置提交数据(如提交表单、上传文件)来进行请求,post请求可能会导致新资源的建立

场景:如注册、上传、发帖等功能

特点:请求数据量大,安全性高

3)put型接口

说明:put请求用于向指定资源位置上传最新内容

场景:如用户在豆瓣网站修改对某本书的收藏、修改某篇笔记或修改评论

4)delete型接口

说明:请求服务器删除请求里url所标识的资源

场景:如用户在豆瓣网站取消对某本书的收藏、删除某篇笔记或删除评论

jvm组成

1、直接内存:线程共享,堆外内存,用于提高特定场景下的性能(重要程度:1.5星)
本地方法栈:线程私有,执行native方法时候使用的栈空间(重要程度:1星)
2、程序计数器:线程私有可以记录程序执行的位置(重要程度:1星)
3、堆:线程共享,(重要程度:5星)存放new的对象的实例,GC的战场,主要分为新生代、老年代两大块,其中新生代分为伊甸区、幸存者区,幸存者区又平均划分为From区和To区,这里内存不足会发生OutOfMemeryError
4、java栈:线程私有,(重要程度:5星)操作数栈(方法运行过程的临时数据)、局部变量表(保存声明的变量)、帧数据区(保存常量访问指针,异常处理表),这里内存不足会产生StackOverFlowError
5、方法区:线程共享,(重要程度:5星)存放类型、方法代码、静态成员、常量池

数组和链表

冒泡排序是哪个数据结构效率高?堆排序呢?
1 数组和链表简介
  在计算机中要对给定的数据集进行若干处理,首要任务是把数据集的一部分(当数据量非常大时,可能只能一部分一部分地读取数据到内存中来处理)或全部存储到内存中,然后再对内存中的数据进行各种处理。

例如,对于数据集 S{1,2,3,4,5,6},要求 S 中元素的和,首先要把数据存储到内存中,然后再将内存中的 数据相加。当内存空间中有足够大的连续空间时,可以把数据连续的存放在内存中,各种编程语言中的数组一般都是按这种 方式存储的(也可能有例外),如图 1(b);当内存中只有一些离散的可用空间时,想连续存储数据就非常困难了, 这时能想到的一种解决方式是移动内存中的数据,把离散的空间聚集成连续的一块大空间,如图 1(c)所示,这样做 当然也可以,但是这种情况因为可能要移动别人的数据,所以会存在一些困难,移动的过程中也有可能会把一些别人 的重要数据给丢失。另外一种,不影响别人的数据存储方式是把数据集中的数据分开离散地存储到这些不连续空间中, 如图(d)。这时为了能把数据集中的所有数据联系起来,需要在前一块数据的存储空间中记录下一块数据的地址,这样只要知道第一块内存空间的地址就能环环相扣地把数据集整体联系在一起了。C/C++中用指针实现的链表就是这种 存储形式。

由上可知,内存中的存储形式可以分为连续存储和离散存储两种。因此,数据的物理存储结构就有连续存储和离散存储两种,它们对应了我们通常所说的数组和链表

2 数组和链表的区别
 
数组是将元素在内存中连续存储的;

优点:因为数据是连续存储的,内存地址连续,所以在查找数据的时候效 率比较高;

缺点:在存储之前,我们需要申请一块连续的内存空间,并且在编译的时候就必须确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据两比较大的时候,有可能会出现越界的情况,数据比较小的时候,又有可能会浪费掉内存空间。在改变数据个数时,增加、插入、删除数据效率比较低链表是动态申请内存空间,不需要像数组需要提前申请好内存的大小,

链表只需在用的时候申请就可以,根据需要来动态申请或者删除内存空间,对于数据增加和删除以及插入比数组灵活。还有就是链表中数据在内存中可以在任意的位置,通过应用来关联数据(就是通过存在元素的指针来联系)。

3 链表和数组使用场景
数组应用场景:数据比较少;经常做的运算是按序号访问数据元素;数组更容易实现,任何高级语言都支持;构建的线性表较稳定。

链表应用场景:对线性表的长度或者规模难以估计;频繁做插入删除操作;构建动态性比较强的线性表。

哈希表

Hash冲突就是,不同的数据元素关键字K,计算出的哈希值相同,此时两个或多个数据,对应同一个存储地址,即产生冲突。

Hash冲突解决办法:
1、开放定址法
使用某种探测算法在散列表中寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到。就是即使key产生hash冲突,也不会形成链表,而是将所有元素都存入哈希表里。发生hash冲突时,就以当前地址为基准,进行再寻址的方法去寻址下一个地址,直到找到一个为空的地址为止。
2、再哈希法
这种方式是同时构造多个哈希函数,当产生冲突时,计算另一个哈希函数的值。
这种方法不易产生聚集,但增加了计算时间。
3、链地址法
使用链表来保存发生hash冲突的key,即不同的key有一样的hash值,将这些发生冲突的 value 组成一个单向链表(只有next指针,没有pre指针)
4、建立公共溢出区
将哈希表分为基本表和溢出表两部分,为所有发生hash冲突的关键字记录一个公共的溢出区来存放。在查找的时候,先与哈希表的相应位置比较,如果查找成功,则返回。否则去公共溢出区按顺序一一查找。在冲突数据少时性能好,冲突数据多的时候耗时

客户端和服务端的通信过程与接口的结构

这个对测试人员很重要
https://zhuanlan.zhihu.com/p/113208274

域名到IP地址的转换通过什么实现?转换对访问网站有什么好处?

域名到IP地址的转换通过什么实现

域名和IP地址之间并不能完全划上等号,域名可以是英文数字甚至是中文,但IP地址是用于计算机识别的,只能够用四组数字来表示。很多用户不太清楚域名和IP地址之间是如何在访问中被相互转换的,其实域名和IP的转换需要使用一种较多DNS的服务器,DNS服务器能够为用户提供域名解析的服务。

DNS服务器转换的方式主要是什么

域名解析服务器上安装有一个专门解析域名和IP地址的程序,这个程序就叫做DNS,一般情况下当用户使用域名来访问网站时,解析服务器会根据DNS程序中储存的表格来对用户的域名进行转换,然后用转换后的IP地址来访问目标服务器,很多用户关心域名到IP地址的转换通过什么实现怎么进行转换,这就是服务器解析域名和IP地址的主要方式。

域名到IP地址的转换通过什么实现?将域名转换为IP地址的服务器,一般被称为DNS服务器,这种服务器是每一个互联网用户访问网站时都需要使用到的,对于互联网而言这种服务器其实有着非常重要的作用。

旋转打印数组

class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0];
}
int rows = matrix.length, columns = matrix[0].length;
boolean[][] visited = new boolean[rows][columns];
int total = rows * columns;
int[] order = new int[total];
int row = 0, column = 0;
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int directionIndex = 0;
for (int i = 0; i < total; i++) {
order[i] = matrix[row][column];
visited[row][column] = true;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) {
directionIndex = (directionIndex + 1) % 4;
}
row += directions[directionIndex][0];
column += directions[directionIndex][1];
}
return order;
}
}

MySQL语句

DCL语言(对表的操作):DROP / CREATE / INSERT / ALTER

示例:
drop table if exists titles_test;
CREATE TABLE titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

insert into titles_test values
(‘1’, ‘10001’, ‘Senior Engineer’, ‘1986-06-26’, ‘9999-01-01’),

[编程题]删除emp_no重复的记录,只保留最小的id对应的记录。

USE test_db;
# 注意这里的id是表的主键,因此不会重复
# 第一步:找出所有带重复字符中并且是最小id的记录
/*
SELECT MIN(id) FROM titles_test
GROUP BY emp_no
HAVING COUNT(id) >1
*/

# 第二步:删除所有不在第一步里面的记录
DELETE FROM titles_test
WHERE id NOT IN(
	SELECT min_id FROM 
	(SELECT MIN(id) min_id 
	FROM titles_test
	GROUP BY emp_no)AS a
)

# 如果直接按照select的结果去删除就会报错:You can't specify target table 'titles_test' for update in FROM clause
# 下面这样是不对的
/*
DELETE FROM titles_test
WHERE id NOT IN( 
	SELECT MIN(id) min_id 
	FROM titles_test
	GROUP BY emp_no
)
*/

查询所有学生的学号、姓名、选课数、总成绩

建表


CREATE TABLE `Student`(
`s_id` VARCHAR(20),
`s_name` VARCHAR(20) NOT NULL DEFAULT '',
`s_birth` VARCHAR(20) NOT NULL DEFAULT '',
`s_sex` VARCHAR(10) NOT NULL DEFAULT '',
PRIMARY KEY(`s_id`)
);
--课程表
CREATE TABLE `Course`(
`c_id` VARCHAR(20),
`c_name` VARCHAR(20) NOT NULL DEFAULT '',
`t_id` VARCHAR(20) NOT NULL,
PRIMARY KEY(`c_id`)
);
--教师表
CREATE TABLE `Teacher`(
`t_id` VARCHAR(20),
`t_name` VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY(`t_id`)
);
--成绩表
CREATE TABLE `Score`(
`s_id` VARCHAR(20),
`c_id` VARCHAR(20),
`s_score` INT(3),
PRIMARY KEY(`s_id`,`c_id`)
);
--插入学生表测试数据
INSERT INTO Student VALUES('01' , '赵雷' , '1990-01-01' , '男');
INSERT INTO Student VALUES('02' , '钱电' , '1990-12-21' , '男');
INSERT INTO Student VALUES('03' , '孙风' , '1990-05-20' , '男');
INSERT INTO Student VALUES('04' , '李云' , '1990-08-06' , '男');
INSERT INTO Student VALUES('05' , '周梅' , '1991-12-01' , '女');
INSERT INTO Student VALUES('06' , '吴兰' , '1992-03-01' , '女');
INSERT INTO Student VALUES('07' , '郑竹' , '1989-07-01' , '女');
INSERT INTO Student VALUES('08' , '王菊' , '1990-01-20' , '女');
--课程表测试数据
INSERT INTO Course VALUES('01' , '语文' , '02');
INSERT INTO Course VALUES('02' , '数学' , '01');
INSERT INTO Course VALUES('03' , '英语' , '03');

--教师表测试数据
INSERT INTO Teacher VALUES('01' , '张三');
INSERT INTO Teacher VALUES('02' , '李四');
INSERT INTO Teacher VALUES('03' , '王五');

--成绩表测试数据
INSERT INTO Score VALUES('01' , '01' , 80);
INSERT INTO Score VALUES('01' , '02' , 90);
INSERT INTO Score VALUES('01' , '03' , 99);
INSERT INTO Score VALUES('02' , '01' , 70);
INSERT INTO Score VALUES('02' , '02' , 60);
INSERT INTO Score VALUES('02' , '03' , 80);
INSERT INTO Score VALUES('03' , '01' , 80);
INSERT INTO Score VALUES('03' , '02' , 80);
INSERT INTO Score VALUES('03' , '03' , 80);
INSERT INTO Score VALUES('04' , '01' , 50);
INSERT INTO Score VALUES('04' , '02' , 30);
INSERT INTO Score VALUES('04' , '03' , 20);
INSERT INTO Score VALUES('05' , '01' , 76);
INSERT INTO Score VALUES('05' , '02' , 87);
INSERT INTO Score VALUES('06' , '01' , 31);
INSERT INTO Score VALUES('06' , '03' , 34);
INSERT INTO Score VALUES('07' , '02' , 89);
INSERT INTO Score VALUES('07' , '03' , 98);

解法,利用join连接两个表
#查询所有学生的学号、姓名、选课数、总成绩
SELECT a.s_id,a.s_name,COUNT(b.s_id),SUM(b.s_score)
FROM student a
JOIN score b
ON a.s_id=b.s_id
GROUP BY a.s_id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值