java开发基础知识复习

Linux常用命令  Linux常用命令_胶泥座人的博客-CSDN博客

1、左连接,右连接,内连接区别

左连接以左边的为主表,右连接以右边的为主表,内连接不以谁为主表满足条件的全显示。

2、常用设计模式

单例模式  JAVA设计模式之单例模式_炸斯特的博客-CSDN博客_单例模式

单例类只能有一个实例,单例类必须自己创建自己的单例类,必须给所有其他对象提供这一实例唯一实例,选择单例模式就是为了避免不一致状态,避免政出多头

a、懒汉模式
//懒汉式单例类.在第一次调用的时候实例化自己 
public class Singleton {
    private Singleton() {}
    private static Singleton single=null;
    //静态工厂方法 
    public static Singleton getInstance() {
         if (single == null) {  
             single = new Singleton();
         }  
        return single;
    }

如何做到线程安全?

静态内部类

public class Singleton {  
    private static class LazyHolder {  
       private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
       return LazyHolder.INSTANCE;  
    }  

b、饿汉模式

饿汉式单例

//饿汉式单例类.在类初始化时,已经自行实例化 
public class Singleton1 {
    private Singleton1() {}
    private static final Singleton1 single = new Singleton1();
    //静态工厂方法 
    public static Singleton1 getInstance() {
        return single;
    }
}
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

工厂模式     自己理解的java工厂模式,希望对大家有所帮助 - 涤新云 - 博客园

简单工厂模式就是创建具有相同特征的类的实例,然后把创建汽车的方法静态化,这样就可以直接用工厂生产了

工厂方法模式, 首先我们把生产汽车的工厂类抽象出来当成一个接口,这样做的好处就是如果我还要生产一个长城汽车,不用去修改CarFactory这个工厂,只需要再写个长城工厂类去实现CarFactory这个接口就可以了

抽象工厂模式是创建多个产品族的产品对象

门面模式  门面(Facade)模式 - Sky Wang - 博客园

外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。

MVC设计模式   浅谈什么是MVC设计模式_ricky73999的博客-CSDN博客_简答描述mvc设计模式

Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

观察者模式

3、wait ()和sleep()的区别

sleep,wait调用后都会暂停当前线程并让出cpu的执行时间,sleep是让线程休眠,不是释放对象锁,到时间后会继续执行,wait是等待时释放线程锁,需要notify()唤醒,新获取到对象锁,再继续执行

4、jvm调优    JVM垃圾回收与性能调优总结_haozi_ncepu的博客-CSDN博客

主要是对堆内存和垃圾回收配置进行优化

线程池

连接池

JVM启动参数:调整各代的内存比例和垃圾回收算法,提高吞吐量

程序算法:改进程序逻辑算法提高性能

5、接口和抽象类区别  百度安全验证

a.抽象类中可以有一个或多个抽象方法,而接口中的方法必须都是抽象方法

b.接口中定义方法和成员变量和抽象类中定义方法和成员变量

接口中成员变量默认被修饰为public static final常量

c.接口最大的一个特点就是可以实现多继承,而抽象类只能继承一个(应该说java中只要是类就只能单继承)

d.抽象类和方法必须使用abstract关键声明为抽象,而接口中的方法默认被修饰为public abstract类型(默认为公开抽象的方法)

6、string,stringBuffer,stringbuild 的区别

String 字符串常量     (操作少量的数据,主要用于定义字符串对象,字符串基本不变的情况下 )
StringBuffer 字符串变量(线程安全) (多线程 操作字符串缓冲区下操作 大量数据,主要用于字符串不断在变的)

StringBuilder 字符串变量(非线程安全)(单线程 操作字符串缓冲区下操作 大量数据)(为什么线程不安全?StringBuilder中的append方法没有使用synchronized关键字就表示多线程可以同时访问这个方法,后访问的会把前面的覆盖掉的)

三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

String 类型的改变,本质上是 生成了一个新的 String 对象,并改变引用,指向新对象

(不断的改变,相当于产生了大量无用对象,增加GC压力,浪费性能)

StringBuffer 对象本身进行操作;而不是生成新的对象 ,再改变对象引用;主要用于字符串的拼接

7、ArrayList和LinkedList的大致区别

a.ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
b.对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。ArrayList查询快。
c.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
8、Spring IOC 和AOP原理

IOC:控制反转也叫依赖注入。利用了工厂模式

将对象交给容器管理,你只需要在spring配置文件中配置对应的bean以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。

Ioc 控制反转/依赖注入, 主要是对象的解耦,将对对象的控制权交给容器,包括对象的创建和销毁等,我们只需要关注业务逻辑

ioc容器对bean的管理方式:

      1>beanFactory ; 2>applicationContext; 注意 applicationContext extends beanFactory!

AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码

aop实现原理其实是java动态代理,但是jdk的动态代理必须实现接口,所以spring的aop是用cglib这个库实现的,cglib使用了asm这个直接操纵字节码的框架,所以可以做到不实现接口的情况下完成动态代理。而对于无接口的类或者是抽象类使用cglib, 虽然cglib均可代理,但是其复杂效率低,不能有final方法!

9、SpringMVC原理

SpringMVC实现原理及详解_yanweihpu的博客-CSDN博客_springmvc原理

10、hashmap原理   HashMap原理深入理解_visant的博客-CSDN博客_hashing原理

底层结构是数组+链表形式,它内部是基于哈希表实现的键值对存储,继承 AbstractMap 并且实现了 Map 接口

数组:存储区间连续,占用内存严重,寻址容易,插入删除困难; 
链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易; 
Hashmap综合应用了这两种数据结构,实现了寻址容易,插入删除也容易。 

基本原理:先声明一个下标范围比较大的数组来存储元素。另外设计一个哈希函数(也叫做散列函数)来获得每一个元素的Key(关键字)的函数值(即数组下标,hash值)相对应,数组存储的元素是一个Entry类,这个类有三个数据域,key、value(键值对),next(指向下一个Entry)。 

HashMap的工作原理 :HashMap是基于散列法(又称哈希法hashing)的原理,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket(桶)位置来储存Entry对象。”HashMap是在bucket中储存键对象和值对象,作为Map.Entry。并不是仅仅只在bucket中存储值。

11、HashMap、Hashtable、ConcurrentHashMap的原理与区别    面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别 - 猿人谷 - 博客园

HashTable

  • 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化
  • 初始size为11,扩容:newsize = olesize*2+1
  • 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length

HashMap

  • 底层数组+链表实现,可以存储null键和null值,线程不安全
  • 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂
  • 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入
  • 插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)
  • 当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀
  • 计算index方法:index = hash & (tab.length – 1)

ConcurrentHashMap

  • 底层采用分段的数组+链表实现,线程安全
  • 通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。)
  • Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术
  • 有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁
  • 扩容:段内扩容(段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个Map进行扩容),插入前检测需不需要扩容,有效避免无效扩容

12、java中String类为什么不可变?

a、不可变对象,顾名思义就是创建后的对象不可以改变,典型的例子有java中的String类型。

b、相比于可变对象,不可变对象有很多优势:

  (1)不可变对象可以提高String Pool(字符串常量池)的效率和安全性。如果你知道一个对象是不可变动 ,那么需要拷贝的对象的内容时就不用复制它本身二只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存,效率也很好。二对于其他引用同一个对象的其他变量也不会造成影响。

  (2)可不变对象对于多线程滴安全的,因为在多线程同事进行的情况下,一个可变对象的值很可能被其他线程改变这样会造成不可预期的结果么人使用不可变对象就可以避免这种情况出现。

java将String设成不可变最大的原因是效率和安全。

13、重写和重载区别?

override(重写)

   1、方法名、参数、返回值相同。

   2、子类方法不能缩小父类方法的访问权限。

   3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。

   4、存在于父类和子类之间。

   5、方法被定义为final不能被重写。

 overload(重载)

  1、参数类型、个数、顺序至少有一个不相同。 

  2、不能重载只有返回值不同的方法名。

  3、存在于父类和子类、同类中。

14、Object类有哪些方法?各有什么作用?  Object类有哪些方法?各有什么作用?_ta山之石可以攻玉的博客-CSDN博客_object有哪些方法

15、实现多线程的4种方式  JAVA多线程实现的四种方式 - 大数据从业者FelixZh - 博客园

继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。

其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。

16、synchronize实现原理    404

17、MySQL索引失效的几种情况   MySQL索引失效的几种情况 - 且过 - 博客园

18、总结get和post区别   总结get和post区别---面试用 - o笨小孩o - 博客园

  • get参数通过url传递,post放在request body中。

  • get请求在url中传递的参数是有长度限制的,而post没有。

  • get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。

    • get请求只能进行url编码,而post支持多种编码方式

    • get请求会浏览器主动cache,而post支持多种编码方式。

    • get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
       

  • GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
  • GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

19、 Http与Https的基本概念和他们的区别   https://blog.csdn.net/zhttly/article/details/82895713

http的中文叫做超文本传输协议,它负责完成客户端到服务端的一系列操作,是专门用来传输注入HTML的超媒体文档等web内容的协议,它是基于传输层的TCP协议的应用层协议

https:https是基于安全套接字的http协议,也可以理解为是http+ssl/tls(数字证书)的组合

http和https的区别:

HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头
HTTP 是不安全的,而 HTTPS 是安全的
HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443
在 OSI 网络模型中,HTTPS的加密是在传输层完成的,因为SSL是位于传输层的,TLS的前身是SSL,所以同理
HTTP无需认证证书,而https需要认证证书 

20、Redis 支持的数据结构类型

String(字符串)、List(列表)、Set(集合)、Hash(哈希)、Zset(有序集合)

21、springbean是单例吗

是,Spring框架中的Bean,或者说组件,获取实例的时候都是默认单例模式

22、接口中可以定义成员变量吗,默认是什么类型的变量

     public static final

23、如果想要在某些自己指定的某些方法前后打印日志怎么实现

java注解结合aspectj AOP进行日志打印_lijie_cq的博客-CSDN博客

24、Nginx    nginx最常见的18道面试题 - old_bird - 博客园

25、为什么重写equals方法最好也得重写hashcode   为什么重写equals时必须重写hashCode方法? - 乐之者v - 博客园

26、闭包  什么是闭包(closure),为什么要用它? - MrLQZ - 博客园

特性:

1.函数内再嵌套函数
2.内部函数可以引用外层的参数和变量
3.参数和变量不会被垃圾回收机制回收

27、面试及学习建议    https://blog.csdn.net/fanx_000/article/details/80297487

(基础->spring/springmvc/mybatis/数据库、缓存->消息中间件(activemq、kafka...)->(后面的仅代表个人看法,未知领域...)springboot、微服务、docker/分布式、zookeeper、rpc/大数据相关)


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值