首次面试实习岗,有点紧张。。。
文章目录
- 首次面试实习岗,有点紧张。。。
- 算法
- 1.三角形问题
- 2.一年中第几天问题
- 提问:
- 一、SpringBoot的配置文件中的数据有哪几种获取方式,分别是怎么获取的?
- 二、@Autowire和@Resource有什么区别?
- 三、Mybatis 中${}和#{}有什么区别?
- 四、应用层协议有哪些?
- 五、怎么获取数据包中的Header,记得方法名吗?
- SQL
🌈你好呀!我是 山顶风景独好
💝欢迎来到我的博客,很高兴能够在这里和您见面!
💝希望您在这里可以感受到一份轻松愉快的氛围!
💝不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!
- 今天阳光明媚,阳光透过窗户洒在我的书桌上,给这个原本有些紧张的日子增添了几分温暖。作为一名大三的学生,我深知实习经验对于未来找工作的重要性。因此,当得知有一个外包实习岗位的机会时,我毫不犹豫地投递了简历,并收到了面试邀请。
- 下午一点,我准时出发,踏上了前往面试地点的地铁。车厢里人潮涌动,但我的心中只有一件事——即将到来的面试。我反复检查着自己的简历和面试准备材料,深怕漏掉什么重要的信息。地铁飞驰在轨道上,我的思绪也随之飘飞,想象着面试官可能会问的各种问题。
- 经过一个小时的车程,我终于到达了面试地点。站在公司楼下,我深吸一口气,试图平复自己紧张的心情。走进公司,我被带到了一间会议室,面试官已经在那里等候了。我微笑着和面试官打了个招呼,然后坐在了指定的位置上。
- 面试开始了,我按照面试官的要求介绍了自己的基本情况。随后,面试官开始提问。问题的内容很基础,但对我来说却是一次全新的体验。我尽力回答每一个问题,但心中还是难免有些紧张。每当回答完一个问题,我都会稍微停顿一下,思考自己的回答是否准确、完整。
- 时间过得很快,转眼间面试就结束了。面试官对我的表现给予了肯定,并告诉我会尽快通知我是否被录用。我走出公司,心情轻松了许多。虽然面试过程中有些紧张,但我觉得自己已经尽力了。
- 晚上回到家,我开始复盘今天的面试。我仔细回忆了每一个问题以及自己的回答,思考着哪些地方做得好,哪些地方还需要改进。通过这次面试,我深刻体会到了自己在知识储备和表达能力上的不足,也更加明确了自己未来的努力方向。
- 这次面试虽然只是一次小小的经历,但却让我收获了很多。我相信,在未来的日子里,我会继续努力提升自己,不断追求更好的自己。
算法
1.三角形问题
编写一个三角形类,输入三边的值,判断是否可以组成一个三角形,并编写计算周长、计算面积的函数,最后进行测试:
Java版
public class Triangle { private double sideA; private double sideB; private double sideC; public Triangle(double sideA, double sideB, double sideC) { this.sideA = sideA; this.sideB = sideB; this.sideC = sideC; } // 判断是否可以组成三角形 public boolean isValidTriangle() { return sideA + sideB > sideC && sideA + sideC > sideB && sideB + sideC > sideA; } // 计算周长 public double calculatePerimeter() { return sideA + sideB + sideC; } // 计算面积(基于海伦公式) public double calculateArea() { if (!isValidTriangle()) { throw new IllegalArgumentException("非法的三角形边长"); } double s = calculatePerimeter() / 2; return Math.sqrt(s * (s - sideA) * (s - sideB) * (s - sideC)); } // 测试 public static void main(String[] args) { // 测试用例1:可以组成三角形 Triangle triangle1 = new Triangle(3, 4, 5); System.out.println("是有效三角形吗? " + triangle1.isValidTriangle()); System.out.println("周长: " + triangle1.calculatePerimeter()); System.out.println("面积: " + triangle1.calculateArea()); // 测试用例2:不能组成三角形 Triangle triangle2 = new Triangle(1, 2, 4); System.out.println("是有效三角形吗? " + triangle2.isValidTriangle()); // 注意:由于triangle2不能组成三角形,尝试计算面积会抛出异常 // System.out.println("面积: " + triangle2.calculateArea()); // 这行代码会抛出异常 // 如果想要捕获异常并处理 try { System.out.println("带异常处理的面积: " + triangle2.calculateArea()); } catch (IllegalArgumentException e) { System.out.println("无法为无效的三角形计算面积: " + e.getMessage()); } }
}
Python版
import math class Triangle: def __init__(self, side_a, side_b, side_c): self.side_a = side_a self.side_b = side_b self.side_c = side_c def is_valid(self): return self.side_a + self.side_b > self.side_c and \ self.side_a + self.side_c > self.side_b and \ self.side_b + self.side_c > self.side_a def perimeter(self): return self.side_a + self.side_b + self.side_c def area(self): if not self.is_valid(): raise ValueError("非法的三角形边长") s = self.perimeter() / 2 return math.sqrt(s * (s - self.side_a) * (s - self.side_b) * (s - self.side_c)) # 测试
def test_triangle(): # 测试用例1:可以组成三角形 triangle1 = Triangle(3, 4, 5) print(f"是否为有效三角形? {triangle1.is_valid()}") print(f"周长: {triangle1.perimeter()}") print(f"面积: {triangle1.area()}") # 测试用例2:不能组成三角形 triangle2 = Triangle(1, 2, 4) print(f"是否为有效三角形? {triangle2.is_valid()}") try: print(f"面积: {triangle2.area()}") except ValueError as e: print(f"错误: {e}") if __name__ == "__main__": test_triangle()
2.一年中第几天问题
输入年、月、日三个数值,输出日期属于
当年中的第几天,例如输入2020年2月2日,输出是一年中的第32天。
Java版
import java.util.Scanner; public class DayOfYearWithoutLibraries { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 提示用户输入年、月、日 System.out.print("请输入年份: "); int year = scanner.nextInt(); System.out.print("请输入月份: "); int month = scanner.nextInt(); System.out.print("请输入日期: "); int day = scanner.nextInt(); // 调用方法计算日期是一年中的第几天 int dayOfYear = dayOfYearWithoutLibraries(year, month, day); // 输出结果 System.out.println(year + "年" + month + "月" + day + "日是一年中的第" + dayOfYear + "天"); // 关闭Scanner scanner.close(); } // 计算日期是一年中的第几天 public static int dayOfYearWithoutLibraries(int year, int month, int day) { int[] daysInMonths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 判断是否为闰年 if (isLeapYear(year)) { daysInMonths[1] = 29; // 如果是闰年,二月份有29天 } int dayOfYear = 0; for (int i = 0; i < month - 1; i++) { dayOfYear += daysInMonths[i]; } dayOfYear += day; // 加上本月的天数 return dayOfYear; } // 判断是否是闰年 public static boolean isLeapYear(int year) { if (year % 4 != 0) { return false; } if (year % 100 != 0) { return true; } if (year % 400 != 0) { return false; } return true; }
}
python版
def is_leap_year(year): """判断是否是闰年""" if year % 4 != 0: return False elif year % 100 != 0: return True elif year % 400 != 0: return False else: return True def day_of_year(year, month, day): """计算日期是一年中的第几天""" days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 如果是闰年且月份大于2,二月份有29天 if is_leap_year(year) and month > 2: days_in_month[1] = 29 # 累加前几个月的天数 total_days = 0 for i in range(month - 1): total_days += days_in_month[i] # 加上本月的天数 total_days += day return total_days # 从用户处获取输入
year = int(input("请输入年份: "))
month = int(input("请输入月份: "))
day = int(input("请输入日期: ")) # 计算并输出结果
print(f"{year}年{month}月{day}日是一年中的第{day_of_year(year, month, day)}天")
提问:
一、SpringBoot的配置文件中的数据有哪几种获取方式,分别是怎么获取的?
本题参考文献:SpringBoot配置文件值注入的几种方式
方式一 :@ConfigurationProperties
不管是yml配置文件
person:lastName: helloage: 18birth: 2017/12/12maps: {k1: v1,k2: v2}boss: truelists:- lisi- zhaoliu
还是properties文件
person.age=18
person.last-name=zhangsan
person.birth=2017/12/12
person.maps.k1=v2
person.maps.k2=v3
person.boss=true
person.lists=guitar,sing,play
person.dog.age=11
person.dog.name=www
配置类都可以准确接收
@Component
@ConfigurationProperties(prefix = "person")
public class Person {private String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String,Object> maps;private List<Object> lists;private Dog dog;
}
方式二:@Value
application.properties,用yml文件也是可以的
datasource.url=123
datasource.username=456
datasource.password=789
datasource.gw-url=127.0.0.1
配置类
@Component
public class DruidDBConfig {@Value("${datasource.url}") private String url; @Value("${datasource.username}") private String username; @Value("${datasource.password}") private String password; @Value("${datasource.gw-url}") private String gwUrl;
}
方式三:@PropertySource
作用:加载指定的配置文件;
上面所述的两个注解都是注入值,并且值都是在application主配置文件配置,才能注入。
我们可以使用@PropertySource来将一些固定信息配置独立出来一个配置文件。
他是可以和@ConfigurationProperties和@Value一起来使用的。
用法详解:
创建DruidDBConfig.properties
datasource.url=123
datasource.username=456
datasource.password=789
datasource.gw-url=127.0.0.1
配置类
@Component
@PropertySource(value = {"classpath:DruidDBConfig.properties"})
public class DruidDBConfig {@Value("${datasource.url}") private String url; @Value("${datasource.username}") private String username; @Value("${datasource.password}") private String password; @Value("${datasource.gw-url}") private String gwUrl;@Overridepublic String toString() {return "DruidDBConfig [url=" + url + ", username=" + username + ", password=" + password + ", gwUrl=" + gwUrl+ "]";}
}
方式四:@ImportResource
有一些小伙伴在使用过程当中老是弄混他和@PropertySource的区别
@ImportResource作用::导入Spring的配置文件,让配置文件里面的内容生效;
还有一个跟这个注解相似,那就是@Import,他可以直接加载类配置文件,使用这个注解加载的类会直接存放到IOC容器当中。
@ImportResource可以用来加载xml配置文件
想让Spring的xml配置文件生效,加载进来;@ImportResource标注在一个配置类上,启动类也是可以的。
@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效
编写Spring的配置文件
<?xml version="1.0" encoding="UTF‐8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring‐beans.xsd"> <bean id="helloService" class="com.gzl.springboot.service.HelloService"></bean>
</beans>
二、@Autowire和@Resource有什么区别?
本题参考文献:Spring中@Resource和@Autowire注解的区别
1.@Resource和@Autowire注解的区别
- @Resource和@Autowired都是用来进行依赖注入的注解,但是它们有一些不同之处。
- @Autowired是Spring框架中的注解,它可以用来标注字段、构造函数、方法等,表示需要自动装配。它可以用来注入依赖的bean。如果有多个bean符合条件,可能会抛出异常。
- @Resource是Java自带的注解,它可以用来标注字段、方法等,表示需要自动装配。它可以用来注入依赖的bean。如果有多个bean符合条件,会按照名称进行匹配。
总结:
@Autowired 是 Spring 框架中的注解,用来标注需要自动装配的 bean。
@Resource 是 Java 自带的注解,用来标注需要自动装配的 bean。
@Autowired 是按类型装配,如果有多个同类型的 bean,会抛出异常; @Resource 是按名称装配,如果名称不存在,会使用类型装配。
2.详细说明
下面是一个使用@Autowired和@Resource注解进行依赖注入的示例:
代码如下(示例):
// 定义一个服务类
@Service
public class MyService {// 使用@Autowired注入一个Dao@Autowiredprivate MyDao myDao;
}// 定义一个Dao类
@Repository
public class MyDao {// 使用@Resource注入一个DataSource@Resourceprivate DataSource dataSource;
}
- 使用@Autowired 注解,会按类型装配,如果有多个同类型的 bean,会抛出异常。
- 使用@Resource 注解,会按名称装配,如果名称不存在,会使用类型装配。
- 如果你的项目中没有多个同类型的bean,那么@Autowired和@Resource是可以互换使用的,如果有多个同类型的bean,那么就要使用@Resource进行指定名称注入。
- 如果有多个同类型的bean,但是你没有使用@Resource进行名称指定,就会抛出异常,所以在使用@Autowired注解时,要确保只有一个同类型的bean。
- 什么是同类型的Bean?
- 在上面的示例中,同类型的bean指的是有多个类型为MyDao的bean存在于Spring容器中,如果使用@Autowired注解进行注入的话,Spring容器并不知道应该注入哪一个MyDao类型的bean,因此会抛出异常。
- 换句话说就是如果你在项目中有多个类都是实现了同一个接口或者继承了同一个类,并且这些类都被标记为了@Service,@Repository等等,并且你在其他地方使用了这个接口或者类进行了注入,那么就会出现多个同类型的bean的情况。
- 比如说你有两个类A和B都是实现了接口I,并且都是被标记为了@Service的,那么当你在其他地方使用I进行注入的时候,就会出现多个同类型的bean的情况。
总结
- 总的来说,@Autowired和@Resource都是用来进行依赖注入的注解,但是它们有一些不同之处:
- @Autowired 是 Spring 框架中的注解,用来标注需要自动装配的 bean,默认按类型装配,如果有多个同类型的 bean,会抛出异常。
- @Resource 是 Java 自带的注解,用来标注需要自动装配的 bean,按照名称进行装配,如果名称不存在,会使用类型装配。
- 如果你的项目中没有多个同类型的bean,那么@Autowired和@Resource是可以互换使用的,如果有多个同类型的bean,那么就要使用@Resource进行指定名称注入。
三、Mybatis 中${}和#{}有什么区别?
本题参考文献:【Mybatis系列】#{}和${}有什么区别?(这个超链接怎么也放不上/(ㄒoㄒ)/~~)
- ${}是一个纯粹的string 替换,在动态sql解析阶段会进行变量替换,sql直接拼接就好了,Parameters为空
- #{}解析为一个JDBC的预编译语句的参数标记符
- ${}是参数拼接的问题,变量的替换是在动态SQL解析阶段,但是参数拼接可能会存在sql注入的
- #{}是占位符的方式来解决参数传递问题,变量的替换是在DBMS中,而且替换会自动加单引号 ‘’
用法:
- 1.能用#{}的地方就用#{},因为${}存在sql注入非常的不安全,可能一条查询语句就能变成删表操作
例如:
select * from ${tableName} where name=#{name}
这个时候我们传递tableName 为 user;delete user; --
sql预编译之后变成:select * from user; delete user; -- where name = ?;
- 2.表明作为变量的时候,必须使用${}
知道为什么吗? 这是由于如果我们使用#{}占位符传递的话会自动加上单引号‘’,但是${}不会自动加单引号
select * from #{tableName} where name = #{name};
预编译之后变成
select * from ? where name = ?;
假设我们传入的tableName=user name=“zhangsan”
select * from 'User' where name='zhangsan';
上述sql语句是错误的,表名不能加单引号
什么是sql预编译?
在上面的介绍中提到了很多次的sql预编译,sql预编译就是在数据库驱动在发送sql语句和参数给DBMS之前对sql语句进行编译,这样DBMS在执行sql语句就不需要重新编译
四、应用层协议有哪些?
- 域名系统(Domain Name System,DNS):用于实现网络设备名字到IP地址映射的网络服务。
- 文件传输协议(File Transfer Protocol,FTP):用于实现交互式文件传输功能。FTP支持两种模式:主动模式和被动模式。
- 简单邮件传送协议(Simple Mail Transfer Protocol,SMTP):用于实现电子邮箱之间的邮件发送功能。
- 超文本传输协议(HyperText Transfer Protocol,HTTP):用于在Web浏览器和Web服务器之间传输超文本数据,是Internet上应用最广泛的协议之一。
- 远程登录协议(Telnet):用于实现远程登录功能,允许用户从本地计算机通过网络登录到远程计算机上并执行命令。
- 简单网络管理协议(Simple Network Management Protocol,SNMP):用于实现网络设备的监控和管理功能,是网络管理系统中的重要组成部分。
- 动态主机配置协议(DHCP)、网络文件系统(NFS)、实时流协议(RTSP)等
五、怎么获取数据包中的Header,记得方法名吗?
方法一:对应的部分加入@RequestHeader获取
@Controller
public class HelloController {@RequestMapping(value = "/hello")public String hello(@RequestHeader(value="User-Agent") String userAgent){}
}
方法二:类级别注入HttpServletRequest
@Controller
@RequestMapping("/hello")
public class HelloController {@Autowiredprivate HttpServletRequest request;@RequestMapping(value="/printname/{name}", method=RequestMethod.GET)public String printName(@PathVariable String name,@RequestHeader HttpHeaders headers) {System.out.println("from request:" + request.getHeader("code"));System.out.println("from parameter:" + headers.getFirst("code"));return "hello";}
}
SQL
给你一个表,id,agent,age,查询男性大于60和女性大于50的人数:
- 方法一:使用两个子查询
SELECT (SELECT COUNT(*) FROM your_table_name WHERE agent = 'M' AND age > 60) AS male_over_60, (SELECT COUNT(*) FROM your_table_name WHERE agent = 'F' AND age > 50) AS female_over_50;
- 方法二:使用CASE语句
SELECT SUM(CASE WHEN agent = 'M' AND age > 60 THEN 1 ELSE 0 END) AS male_over_60, SUM(CASE WHEN agent = 'F' AND age > 50 THEN 1 ELSE 0 END) AS female_over_50
FROM your_table_name;