基础必备知识

基础必备知识

1、语言基础

1.1 Java基本数据类型及长度

类型占存储空间
byte1字节
boolean1个bit位
short2字节
char2字节
float4字节
int4字节
long8字节
double8字节

1.2 位运算

位运算符作用
&两个操作数都为1,结果为1 ,否则为 0
|两个操作数的位只有一个为1结果就为1,否则为0
~取反运算,0取反为-1,1取反为-2
^异或运算 ,相同为0 不同为1
<<左移
>>右移
>>>忽略符号位右移
//利用位运算求两个int类型整数求和
while(b != 0){
   int _a = a ^ b;
   int _b = (a & b) << 1;
   a = _a;
   b = _b;
}
return a;
//a+=b 和 a=a+b有什么区别
byte a = 20;
byte b = 19;
b+=a;
b=a+b; //报错
//Object中有哪些方法
private static native void registerNatives();
protected  native Object clone();
protected  void  finalize(); 
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj);
public String  toString();  //返回当前类的名字 + @ + hashCode值的16进制数

1.3 jdk1.8的新特性

Lambda表达式
常用方法:

  1. filter()
  2. count()
  3. limit()
  4. skip()
  5. map()
  6. concat()
  7. forEach()
  8. collect()

Date 与 Time API,稳定的日期与时间库
接口中可以有静态,默认的方法

1.4 内存模型

内存区域:
     1、方法区、堆 (线程共享)
     2、虚拟机栈、本地方法区、程序计数器(生命周期和线程同步,不需要GC)
堆存放所有对象的实例以及数组,是重点GC对象

方法区存放了要加载的类信息(名称、修饰符)、类中的静态常量、类中定义位final类型的常量、Field信息、方法信息,当程序中通过Class对象的getName.isInterface等方法来获取对象时,这些数据都是来自于方法区,它存储的信息相对比较稳定,在一定条件下才会被GC

1.5 GC回收,双亲委派模式

主要的GC是堆的垃圾回收,如果一个对象没有任何引用,那么它将会被回收。
一般采用引用计数法 和 可达性分析发(根搜索发)来判断对象是否存活。

GC ROOTS对象向下搜索,判断是否有引用链

  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

1.6 内存泄漏,内存溢出

内存泄漏memory leak,内存泄漏是指程序在申请内存后,无法释放已经申请的内存
内存溢出out of memory,是指程序在申请内存时,没有足够的内存空间供其使用
jmap -dump:format=b,file=dumpFileName pid

2、框架集合

2.1 Java提供的集合关系图

框架集合图

2.2 HashMap和HashTable和ConcurrentHashMap有何不同,ArrayList和Vector和LinkedList有何区别(Hash系讲一下源码)

HashMap常见的K-V存储集合,但是在多线程环境下,线程不安全。

  1. 判断当前桶是否为空值,空的话就需要初始化
  2. 根据当前的key的hashCode定位到具体的桶并判断是否为空,为空表明没有Hash冲突直接在当前位置创建一个新桶即可
  3. 如果当前桶有值,也就是发生了Hash通途

2.3 hash碰撞、冲突、散列函数

3、多线程

3.1 撸代码保证线程执行顺序

3.2 进程线程区别(概念问题)

3.3 Java中CountDownLatch 和 CycliBarrier区别,Runnable和Callable区别

3.4 线程状态,如何终止线程,volatile原理实现和使用场景

3.5 手撸生产者消费者模型

3.6 ThreadLocal 、FutureTask、interrupt、interrupted、isInterrupted

3.7 线程池,创建线程池的五个核心参数

3.8 sleep 和 wait的区别

3.9 fail-fast 和 fail-safe

3.10 性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用和注意事项

3.11 synchronized 和 ReentrantLock

3.12 fork join框架

3.13 偏向锁、轻量级锁、重量级锁

3.14 Java的原子操作,CAS

4、JavaWeb

4.1 四种请求方式的区别

