java基础复习(第八日)

这篇具有很好参考价值的文章主要介绍了java基础复习(第八日)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java基础复习(八)

面试题:健某科技

两年至三年的经验

8-12 专科行业默认比本科默认低2-3

1.说说String?
  • 引用类型

常用方法

  • 长度:length
  • 指定:charAt(int index);//传递一个下标参数,返回字符串对应位置的字符
  • 指定某个字符返回第一个位置:indexOf()
2.StringBuffer和StringBuilder的区别(String的操作类)

StringBuffer和StringBuilder都是用于处理字符串的类,都可以进行动态的字符串操作。

StringBuffer是线程安全的,适用于多线程环境;StringBuilder则不是线程安全的,适用于单线程环境或者确定不会被多个线程同时访问的场景

性能是StringBuilder比StringBuffer好,没有Synchronized修饰

3.说说java数组?

当时我是有点傻眼的,我是知道数组 我不知道问的是 数组的含义 还是像arrayList 动态数组

数组 分静态数组、动态数组,如下面静态:

数组其实就是一个存储数据长度固定的容器,它可以保证多个数据的数据类型要一致。有三种的定义方式:

int[] arr = new int[6];这是定义存储6个整数的数据容器。

int[] arr = new int[]{1,2,3,4,5};这是定义存储1-5整数的数组容器。

int[] arr = {1,2,3,4,5};定义了1-5的整数的数组容器,开实际中较为常用的一种方式。

动态如:

ArrayList

ArrayList<String> strings = new ArrayList<>();

遍历方法:

迭代器或for

import java.util.ArrayList;
import java.util.Iterator;

//删除指定的元素
ArrayList<Integer> strings = new ArrayList<>();
    Iterator<Integer> it = strings.iterator();
    while (it.hasNext()){
      Integer next = it.next();
      if(next == 100){
        it.remove();
      }
    }
4.线程的了解
  • 线程的生命周期:新建、可运行、阻塞、等待、计时等待、被终止

    • 1、NEW(新建):线程刚被创建,但是未被启动;
    • 2、RUNNABLE(可运行):线程已经调用start()等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
    • 3、BLOCKED(阻塞):在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
    • 4、WAITING(等待):正在等待另一个线程执行特定的动作的线程处于这个状态。
    • 5、TIMED_WAITING(计时等待):正在等待另一个线程执行动作达到指定等待时间的线程处于这个状态
    • 6、TERMINATED(被终止):已退出的线程处于此状态。
  • 线程的创建方法

    • 继承Thread类
    • 实现Runnable接口
    • 实现Callable接口
    • 两个区别:Callable能返回结果有异常抛出,结和Futrue能拿到返回值
    • 线程池
      • 任务拒绝策略四种
      • ThreadPoolExecutor.AbortPolicy() //默认策略:丢弃任务并抛出RejectedExecutionException异常
      • ThreadPoolExecutor.DiscardPolicy() //丢弃任务,但是不抛出异常 这是不推荐的做法
      • ThreadPoolExecutor.DiscardOldestPolicy() //抛弃队列中等待最久的任务 然后把当前任务加入队列中
      • ThreadPoolExecutor.CallerRunsPolicy() //调用任务的run()方法绕过线程池直接执行
//核心3 最大10线程等200秒,等待100,饱和直接调用线程
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 10,
200, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), new ThreadPoolExecutor.CallerRunsPolicy());
5.mysql 计划分析(EXPLAIN)

explain SQL语句

索引优化:关注 possable_key、key、key_len字段,确保使用合适的索引,并且索引长度足够短

表关联优化:关注 type 字段,避免全表扫描 ALL,考虑添加索引或优化

子查询优化:关注select_type 字段,避免使用子查询导致全表扫描 ALL,使用join 操作替代

分区表优化:关注 partitions 字段, 尽量查询必要的分区,避免全表描述

