2023年SHEIN的JAVA后端实习笔试题

发布时间 2023-04-25 10:46:59作者: 酷i

2023年SHEIN笔试题目:
10道单选,5道多选,一道算法,一道SQL
(单选)
1、下列关于线性链表的叙述中,正确的是:
进行插入和删除时,不需要移动链表中的元素。
2、关于以下程序代码的说明正确的是:
class HasStatic{
private static int x = 100;
public static void main(String args[ ]){
HasStatic hs1 = new HasStatic();
hs1.x++;
HasStatic hs2 = new HasStatic();
hs2.x++;
hs1=new HasStatic();
hs1.x++;
HasStatic.x--;
System.out.println( "x=" +x);
}
}
正常编译,输出结果:x=102
访问的是同一个x,静态变量存储在方法区
3、下列不属于hash碰撞解决方法的是
单旋转法
4、系统为某进程分配了4个页框,该进程已访问的页号序列为2,0,2,9,3,4,2,8,2,4,8,4,5。
若访问的下一页的页号为7,依据LRU算法,应淘汰的页的页号是:
2
最近最少使用算法
5、进程P1和P2,资源A和B,进程对资源的操作定义如下:读取资源A:rA;读取资源B:rB;写入资源A:wA;写入资源B:wB。
同时规定,进程读取某一资源前,必须加上共享锁,写入某一资源前必须加上排他锁;
资源在被进程加共享锁时,可以被其他进程继续加共享锁,但不能加排他锁;资源在被进程加排他锁时,其他进程无法加锁。
进程完成全部操作后释放锁。进程P1和进程P2并发执行,如下哪种运行序列可能会出现死锁
P1(WB->rA),P2(WA->rB)

6、判断以下代码的输出结果:
public class text01 {
public static void main(Stringl args) (
Integer var1 = new Integer(1);
Integer var2 = var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1 == var2);
}
public static void doSomething(lnteger integer){
integer = new Integer(2);
}
}
1true
在这段代码中,首先创建了一个lnteger 对象 var1,并将其赋值给var2。
然后将 var2 作为参数传递给 doSomething 方法。在 doSomething 方法内部,创建了一个新的 lnteger 对象并将其赋值给 integer 参数。
由于 Java 中的参数传递是按值传递的,因此这里的赋值操作只会影响到 integel参数本身,而不会影响到 var2 或 var1。
因此,当doSomething 方法返回后,var2 和 var1 的值仍然是原来的值,即 1。
而var1 == var2 的结果为 true,这是因为 var2 和 var1引用的是同个 Integer 对象,它们的地址相同,
所以,输出结果为 1和 true。
7、下面关于HTTP/2的描述错误的是:
HTTP/2是以安全为目标的HTTP通道,简单讲就是HTTP的安全版。即HTTP下加入SSL层
这是指HTTPS
8、mysql 数据库有选课表 learn(student_id int,course_id int),字段分别表示学号和课程编号,
现在想获取每个学生所选课程的个数信息,请问如下的 sql 语句正确的是( )
select student_id,count(course_id) from learn group by student_id
9、以下数据结构哪一个是非线性结构?
二叉树
10、spring事务的传播特性,错误的是
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常。
是新建一个事务,不是抛出异常。

