最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
private String shopName;
/**
-
订单列表 (一个门店关联N个订单 一对多)
-
*/
private List orderFormList;
}
辅助工具函数:
/***
-
将通过keyName获得对应的bean对象的get方法名称的字符串
-
@param keyName 属性名
-
@return 返回get方法名称的字符串
*/
private static String makeGetMethodName(String keyName){
//:::将第一个字母转为大写
String newKeyName = transFirstCharUpperCase(keyName);
return “get” + newKeyName;
}
/***
-
将通过keyName获得对应的bean对象的set方法名称的字符串
-
@param keyName 属性名
-
@return 返回set方法名称的字符串
*/
private static String makeSetMethodName(String keyName){
//:::将第一个字母转为大写
String newKeyName = transFirstCharUpperCase(keyName);
return “set” + newKeyName;
}
/**
-
将字符串的第一个字母转为大写
-
@param str 需要被转变的字符串
-
@return 返回转变之后的字符串
*/
private static String transFirstCharUpperCase(String str){
return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());
}
/**
-
判断当前的数据是否需要被转换
-
两个列表存在一个为空,则不需要转换
-
@return 不需要转换返回 false,需要返回 true
-
*/
private static boolean needTrans(List beanList,List dataList){
if(listIsEmpty(beanList) || listIsEmpty(dataList)){
return false;
}else{
return true;
}
}
/**
-
列表是否为空
-
*/
private static boolean listIsEmpty(List list){
if(list == null || list.isEmpty()){
return true;
}else{
return false;
}
}
/**
-
将javaBean组成的list去重 转为map, key为bean中指定的一个属性
-
@param beanList list 本身
-
@param keyName 生成的map中的key
-
@return
-
@throws Exception
*/
public static Map<String,Object> beanListToMap(List beanList,String keyName) throws Exception{
//:::创建一个map
Map<String,Object> map = new HashMap<>();
//:::由keyName获得对应的get方法字符串
String getMethodName = makeGetMethodName(keyName);
//:::遍历beanList
for(Object obj : beanList){
//:::如果当前数据是hashMap类型
if(obj.getClass() == HashMap.class){
Map currentMap = (Map)obj;
//:::使用keyName从map中获得对应的key
String result = (String)currentMap.get(keyName);
//:::放入map中(如果key一样,则会被覆盖去重)
map.put(result,currentMap);
}else{
//:::否则默认是pojo对象
//:::获得get方法
Method getMethod = obj.getClass().getMethod(getMethodName);
//:::通过get方法从bean对象中得到数据key
String result = (String)getMethod.invoke(obj);
//:::放入map中(如果key一样,则会被覆盖去重)
map.put(result,obj);
}
}
//:::返回结果
return map;
}
一对一连接接口定义:
/**
-
一对一连接 : beanKeyName <—> dataKeyName 作为连接条件
-
@param beanList 需要被存放数据的beanList(主体)
-
@param beanKeyName beanList中连接字段key的名字
-
@param beanModelName beanList中用来存放匹配到的数据value的属性
-
@param dataList 需要被关联的data列表
-
@param dataKeyName 需要被关联的data中连接字段key的名字
-
@throws Exception
*/
public static void oneToOneLinked(List beanList, String beanKeyName, String beanModelName, List dataList, String dataKeyName) throws Exception { }
如果带入上述一对一连接的例子,beanList是订单列表(List),beanKeyName是订单用于关联用户的字段名称(例如外键“OrderForm.customerID”),beanModelName是用于存放用户类的字段名称(“例如OrderForm.customer”),dataList是顾客列表(List),dataKeyName是被关联数据的key(例如主键"Customer.id")。
一对一连接代码实现:
/**
-
一对一连接 : beanKeyName <—> dataKeyName 作为连接条件
-
@param beanList 需要被存放数据的beanList(主体)
-
@param beanKeyName beanList中连接字段key的名字
-
@param beanModelName beanList中用来存放匹配到的数据value的属性
-
@param dataList 需要被关联的data列表
-
@param dataKeyName 需要被关联的data中连接字段key的名字
-
@throws Exception
*/
public static void oneToOneLinked(List beanList, String beanKeyName, String beanModelName, List dataList, String dataKeyName) throws Exception {
//:::如果不需要转换,直接返回
if(!needTrans(beanList,dataList)){
return;
}
//:::将被关联的数据列表,以需要连接的字段为key,转换成map,加快查询的速度
Map<String,Object> dataMap = beanListToMap(dataList,dataKeyName);
//:::进行数据匹配连接
matchedDataToBeanList(beanList,beanKeyName,beanModelName,dataMap);
}
/**
-
将批量查询出来的数据集合,组装到对应的beanList之中
-
@param beanList 需要被存放数据的beanList(主体)
-
@param beanKeyName beanList中用来匹配数据的属性
-
@param beanModelName beanList中用来存放匹配到的数据的属性
-
@param dataMap data结果集以某一字段作为key对应的map
-
@throws Exception
*/
private static void matchedDataToBeanList(List beanList, String beanKeyName, String beanModelName, Map<String,Object> dataMap) throws Exception {
//:::获得beanList中存放对象的key的get方法名
String beanGetMethodName = makeGetMethodName(beanKeyName);
//:::获得beanList中存放对象的model的set方法名
String beanSetMethodName = makeSetMethodName(beanModelName);
//:::遍历整个beanList
for(Object bean : beanList){
//:::获得bean中key的method对象
Method beanGetMethod = bean.getClass().getMethod(beanGetMethodName);
//:::调用获得当前的key
String currentBeanKey = (String)beanGetMethod.invoke(bean);
//:::从被关联的数据集map中找到匹配的数据
Object matchedData = dataMap.get(currentBeanKey);
//:::如果找到了匹配的对象
if(matchedData != null){
//:::获得bean中对应model的set方法
Class clazz = matchedData.getClass();
//:::如果匹配到的数据是hashMap
if(clazz == HashMap.class){
//:::转为父类map class用来调用set方法
clazz = Map.class;
}
//:::获得主体bean用于存放被关联对象的set方法
Method beanSetMethod = bean.getClass().getMethod(beanSetMethodName,clazz);
//:::执行set方法,将匹配到的数据放入主体数据对应的model属性中
beanSetMethod.invoke(bean,matchedData);
}
}
}
一对多连接接口定义:
如果带入上述一对多连接的例子,oneDataList是门店列表(List),oneKeyName是门店用于关联订单的字段名称(例如主键“Shop.id”),oneModelName是用于存放订单列表的字段名称(例如"Shop.orderFomrList"),manyDataList是多方列表(List),manyKeyName是被关联数据的key(例如外键"OrderFrom.shopID")。
一对多连接代码实现:
/**
-
一对多连接 : oneKeyName <—> manyKeyName 作为连接条件
-
@param oneDataList ‘一方’ 数据列表
-
@param oneKeyName ‘一方’ 连接字段key的名字
-
@param oneModelName ‘一方’ 用于存放 '多方’数据的列表属性名
-
@param manyDataList ‘多方’ 数据列表
-
@param manyKeyName ‘多方’ 连接字段key的名字
-
注意: ‘一方’ 存放 '多方’数据的属性oneModelName类型必须为List
-
@throws Exception
*/
public static void oneToManyLinked(List oneDataList,String oneKeyName,String oneModelName,List manyDataList,String manyKeyName) throws Exception {
if(!needTrans(oneDataList,manyDataList)){
return;
}
最后
看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。
注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友
互联网工程师必备的面试1000题
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
0题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友
[外链图片转存中…(img-pBgKJXIT-1715310070863)]
互联网工程师必备的面试1000题
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
[外链图片转存中…(img-3TdNXzvy-1715310070864)]