SQL语句优化: 关注 row 和 filtered 字段 尽量减少扫描的行和过滤的行数,可以通过优化查询条件。推荐合适的索引d等方式实现

6.redis 三大场景

redis文章第三章

  • 缓存穿透(key对应的数据,缓存和数据源不存在)
    • 1.对空值缓存
    • 2.设置可访问的名单(白名单)
    • 3.采用布隆过滤器
    • 4.进行实时监控(黑名单)
    • 5.接口层增加校验
    • SpringCache 解决方案
      • 空结果也缓存,默认不配置condition或者unless就 ⾏
cache:
     #使⽤的缓存类型
     type: redis
     #过时时间
     redis:
     time-to-live: 3600000
     # 开启前缀,默以为true
     use-key-prefix: true
     # 键的前缀,默认就是缓存名cacheNames
     key-prefix: XD_CACHE
     # 是否缓存空结果,防⽌缓存穿透,默以为true
     cache-null-values: true
  • 缓存击穿(缓存过期,大并发请求瞬间击垮DB)
    • 1.预热(设置热门数据,延长时间,如不过期)
    • 2.实时调整(监控热门时间,延长时间)
    • 3.定时任务定时更新缓存
    • 3.使用互斥锁
    • SpringCache 解决方案
      • 缓存的同步Sync
      • sync 可以指示底层将缓存锁住,使只有⼀个线程可以 进⼊计算,⽽其他线程堵塞,直到返回结果更新到缓存 中
@Cacheable(value = {"product"},keyGenerator = "springCacheDefaultKeyGenerator",cacheManager = "cacheManager1Minute",sync = true)
  • 缓存雪崩(大批key 缓存失效,大并发请求瞬间击垮DB)

    • 1.构建多级架构:nginx 缓存 + redis 缓存 + 其他缓存(ehcache等)
    • 2.使用锁或队列
    • 3.设置过期标志更新缓存
    • 4.缓存失效时间分散(随机值)
    • 5.热点数据不过期
    • 6.定时任务定时更新缓存
    • SpringCache解决方案
      • 设置差别的过时时间
      • ⽐如CacheManager配置多个过期时间维度
      • 配置⽂件 time-to-live 配置
cache:
     #使⽤的缓存类型
     type: redis
     #过时时间
     redis:
     time-to-live: 3600000
     # 开启前缀,默以为true
     use-key-prefix: true
     # 键的前缀,默认就是缓存名cacheNames
     key-prefix: XD_CACHE
     # 是否缓存空结果,防⽌缓存穿透,默以为true
     cache-null-values: true

JVM 底层面试题

7.解析 Java 堆空间及GC?

当通过 Java 命令启动 Java 进程的时候,会为它分配内存。

内存的一部分用于创建堆空间,当程序中创建的对象时候,就从对空间中分配内存。

GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配

8. 你能保证 GC 执行吗?

不能,可以调用 System.gc() 或者 Runtime.gc(),没办法保证 GC的执行

9.Java 中堆和栈有什么区别?

JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享

10. 常用的JVM调优命令
  • jps:该命令查询当前系统中正在运行的java进程,可以获取进程的PID(进程ID)

  • jstat:监视JVM统计信息命令。获取到堆、垃圾回收、类加载器、编译等相关的数据

  • jcmd:命令行工具,用于执行各种JVM相关的操作,如生成线程转储快照。执行GC、执行JIT编译等

  • jinfo该命令用于获取正在运行的Java进程的系统属性和JVM参数。通过jinfo命令,我们可以查看和修改JVM的运行参数,如堆内存大小、垃圾回收器等文章来源地址https://www.toymoban.com/news/detail-678001.html