(多选)
11、关于下面一段代码,以下说法正确的是
public class Test {
private synchronized void a() {
}
private void b() {
synchronized (this) {
}
}
private synchronized static void c() {
}
private void d() {
synchronized (Test.class) {
}
}
}
同一个对象,分别调用方法a和b,锁住的是同一个对象
同一个对象,分别调用方法b和c,锁住的不是同一个对象
考察synchronized关键字
同步实例方法和同步代码块是锁this对象
同步静态方法是锁的是运行时类,即Test.class
12、如下哪些sql语句查询能较好的利用索引
create table T{
id not null auto_increment,
a date ,
b varchar(10),
c varchar(20),
d varchar(10),
primary key(id),
key_index(a desc,b desc),
key(b),
key(c),
key(d)

}
A、select b from T where b like "bbb%"
B、select a,b from T where a='2015-10-15' order by b asc
C、select a,b,c from T where a='2015-10-15' order by a asc,b asc
D、select a,b,c from T where a='2015-10-15' order by b,c
ABC
A、可以使用 b 索引来加速 LIKE 查询,因为 b 索引是对 b 列的查询索引。但是需要注意,由于 LIKE 匹配时要进行模式匹配,所以在实际应用中可能会有一定的性能开销,不建议使用“%bb”的匹配方式。
B、可以使用 key_index(a desc,b desc) 索引来优化查询。根据索引定义可知,该索引的第一个键是 a,第二个键是 b,而且两个键都是倒序排列。所以在查询时,可以利用该索引将符合条件 a='2015-10-15' 的记录按照 b 列正序排序。
C、同样可以使用 key_index(a desc,b desc) 索引来优化查询。根据索引定义可知,该索引的第一个键是 a,第二个键是 b,两个键都是正序排列。所以在查询时,可以利用该索引将符合条件 a='2015-10-15' 的记录先按照 a 列正序排序,对于相同的 a 值则按照 b 列正序排序,最后返回 a、b、c 三列的数据。
D、不能充分利用已有的索引来优化查询。虽然表 T 中有 b、c 两列的索引,但没有包含 a 列,且查询条件中只涉及到了 a 列的过滤条件,所以无法使用任何已有的索引来执行查询。在实际应用中可能会导致全表扫描的情况,性能较差。

13、两个线程并发执行以下代码,假设a是全局变量,那么以下输出___哪个是可能的?
int a=1;
void foo(){
++a;
printf("%d", a);
}
A 3 3
B 3 2
C 2 3
D 2 2
ABCD
考察++自增为啥不能保证原子性

14、JDK17有以下哪些特性?
A、ZGC
B、协程
C、CMS GC
D、Sealed Class
AD
Sealed Class这个特性被引入,并且可以被用来限制哪些类可以继承和实现该类

15、解决hash冲突的方法描述错误的有?
A、开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。
沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止。
B、拉链法解决冲突的做法是: 将所有关键字为同义词的结点链接在同一个单链表中
C、拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短
D、当结点规模较大时,开放定址法较为节省空间
AD
开放定址法确实是一种解决哈希冲突的方法,但它的做法并非"形成一个探查(测)序列"。
开放定址法的做法是:当发生哈希冲突时,通过某种算法计算出一个新的地址,并检查该地址是否已经被使用。
如果该地址已经被占用,就继续计算下一个新地址,直到找到一个空闲的地址为止。
具体的探测算法包括线性探测、二次探测、双重散列等。
在开放定址法中,通过不断探测新的地址,直到找到可用的空间来安置冲突的关键字,从而避免哈希冲突。

(算法题)
16、最长不重复字符的子字符串数组(滑动窗口)(题目有点忘记了,力扣有类似的题)

示例一:输入:"abcdabcde"
输出:["abcde"]
长度:5(便于理解,自己加的)
示例二:输入:"abcdabcd"
输出:["abcd","bcda","cdab","dabc","abcd"]
长度:4
示例三:输入:"sheinerintervyw"
输出:["intervyw"]
长度:8

public String[] maxLenString(String str){
             int len = str.length();
                List<String> resList = new ArrayList<>();
                if(len <= 1){
                    resList.add(str);
                    return resList.toArray(new String[0]);
                }
                int fast = 0, slow = 0;
                Map<Character,Integer> map = new HashMap<>();
                resList.add(str.substring(slow,fast+1));
                for (; fast < len; fast++) {
                    if(map.containsKey(str.charAt(fast))){
                        slow = map.get(str.charAt(fast)) + 1;
                    }
                    map.put(str.charAt(fast),fast);
                    if(fast - slow + 1 > resList.get(0).length()){
                        resList.clear();
                        resList.add(str.substring(slow,fast+1));
                    }else if(fast - slow + 1 == resList.get(0).length()) {
                        resList.add(str.substring(slow, fast + 1));
                    }
                }
        return resList.toArray(new String[0]);
}
                            

(SQL题)

17、某乎问答11月份日人均回答量
请你统计11月份日人均回答量(回答问题数量/答题人数),按回答日期排序,结果保留两位小数

select  answer_date,round(count(issue_id)/count(distinct author_id),2) as per_num
from answer_tb group by answer_date order by answer_date