Java基础

1.面向对象的特征:
封装,继承,多肽

2.final, finally, finalize 的区别
final关键字可以用来修饰 变量,方法,类 不可修改的
finally 与try catch 一起使用,表示一定会被执行的,通常会做一些释放资源的动作。当然这个一定会被执行是针对虚拟机还在运行的状态下而言的,如果存在 System.exit(0)那就 GG了
finalize 是Object中的方法,该方法是在gc启动后,对象被回收的时候调用的。

3.int 和 Integer 有什么区别
int是基本上数据类型,默认值是0,Integer是int类型的包装类,默认值是null
Integer和int做比较是会自动拆箱 Integer i = 128 和 int i1= 128 i=i1 true
Integer和Integer做比较时,在-128 和 127 之间 Integer会对数字进行缓存,第二次再次赋值的时候其实是拿的缓存的值(不是new)
涉及到new的不会相等,比较的时候不会涉及到拆箱过程

4.重载和重写的区别
overloading & overwrite
重载是在一个类中包含多个方法名称相同参数个数或者类型不同的方法
重写发生在子父类或者子类与接口中,方法名称,参数列表,返回值类型都相同
关于重写:子类不能重写父类中的final修饰的方法;子类不是抽象类,则必须实现父类中的abstract方法

5.抽象类和接口有什么区别
抽象类是用来捕捉子类通用特性的,不能被实例化,只能被用作超类
接口是抽象方法的集合,如果一个类实现某个接口,则它就继承了这个接口的所有抽象方法,必须全部实现。
区别:
1.抽象类可以有默认的方法实现,接口不可以
2.子类需使用extends关键字来继承抽象类,如果子类非抽象类,则需要重写抽象类中的所有方法, 接口的实现需要使用 implements 方法必须全部实现
3.抽象类可以有构造器,接口不能有
4.抽象类中方法的修饰符可以是public protected default 接口中默认是public 且无法使用其他修饰符

6.说说反射的用途及实现
java的反射机制是指在运行状态下,对于任何一个类,都可以根据它的字节码信息获取该类的所有属性,方法,对于任何一个对象,都可以调用他的任何一个方法,这种动态获取信息,动态调用方法的功能称之为反射机制
用途:JDBC数据库驱动的加载,根据Class构造对象

7.HTTP 请求的 GET 与 POST 方式的区别

1.get请求一般是从服务器获取数据,post是向服务器提供数据
2.get请求带参数需要将参数拼接到URL上 post会将参数封装在head中
3.get请求传输的数据量受不同浏览器影响,一般为2kb post请求传递参数不受限制
4.get请求安全性较低,post请求安全性较高
5.get请求浏览器会缓存数据,回退不会再次请求服务器, post请求的参数不会被缓存

http:基于TCP/IP的数据在万维网中如何通信的协议
Get和Post请求的底层也是TCP/IP 也就是说都是TCP连接,底层并无差别,应为Http规则和浏览器的限制,导致出现了一些不同点

8.session 与 cookie 区别

1.cookie数据存放在客户的浏览器上,session数据存放在服务器上
2.cookie不安全,数据存放在用户本地,存在被窃取进行cookie欺骗的风险
3.session会在一定时间内保存在服务器上,当访问量增多时,会增加服务器的性能消耗
4.单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie

9.JDBC 流程

1.加载数据库连接驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取数据库连接
Connection conn = DriverManager.getConnection(url, user, password);
3.根据SQL获取sql会话对象,有2种方式 Statement、PreparedStatement
conn.prepareStatement()
4.执行SQL处理结果集,执行SQL前如果有参数值就设置参数值setXXX()
5.关闭结果集,关闭会话,关闭连接

10.MVC 设计思想

MVC(Model View Controller) 是一种分层架构模式,包含三个核心部件:
Model: 模型 所有的用户数据、状态以及程序逻辑,独立于视图和控制器
View: 视图 呈现模型,视图会从模型中拿到需要展现的状态以及数据,对于相同的数据可以有多种不同的显示形式
Controller:控制器 负责获取用户的输入信息,进行解析并反馈给模型
优点:程序通过M和V的代码分离,实现了前后端代码分离,使项目开发的分工更加明确,各层之间的耦合性降低了,模型实现复用,可维护性高

11.equals 与 == 的区别
equals是Object类的方法,用于比较两个对象是否相等,我们一般判断POJO对象是否相等,注重的是对象的各个属性是否相同,这就需要重写equals方法,而 == 是java中的比较运算符,判断两个对象是否是同一个对象,比较的是地址值

集合

12.List 和 Set 区别

List和Set继承自接口Collection接口,
list中可以允许重复对象 set不可以
list中可以插入多个null
list是一个有序容器,保持了每个元素的插入顺序,输出顺序就是插入顺序
list的常用实现类有ArrayList LinkedList Vector

