菜鸟补给站 - -Java 常见笔试题

目录

 

( 一 )写一个算法统计出一个字符串中某子串出现的次数。(注意,目标字符串不一定有逗号)

( 二 )以下代码的输出结果是什么: -- Java内存管理

( 三 )有数列:1 1 2 3 5 8 13 21....,请写出算法求出第30个数字

( 四 )以下程序的运行结果是:考察点:创建子类对象,先调用父类的构造方法,再调用子类的构造方法

(五)请写出代码完成对HashMap map = new HashMap()中元素的遍历。(可以写多种方式),string>,string>

Map集合的特点:

使用增强for循环实现

使用lambda表达式遍历

( 六 )数据库例题

分别创建三张表  表结构如下

业务场景限制:

题目:


( 一 )写一个算法统计出一个字符串中某子串出现的次数。(注意,目标字符串不一定有逗号)

  • 如字符串“hello world, hello eclipse, hello idea, hello spring”,统计出“hello”出现的次数
public class SubStringCount {
    public static void main(String[] args) {
        String dest = "hellohello world, hello  eclipse, hello idea, hello spring";
        String subStr = "hello";
        int count = 0; //计数器
        int index = -1;  //表示从目标串哪个位置开始查找;也表示查找到目标子串出现的下标

        //若目标子串出现,则计数器+1,且index下标值后要后移到目标串出现的下一个字符去
        while((index=dest.indexOf(subStr,index))!=-1){
            //计数器+1
            count ++;
            //index索引后移到出现的子串的下一个字符
            index += subStr.length();
        }
        System.out.println(count);
    }
}

( 二 )以下代码的输出结果是什么: -- Java内存管理

class T{
    public static void main(String[] args){
        String str = "ok";
        char[] chs = {'g','b','k'};
        T t = new T();
        t.change(str,chs);
        System.out.println(str);
        System.out.println(Arrays.toString(chs));
    }
    public void change(String str,char[] chs){
        str = "hello";
        chs[0] = 'a';
}
//输出结果
 //str:  ok
// chs: a b k

 解析:

( 三 )有数列:1 1 2 3 5 8 13 21....,请写出算法求出第30个数字

  • 斐波那契数列(Fobonacci)---考点:递归

  • 递归:是一种思想,应用在代码方面体现为:方法调用方法本身

  • 递归经典算法: 斐波那契数列; 求阶乘 ;链表底层也是递归实现的

package cn.tedu.interview.day02;

/**
 * 求出第30个位置的值,斐波那契数列,考察递归
 */
public class Fabonacci {
    public static void main(String[] args) {
        //求出第30位的值
        Fabonacci fabonacci = new Fabonacci();
        int x = fabonacci.fn(30);
        System.out.println(x);
    }
    //求出某个位置的值  参数n:位置
    public int fn(int n){
        if(n==1 || n==2){
            return 1;
        }
        return fn(n-1)+fn(n-2);
    }
}

( 四 )以下程序的运行结果是:考察点:创建子类对象,先调用父类的构造方法,再调用子类的构造方法

public class Person{
    public Person(){
        System.out.println("superclass");
    }
}
public class Teacher extends Person{
    public String name = "jack";  //这里是public
    public Teacher(){
        System.out.println("subclass");
    }
    public static void main(String[] args){
        Teacher teacher = new Teacher();
        System.out.println(teacher.name);
    }
}


//superclass
//subclass
//jack
//通过debug查看执行过程,super()会出现在构造方法的第一行代码,无论写或不写,都存在;
//注意:若在构造方法中显示的调用父类的有参构造方法,此时super()不会默认提供

(五)请写出代码完成对HashMap<String,String> map = new HashMap<String,String>()中元素的遍历。(可以写多种方式)

public static void main(String[] args) {
        Map<String,String > map = new HashMap<>();
        map.put("语文","90");
        map.put("数学","80");
        map.put("英语","70");
        map.put("物理","89");

        //如何从map集合中取元素----  通过key值取value值,通过get方法实现
        //1. 使用增强for循环来遍历
        for (Map.Entry<String,String> entry:map.entrySet()) {
            System.out.println(entry.getKey()+"-"+entry.getValue());
        }
        //2. 可以使用lambda表达式来遍历
        map.forEach((k,v)-> System.err.println(k+":"+v));

        List<String> list = new ArrayList<>();
        list.add("tom");
        list.add("jack");
        list.add("rose");

        //list遍历--lambda
        list.forEach(str-> System.err.println(str));
    }

Map集合的特点:

  • HashMap的map集合是无序的
  • LinkedHashMap是有序的

使用增强for循环实现

使用lambda表达式遍历

lambda表达式:

语法: ()->{}

用法:

用于实现一些功能性接口(接口内部之后一个抽象方法)--替换一部分的匿名内部类

Runnable接口 -- 功能性接口 -- run()
1. 使用匿名内部类来实现该接口
	Runnable r = new Runnable(){
	    public void run(){
	    	....//任务
	    }
	}
	new Thread(r).start();

2. Runnable r = ()->{//任务};
    new Thread(r).start();

lambda表达式各部分意义:

( ):表示重写的方法的参数列表:

若无参,什么都不写

若有参,参数类型都可以省略,且若参数列表只有一个参数,此时()也可以省略

若有多个参数,参数类型可以省略,此时()不可以省略

{ }:表示重写的方法体

遍历集合:

可以遍历list,set,map集合,lambda表达式之所以能对三种集合进行遍历,是因为三种集合提供了对lambda的支持(提供的方法:forEach())

( 六 )数据库例题

  • 分别创建三张表  表结构如下

班级表(class)                                         学生表(student)

编号 班级名称
id  ( int ) class_name (varchar)
1 一班
2 二班
3 三班
4 四班
5 五班
编号 学号  姓名 性别 所属班级 (
id (int) stu_no (varchar) stu_name (varchar) stu_gender (varchar) class_id (int)
1 2020001 张三 1
2 2020002 李四 1
3 2020003 李丽 2
4 2020004 赵婷 3
5 2020005 王五 3

成绩表(score) 

学生 语文 数学
stu_id   ( int ) chinese ( int ) math( int )
1 70 47
2 80 60
3 50 82
4 80 90

业务场景限制:

  • 一个班级有多名学生,一名学生只属于一个班级
    ​​​​​​​学生有可能没有成绩

创建表

CREATE TABLE class(
id int,class_name varchar(20)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
CREATE TABLE student(
id int,stu_no varchar(20),
stu_name varchar(20),stu_gender varchar(20),class_id int
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
CREATE TABLE score(
stu_id int,chinese int,math int
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
插入数据
INSERT INTO class VALUES(1,'一班'),(2,'二班'),(3,'三班'),(4,'四班'),(5,'五班');
INSERT INTO student VALUES(1,'2020001','张三','男',1);
INSERT INTO student VALUES(2,'2020002','李四','男',1);
INSERT INTO student VALUES(3,'2020003','李丽','女',2);
INSERT INTO student VALUES(4,'2020004','赵婷','女',3);
INSERT INTO student VALUES(5,'2020005','王五','男',3);
INSERT INTO score VALUES(1,70,47),(2,80,60),(3,50,82),(4,80,90);

题目:

  1. 查询所有人(包括没有成绩的学生)的课程分数(学号,姓名,性别,班级名称,语文分数,数学分数)

    多表联查(关联查询):内连接查询,左外连接查询,右外连接查询,自连接查询

    注意:

    多表查询中要查询的字段若是唯一存在,那么可以不写表名.字段,可以直接写字段名
    SELECT 
        stu_no,stu_name,stu_gender,class_name,chinese,math
    FROM 
        student stu 
    JOIN 
        class c 
    ON 
        stu.class_id=c.id 
    LEFT JOIN 
        score sc 
    ON 
        stu.id = sc.stu_id;
    
  2. 查询语文分数比“张三”高的学生(学号,姓名,性别,班级名称,语文分 数)

    1.分析 确定三表查询 确定连接条件 确定查询条件

    SELECT 
        stu_no 学号,stu_name  姓名,stu_gender 性别,class_name 班级名称,chinese 语文分数
    FROM 
        student stu 
    JOIN 
        class c 
    ON
        stu.class_id = c.id
    JOIN 
        score sc 
    ON 
        sc.stu_id =stu.id
    WHERE
        chinese > (
                   SELECT 
                         chinese 
                    FROM 
                        student stu 
                    JOIN
                        score sc 
                    ON
                        stu.id=sc.stu_id 
                    WHERE 
                        stu.id=1 );

    3.查询各科都合格(分数>=60)的学生(学号,姓名,语文分数,数学分数)

    分析 1,根据查询字段 确定查询表 2,连接条件 3. 查询条件

    SELECT 
        stu_no 学号,stu_name 姓名,chinese 语文分数,math 数学分数
    FROM 
        student stu 
    JOIN 
        score sc
    ON 
        stu.id = sc.stu_id
    WHERE 
        chinese>=60 
    AND 
        math>=60;

4.查询班级人数>=2的班级(班级编号,班级名称,人数)

分析 根据查询字段 确定表 class,student, 根据班级来进行分组 ,统计学生人数

注意: 查询结果count( )作为查询条件来使用,count 函数会使用 group by ,再次根据分组的结果进行条件进行查询

,应该使用having 关键字来进行分组后的数据进行筛选

分组 group by 用法: 分组通常和聚合函数配合使用 ( count,avg,sum,max,min)

SELECT 
    c.id 班级编号,class_name 班级名称,count(*) 人数
FROM 
    student stu JOIN class c 
ON
    stu.class_id = c.id
GROUP BY 
    stu.class_id 
HAVING COUNT(*)>=2;

猜你喜欢

转载自blog.csdn.net/c202003/article/details/107802174