4.2 tomcat内存优化

4.3 状态码、TCP、UDP

5、linux常用命令

6、Mysql

6.1 乐观锁与悲观锁的区别?

6.2 索引、事务隔离级别、存储引擎、主从库不一致怎么解决

7、redis

7.1 redis的数据结构

7.2 redis的持久化机制

7.3 热点数据

7.4 redis常见的性能问题和解决方案

7.5 redis的并发竞争问题如何解决

7.6 redis事务的命令和特征

8、Spring

8.1 IOC实现关键源码、和DI的区别

8.2 什么是aop

8.3 Springbean实例化,作用域,生生命周期,事务管理,事务的隔离级别和传播行为

8.4 BeanFactory和ApplicationContext有什么区别?

8.5 JDK动态代理和Cglib动态代理的区别

8.6 如何解决循环依赖

8.7 @Transactional的使用

8.8 获取Spring容器的常用4种方式

8.9 Spring支持的三种依赖注入方式

9、Mybaties

9.1 原理

9.2 mybaties和映射文件的关系

9.3 延迟加载、缓存、Excutor执行器、分页插件

10、Springboot

10.1 核心配置,启动流程,配置文件格式,核心注解

10.2 日志框架、热部署、配置加载顺序

10.3 Springboot2.0 和Springboot1.0有什么区别

11、微服务SpringCloud全家桶

11.1 和Dubbo有什么区别

11.2 服务熔断和服务降级

11.3 Eureka和Zookeeper服务注册与发现有什么区别

  1. 熟悉哪几种设计模式?他们之间的区别?
  • 单例模式: 对象的创建模式,保证了JVM中只存在一个实例对象,可以减少GC,较少对象存储资源。缺点: 不可继承,没有接口。
  • 工厂模式: 提供一种创建对象的最佳方式,接口提供类别,实现类生产具体对象。
public interface car{
    public car getcar();
}
public class bmCar implements car{
    public car getcar(){
       return new bmCar();
    }
}
  • 建造者模式: 在需要生成复杂内部结构时使用,即将多个简单的对象一步一步构建称为一个复杂对象
  • 适配器模式: 继承或者依赖已有的对象,消除由于接口的不匹配而导致的不兼容问题。分为类的适配器、对象的适配器、接口的适配器
  • 装饰器模式: 在原来的接口和实现类添加方法,构成一个新的实现类
  • 代理模式: 把目标方法交给代理去执行,和适配器的区别: 适配器主要是为了去修改接口定义的方法,以为了去适配更多的功能,而代理模式不改变接口方法。和装饰器的区别: 装饰器是为了增强功能,而代理模式是为了加强控制
  • 观察者模式: 对象间一对多的依赖关系,当一种对象发生改变的时候,其他所有依赖他的对象都得到通知,并发生对应的改变,
  1. 手写单例模式?
  • 首先要考虑什么是单例模式?为什么要用单例模式?
    单例模式是一个创建对象模式,只产生一个实例对象。使用单利模式的目的是减少相同对象的个数,进而减少GC,减少内存占用。
  • 饥饿模式(先以类的实例对象作为类的全局变量,即类初始化的时候就在内存中存在实例对象)
public class EalerSingleton{
	private static instance = new EalerSingleton();
    private EalerSingleton(){}
    public static getSingleton(){
        return  instance;      			
    }
}
//优点:线程安全,但是需要提前创建实例
  • 线程安全的饥饿模式
public class Singleton{
      private static class SingletonHolder(){
          private static Singleton instance = new Singleton();
      }
      private Singleton(){}
      public Singleton getInstance(){
           return SingletonHolder.instance;
      }
}
  • 线程安全的懒汉模式
public class LazySingleton{
    private static LazySingleton instance = null;
    private LazySingleton(){}
    public synchronized LazySingleton getInstance(){
        if(null == instance ){
           instance = new LazySingleton();
        }
        return instance;
    }
    
}
//缺点:只有在第一次创建的时候才会走判断,所以可以考虑减小锁的力度
  • 高效一点的懒汉单例模式
