淘宝是什么语言做的网站,wordpress 企业主题 免费,品牌购买平台,北理离线《网站开发与应用》#x1f9f8;欢迎来到dream_ready的博客#xff0c;#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ#xff1b;) 博主首页#xff0c;更多redis、java等优质好文以及各种保姆级教程等您挖掘#xff01; 目录
总结 (非详细)
面试内容(提问内容) - 带答案
1、字符串相… 欢迎来到dream_ready的博客相信您对博主首页也很感兴趣o (ˉ▽ˉ) 博主首页更多redis、java等优质好文以及各种保姆级教程等您挖掘 目录
总结 (非详细)
面试内容(提问内容) - 带答案
1、字符串相关的函数
2、抽象类和接口的区别
3、Java有几种创建线程池的方式分别是什么有什么不同
4、什么是回调函数
5、什么是函数式接口函数式接口与普通接口的区别
6、 什么是反射
7、Java中的集合
详细总结(注意事项) 总结 (非详细) 面试结果非常不好面试内容Java基础八股原因Java基础相关八股文太差 面试内容(提问内容) - 带答案 字符串相关的函数抽象类和接口的区别Java有几种创建线程池的方式分别是什么有什么不同什么是回调函数什么是函数式接口函数式接口与普通接口的区别什么是反射Java中的集合 1、字符串相关的函数
创建字符串 String str hello // 直接赋值创建字符串 String str new String(Hello) // 使用构造函数创建字符串对象 获取字符串长度 int length str.length() // 获取字符串长度 获取指定位置的字符 char ch str.charAt(index) // 获取指定位置的字符 查找子字符串的位置 int index str.indexOf(hello world) // 查找子字符串的位置 判断是否包含子字符串 boolean contains str.contains(substring) // 判断是否包含子字符串 替换字符串中的内容 String replaced str.replace(old, new) // 替换字符串中的内容 截取子字符串 Strin sub str.substring(startIndex, endIndex) // 截取子字符串 字符串拼接 String concat str.concat( World) // 字符串拼接 使用指定分隔符连接多个字符串 String joined String.join(-, Hello, World) // 使用指定分隔符连接多个字符串 根据指定分隔符拆分字符串为数组 String[] parts str.split(delimiter) // 根据指定分隔符拆分字符串为数组 去除字符串首尾空白字符 String trimmed str.trim() // 去除字符串首尾空白字符 字符串大小写转换 String upper str.toUpperCase() // 转换为大写 String lower str.toLowerCase() // 转换为小写 判断字符串是否为空 boolean isEmpty str.isEmpty() // 判断字符串是否为空(更常用) boolean isBlank str.isBlank() // 判断字符串是否为空(Java11 新增) 将其他类型转换为字符串 基本上的万能方法 String.valueOf(需要转换的变量名) 以及 toString 方法只不过什么.toString , .toString的前缀各有不同 int num 10; String str String.valueOf(num); // 将整数类型(int、long)转换为字符串 // 或者 String str Integer.toString(num); // 将整数类型(int、long)转换为字符串 double num 10.5; String str String.valueOf(num); // 将浮点数类型(float、double)转换为字符串 // 或者 String str Double.toString(num); // 将浮点数类型(float、double)转换为字符串 boolean flag true; String str String.valueOf(flag); // 将Boolean类型转换为字符串 char ch A; String str String.valueOf(ch); // 将字符类型转换为字符串 // 除基本数据类型外其他类型可以使用对象的toString()方法 Object obj new Object(); String str obj.toString(); // 将其他类型转换为字符串 将字符串转换为其他类型 String str 123; int intValue Integer.parseInt(str); // 字符串转换为整数 String str 1234567890; long longValue Long.parseLong(str); // 字符串转换为长整数 字符串转换为浮点数 String str 3.14; float floatValue Float.parseFloat(str); // 字符串转换为 float double doubleValue Double.parseDouble(str); // 字符串转换为 double String str true; boolean boolValue Boolean.parseBoolean(str); // 字符串转换为布尔值 字符串转换为自定义对象 引入Jackson 或 FastJson依赖使用这其中的内置函数需要注意的是这个被转换的字符串本身就要是JSON格式的字符串要和对象中的属性对应具体操作此处不再展示用时查询即可 2、抽象类和接口的区别
抽象类
特点
可以包含抽象方法和非抽象方法可以有成员变量可以有构造方法通过 “extends” 关键字被子类继承不能被实例化只能作为其他类的父类子类必须实现覆盖其抽象方法
用法
适合用于需要某些默认实现的情况用于定义类的层次结构提供一些通用行为
接口
特点
只能包含抽象方法(Java8可以有默认方法和静态方法)不能有成员变量(Java8可以有静态常量)不能有构造方法通过 “implements” 关键字被类发现可以多继承一个类可以实现多个接口
用法:
用于定义一组相关的方法而不包含实现用于实现多继承使类具有多种类型特征用于实现不同类之间的通用协议可以多继承一个类可以实现多个接口
如何选择使用抽象类还是接口 如果你需要提供一些默认实现或者需要在未来扩展更多的方法可以使用抽象类 如果你需要定义一组方法的契约而不关心具体实现并且需要支持多继承特性可以使用接口 有时候也可以将抽象类和接口结合使用使用接口定义契约使用抽象类提供默认实现 3、Java有几种创建线程池的方式分别是什么有什么不同 有好多种甚至我感觉应该没有明确的数字来确定Java有几种创建线程池的方式因为有些是JavaJDK提供的有些是某些框架提供的 下面说一下我了解的常见的五种方式
3.1、“Executors” 工厂类常用 - 精简 “newFixedThreadPool(int nThreads)” 创建一个固定大小的线程池线程数量固定不变 代码举例(private是权限修饰符可更改) private ExecutorService executorService Executors.newFixedThreadPool(8); “newCachedThreadPool()”创建一个根据需要自动扩展的线程池线程数量可以根据任务的多少来进行动态调整 “newSingleThreadExecutor()”创建一个单线程的线程池保证任务按顺序执行这些方法返回“ExecutorService”接口的实例可以用于提交任务、关闭线程池等操作 3.2、“ThreadPoolExecutor类”常用 - 细节 “ThreadPoolExecutor” 类提供了更灵活的线程池创建方式可以自定义线程池的配置 ThreadPoolExecutor executor new ThreadPoolExecutor(corePoolSize, // 核心线程数maximumPoolSize, // 最大线程数keepAliveTime, // 线程空闲时间TimeUnit.MILLISECONDS, // 时间单位new LinkedBlockingQueueRunnable() // 任务队列
);通过 “ThreadPoolExecutor” 类可以灵活地配置核心线程数、最大线程数、线程空闲时间、任务队列等 3.3、Spring框架提供的线程池(光Spring创建线程的方式就有好几种虽然都与TaskExecutor接口有关系) Spring 框架提供了 TaskExecutor 接口来管理线程池以及一些实现了这个接口的具体线程池实现例如使用 “ThreadPoolTaskExecutor”进行线程池的管理和配置 示例代码如下 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;// 创建 ThreadPoolTaskExecutor 对象
ThreadPoolTaskExecutor taskExecutor new ThreadPoolTaskExecutor();// 设置线程池属性
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(25);// 设置其他属性...// 初始化线程池
taskExecutor.initialize();// 提交任务给线程池执行
taskExecutor.execute(() - {// 执行的任务逻辑
});3.4、“ScheduledExecutorService” 接口 用于执行延迟任务或定期任务 “newScheduledThreadPool(int corePoolSize)”创建一个可调度的线程池可以执行定时或延迟任务 3.5、ForkJoinPool 用于执行 Fork-Join 任务通过拆分任务并行执行来提高性能 不同的线程池创建方式适用于不同的场景和需求可以根据具体的应用情况选择合适的方式创建线程池 4、什么是回调函数
回调函数是一种常见的编程概念它在事件驱动编程、异步编程等场景下非常常见指的是在特定条件满足或事件发生时执行的函数。在编程中回调函数通常作为参数传递给其他函数以便在需要时被调用执行
举个最简单的示例在图形化界面编程和前端中就经常用到回调函数比如当用户点击按钮时可以将处理点击事件的函数作为回调函数传递给按钮的事件监听器。当按钮被点击时事件监听器会调用这个回调函数
又比如我之前写过一个mq的项目里面我专门定义了一个函数式接口来存放回调函数因为函数式接口与普通接口不同其中只可以有一个抽象方法虽然定义接口时不可以直接写方法体但可以有参数而且后续使用时可以用Lambda表达式等方式实现函数式接口。我当时直接把这个接口当作参数new出来后直接大括号在里面把回调函数实现了然后把这整个当作参数传递了还挺方便的
5、什么是函数式接口函数式接口与普通接口的区别
函数式接口是Java中的一个特殊类型的接口它仅包含一个抽象方法(除了默认方法、静态方法或来自 “Object” 类的 “public” 方法)。函数式接口可以被Lambda表达式实现口语化不需要记当然也可以后续new接口的时候在小括号内加个大括号大括号内放重写的方法
函数式接口特点
单一抽象方法函数式接口只包含一个抽象方法。他的特点是只能有一个抽象方法但可以包含多个默认方法静态方法或来自 “Object” 类的 “public” 方法FunctionalInterface注解函数式接口通常都会使用 “FunctionalInterface” 注解标识。这个注解可以让编译器帮助检查这个接口是否符合函数式接口的定义Lamabda表达式支持函数式接口可以被Lambda表达式所实现。Lambda表达式提供了一种简洁的方式来创建函数式接口的实例
注也可以通过其他方式实现
普通接口特点
多个抽象方法普通接口可以包含多个抽象方法没有 FunctionalInterface 注解普通接口没有 FunctionalInterface 注解的限制它可以包含多个抽象方法并且不要求只有一个抽象方法 函数式接口和普通接口在设计和使用上有明显的差异函数式接口更注重于函数式编程鼓励使用 Lambda 表达式和函数式思维。而普通接口则更通用可以包含多个方法用于更广泛的场景。其实相对于两者的格式往往是两者的使用场景不同而造成我们关注的真正意义上的 “不同” 6、 什么是反射 反射是Java语言的特征之一它允许运行中的Java程序对自身进行检查或者说 “自审”并能直接操作程序的内部属性和方法(当然反射并不是Java独有的许多编程语言都提供了反射功能) 通俗地讲一提到反射我们就可以想到镜子。镜子可以明明白白地照出我是谁还可以照出别人是谁。反映到程序中反射就是用来让开发者知道这个类中有什么成员以及别的类中有什么成员
其实反射的经典用处之一在于通过反射实现某些本不可能实现的功能我们知道private修饰的属性是只能在类和对象内部访问的但是有些时候我们需要获得这个“私有的”方法或属性但是又不想破坏这个属性的修饰权限和范围那我们就可以使用反射动态地获取到这个类的信息并能够进行访问甚至修改
其实我们常见的Spring托管对象的操作和JUnit框架的某些操作等本质也是利用了反射
可以说反射无处不在只是我们真正敲出明面上就是反射的代码少
注反射是面试经常考的而且相关的知识有特别多真正想细致地去了解反射以及反射的用法等需要专门去搜寻
7、Java中的集合
Java集合分三种分别是 List、Set、Map这三种集合适用于不同的场景
List适用于有序可重复的集合Set适用于不可重复集合Map适用于键值对的存储
注通常List与Map最为常用
List 常见的实现类ArrayList(列表) 、 LinkedList(链表)Set 常见的实现类HashSet、LinkedHashSet和TreeSetMap 常见的实现类HashMap 、 TreeMap 与 HashTable
上面的实现类大多都是线程不安全的因此Java也提供了对应的线程安全版本
比如 List 中的 Victor、CopyOnWriteArrayList等Set本身就用的少所以线程安全的Set实体类用的更少我确实没太记得住个人感觉记这个不如到时候查询性价比高(面试可以这样说一般不会让面试官感觉你不会)比如Map中的HashTable当然这个太古老了用的很少但是另一个 ConcurrentHashMap 用的非常多ConcurrentHashMap 也是线程安全的当然也有其他实现方式看具体使用情况选择合适的实现类就好
详细总结(注意事项) 关于第一个问题 “字符串相关的函数” 当时回答了几个经典的比如 valueOf 等下意识地忽略了简单的length、 contains等平常使用的时候下意识就写出来了有的写代码过程中没有想起来也直接查询后就使用了所以答得并不好 关于第二个问题 “抽象类和接口的区别”这个答得还可以但是面试的时候确实有些平常都知道的东西没想起来(这个问题其实真的属于纯八股了) 关于第三个问题 “Java有几种创建线程池的方式分别是什么有什么不同”这个答得就非常不好了真的平常光知道用了 关于第四个问题和第五个问题 “什么是回调函数” “什么是函数式接口函数式接口与普通接口的区别” 确实当场没想起来 关于第六个问题 “什么是反射”我当时回答了反射怎么用什么时候用为什么要用也都回答的可以但面试官说这不是他想听到的他想听到的只是反射的定义好吧~ 这个怪我自己平时确实没注意这些八股只知道用了 关于第七个问题 “Java中的集合”只能说回答的勉强凑合忘记List、Set、Map都是集合了 面试官如果问Spring的八股我还能答得不错如果问我项目我能答得非常优秀但他直接就不问我项目开场我自我介绍就主要说了我项目能力比较好然后他来了句 “好那我既然看你一直在讲你的项目那今天咱不提问项目提问点Java基础”然后 我就挂了~ 个人情绪等无关重要的在此就不总结了最后提一句话即便简历不怎么样也能搞几次大厂面试的机会所以面试更重要的说白了就是八股其次算法和项目项目反而是最不重要的 加油背八股 正是时间好过年发的此篇文章在此祝大家新的一年 万事顺遂