目录
( 一 )写一个算法统计出一个字符串中某子串出现的次数。(注意,目标字符串不一定有逗号)
( 二 )以下代码的输出结果是什么: -- Java内存管理
( 三 )有数列:1 1 2 3 5 8 13 21....,请写出算法求出第30个数字
( 四 )以下程序的运行结果是:考察点:创建子类对象,先调用父类的构造方法,再调用子类的构造方法
(五)请写出代码完成对HashMap map = new HashMap()中元素的遍历。(可以写多种方式),string>,string>
( 一 )写一个算法统计出一个字符串中某子串出现的次数。(注意,目标字符串不一定有逗号)
- 如字符串“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);
题目:
-
查询所有人(包括没有成绩的学生)的课程分数(学号,姓名,性别,班级名称,语文分数,数学分数)
多表联查(关联查询):内连接查询,左外连接查询,右外连接查询,自连接查询
注意:
多表查询中要查询的字段若是唯一存在,那么可以不写表名.字段,可以直接写字段名
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;
-
查询语文分数比“张三”高的学生(学号,姓名,性别,班级名称,语文分 数)
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;