到了这里,关于java基础复习(第八日)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java基础复习(第五日)

    1.如何在Map中遍历删除指定的 key? 如何在List 中遍历删除指定的元素? 两个方法都使用iterator解决 过程: 获取 map/list的iterator whlie(iterator.hasNext){ //获取下一个元素 entry = iterator.next(); if(entry.getKey == 指定的值) ​ iterator.remove() } 并发注意加锁 2.请构造一个线程池。要求并发数量

    2024年02月14日
    浏览(31)
  • 复习java基础

    结构化程式设计(英语:Structured programming)是1960年代开始发展起来的一种编程典范。它采用子程序、程式码区块、for循环以及while循环等结构来取代传统的goto。 自顶向下、逐步求精、模块化 流程图是流经一个系统的信息流、观点流或部件流的图形代表。在企业中,流程图主要用

    2024年02月16日
    浏览(34)
  • java基础复习(第七日)

    1.MQ如何避免消息重复投递或重复消费? 在消息生产时,MQ 内部针对每条生产者发送到消息生成一个 inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列; 在消息消费时,要求消息体中必须要有一个 bizId(对于同一业务全局唯一,如支付ID、订单

    2024年02月11日
    浏览(41)
  • java基础复习(第六日)

    1.是否了解类似 RabbitMQ.kalka 之类的队列服务? 请简述队列取务中的常见要素和使用场景? 了解,队列服务是一种应用间的通信方式,可以实现异步处理、应用解耦、流量削峰和消息通信等功能 队列服务的常见要素:生产者、消费者、消息处理中心和队列 生产者负责发送消息

    2024年02月14日
    浏览(38)
  • Java ---基础知识& 期末复习

    1.Java是低级语言还是 高级语言    答:高级语言。 2.Java是面向对象的程序设计语言吗 答:是。 3. Java是编译型的计算机语言还是解释型的计算机语言。 答: 一种说法:Java是编译型的。因为所有的Java代码都是要编译的,.java不经过编译就无法执行。 另一种说法:Java是解释型

    2024年01月16日
    浏览(62)
  • Java基础复习笔记详细版

    语言 = 语法 + 逻辑 硬件:CPU、内存、硬盘、输入设备、输出设备、调制解调器 软件 软件:即一系列按照 特定顺序组织 的计算机 数据 和 指令 的集合。 有 系统软件 和 应用软件 之分。 系统软件:windows、mac os、android、ios、linux 应用软件:qq、微信、音乐播放器等 图形化界

    2024年02月10日
    浏览(31)
  • Java基础之复习笔记(上)

    目录 一、Java是什么?  💖Java概念  💖Java运行机制 二、Java的语言基础 💖 💖基本数据类型  💖运算符 三、Java逻辑控制 💖分支结构 💖循环结构 四、Java的方法 💖方法的定义 💖方法的重载 💖方法的递归  五.Java数组 💖一维数组 💖二维数组 六.类与对象 💖 基

    2024年02月16日
    浏览(45)
  • Java基础点复习-----LinkedList

    1.你需要通过循环迭代来访问列表中的某些元素。 需要频繁的在 列表开头、中间、末尾 等位置进行 添加和删除 元素操作。 LinkedList 继承了 AbstractSequentialList 类。 LinkedList 实现了 Queue 接口,可作为队列使用。 LinkedList 实现了 List 接口,可进行列表的相关操作。 LinkedList 实现

    2024年01月17日
    浏览(32)
  • java基础知识点复习①

    java是一门开源的面向对象的编程语言,具有面向对象的封装、继承、多态的特点。 封装:将类的某些信息隐藏起来,只提供特定的方法来访问或修改这些隐藏信息,从而防止直接操作类中的某些属性。是通过访问权限修饰符来实现封装的,public——protected——default——pri

    2023年04月22日
    浏览(52)
  • Java集合基础知识点复习

    主要分为两类: 第一个是Collection 属于单列集合,第二个是Map 属于双列集合在Collection中有两个子接口List和Set。在我们平常开发的过程中用的比较多像list接口中的实现类ArrarList和LinkedList。 在Set接口中有实现类HashSet和TreeSet。 在map接口中有很多的实现类,平时比较常见的是

    2024年04月08日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包