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 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的运行参数,如堆内存大小、垃圾回收器等

你可能感兴趣的:(java,开发语言)