ArrayList 底层是数组结构,提供了使用索引随机访问的而方法,随机查询速度效率很高,但是如果包含大量新增元素或删除元素的场景,则效率不如LinkedList,涉及到数组的copy和复制
LinkedList底层是链表结构,每个元素会维护一个pre 和 next,个元素之间是手拉手的结构。

Set接口则不能有重复数据
无序,这里的无序指的是不会按照存入的顺序 输出
Set接口比较常用的几个实现类如下
HashSet,LinkedHashSet,TreeSet
HashSet的底层是HashMap 只是Map的value被设置成固定的数据
同样LinkedHashSet的底层也是LinkedHashMap,TreeSet的底层是TreeMap


13.List 和 Map 区别

List是单列集合,存储的数据有序且可重复,
Map是双列集合存值是Key-Value,存储的数据无序,key不可重复

Map常用的实现类有 HashMap TreeMap HashTable LinkedHashMap
HashMap 是最常用的Map,他根据键的hashcode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只能允许一条记录的键为null,允许多条记录的值为null,是线程不同步的。
TreeMap 能够把它保存的记录根据键排序,默认是按照升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap的时候,得到的记录是排过序的,TreeMap不允许key的值为null,线程不同步。
HashTable 与HashMap类似,不同的是Key 和 Value的值均不允许为null,它是线程同步的,因此HashTable的效率要低于HashMap
LinkedHashMap 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,key和Value可以为null,线程不同步

14.Arraylist 与 LinkedList 区别
ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表的数据结构,LinkedList是双向链表,有next也有previous
对于随机访问元素,无论是get和set,ArrayList的性能都会理论上优于LinkedList,因为LinkedList需要移动指针
对于新增和删除操作 add和remove LinkedList的性能理论比较占优势,

15.ArrayList 与 Vector 区别
1.Vector是线程安全的,ArrayList是线程不安全的,Vector对集合的元素操作都添加了synchronized,保证了线程安全
2.Vector和ArrayList本质上都是Object[] 数组,ArrayList提供了size方法,Vector提供了elementCount属性,他们作用是记录集合元素内有效元素的个数
3.Vector和ArrayList的扩容不一样,Vector默认扩容是增长一倍,ArrayList是增长自身的50%
4.由于底层都是数组结构,因此大量的add或者remove都会导致内部数组的数据copy操作,效率会受到影响

16.HashMap 和 Hashtable 的区别
HashMap和HashTable都实现了Map接口,用于存储双列数据的集合,两者区别主要有以下几点:线程安全性,同步,效率
1.HashMap几乎可以等价于HashTable,除了HashMap是非同步的,并可以接收null的键和值。
2.HashMap是非synchronized,而HashTable是synchronized,这意味着HashTable是线程安全的,多个线程可以共享一个HashTable,而如果没有正确的同步的话,多线程环境下是不能共享HashMap的,Java1.5版本提供了ConcurrentHashMap,它可以更好的替代HashTable。

3.HashMap和HashTable的底层都是数组+链表的结构,HashTable实现线程安全的方式是,在修改数据时锁住整个HashTable,因此效率低,ConcurentHashMap底层是分段数组+链表,线程安全。通过把Map的整个数组分成N个Segment(片段),读数据不加锁,ConcurrentHashMap允许多个线程修改操作并发进行,关键在于使用了锁分离,不同片段的数据存在不同的锁。

17.HashSet 和 HashMap 区别

HashSet是Set接口的实现类,是单列集合,存储的元素不可重复,可以存储null,无序
HashMap是Map接口的实现类,是双列集合,存储的键值不可重复,如键已存在则值会被覆盖。同样无序,可以存储null键和null值
HashSet的底层是HashMap,只是将数据存储在HashMap的键上,HashMap的value存的是默认的数据,HashMap的底层结构是 数组+链表结构 键的存储位置根据键的hashcode值存在数组上,值存储于该键对应的链表上

18.HashMap 和 ConcurrentHashMap 的区别

HashMap是java.util下的类,ConcurrentHashMap 是java.util.concurrent包下的类
HashMap底层是数组+链表的数据结构,ConcurrentHashMap底层同样是数组+链表但是与HashMap不同的是,ConcurrentHashMap最外层不是一个大的数组,而是一个个segment数组,每个片段包含一个与HashMap数据结构相似,在修改ConcurrentHashMap时,会先锁住key值所在的segment,因此ConcurrentHashMap是线程安全的。ConcurrentHashMap与HashTable的不同就在于HashTable在修改元素时是锁住整个数组,而ConcurrentHashMap是采用分段锁。

19.HashMap 的工作原理及代码实现

HashMap是由数组+链表组成的,数组是HashMap的主体,链表则是主要是为了解决哈希冲突而存在的,根据存储元素的key的hashcode值计算出在数组上的存储位置,即获取数组的索引,该位置不存在Entry事会将数据存储于此,如果Entry存在,会检查是否该索引位置是否包含链表,如果包含则会遍历链表key值存在则覆盖,不存在新增。

原文地址:https://www.cnblogs.com/zhaiyt/p/10608057.html