public class LazySingleton{
    private static LazySingleton instance = null;
    private LazySingleton(){}
    public LazySingleton getInstance(){
        if( null == instance ){
           synchronized(LazySingleton.class){
               LazySingleton temp = instance;
               if( null == temp ){
                  synchronized(LazySingleton.class){
                     temp = new LazySingleton();
                  }
               }
               instance = temp;
           }
        }
        return instance;
    }
}
//可以解决指令重排序问题,用以下这种也可以
public class LazySingleton{
    private static volatile LazySingleton instance = null;
}

  • 通用型的单例模式
public class SingleParent{
     private static Map<Class<? extends SingleParent> , SingleParent> INSTANCE_MAP = new HashMap();
     private SingleParent(){}
     public synchronized static <E extends SingleParent>SingleParent getInstance(Class<E> instanceClass){
     if(INSTANCE_MAP.containsKey(instanceClass)){
         return INSTANCE_MAP.get(instanceClass);
     }else{
         SingleParent instance = instanceClass.newInstance();
         INSTANCE_MAP.put(instanceClass,instance);
         return instance;
     }
     }    
}
  1. 常见的http状态码?
  • 200:请求成功
  • 204:请求处理成功,但是没有任何资源返回给客户端
  • 206:部分请求
  • 301:永久重定向
  • 302:临时重定向
  • 303:GET临时重定向
    当301、302、303响应状态码返回的时候,所有的浏览器都会把POST改成GET,并删除请求报文内的主题。
  • 304:资源已找到,但是未符合请求头的请求条件
  • 400:请求语法错误
  • 401:需要HTTP协议认证信息
  • 403:被服务器拒绝
  • 404:服务器上没有请求的资源
  • 500:服务器内部错误
  • 502:网关错误
  • 503:服务器正忙

线程池

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,
          TimeUnit unit,BlockingQueue<Runnable> workQueue,
          ThreadFactory threadFactory,RejectedExecutionHandler handler)

corePoolSize - 池中所保存的线程数,包括空闲线程。

maximumPoolSize - 池中允许的最大线程数。

keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。

unit - keepAliveTime 参数的时间单位。

workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。

threadFactory - 执行程序创建新线程时使用的工厂。

handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Zemax进行光学设计工作,以下是零基础必备知识: 1. 光学基本原理:了解光的传播方式、折射、反射和干涉等基本光学原理,包括光线光学和波动光学。 2. 几何光学:熟悉几何光学的概念和原理,包括光的传播路径、光线的折射和反射、成像等基本概念。 3. 光学元件:了解典型的光学元件和它们的特性,如透镜、平板、棱镜、镜子等,并了解它们在光学系统中的功能。 4. 光学设计基础:熟悉光学设计的基本流程和常用方法,包括系统规划、光学元件选择和布局、成像质量评估等。 5. Zemax软件操作:学会使用Zemax进行光学系统的建模和分析,掌握软件的基本操作,如创建和编辑光学元件、设置光源和接收器、运行光线追迹和优化等。 6. 成像分析:掌握成像的基本原理和评估方法,包括MTF(调制传递函数)、RMS(均方根)波前误差、球差等参数的解释和应用。 7. 光学系统优化:了解常用的光学系统优化方法,如优化元件参数、优化光线路径、使用非旋转对称的布局等,以达到设计要求。 8. 光学材料:熟悉常见的光学材料的光学性质,如折射率、散射损失、色散等,并了解如何在Zemax中添加和使用这些材料。 9. 光学制造和检验:了解光学元件的制造和检验流程,包括表面加工技术、光学塑料制造等,以便更好地理解设计中的约束和限制。 10. 实践经验:通过实践和实际项目的经验积累,逐步掌握Zemax的高级功能和更复杂的光学系统设计技巧。 以上是有关Zemax零基础必备知识的简要介绍,希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值