Java基础知识
2021/10/6 20:12:38
本文主要是介绍Java基础知识,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
基本
java三大特性
①封装:指属性私有化,别的类或者方法要访问属性必须通过getter和setter方法,这样可以隐藏具体属性和实现细节,增强安全性
②继承:指将多个相同属性和方法提取出来作为一个父类,一个类只能继承一个父类,且只能继承非private的属性和方法,可以提高代码的复用性
③多态:所谓多态就是指程序中定义的引用变量引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定
抽象类和接口有什么区别
- 接口是公开的,里面不能有私有的方法或变量,而抽象类是可以有私有方法或私有变量
- 实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法
- 接口可以实现多重继承,而一个类只能继承一个超类
HTTP 请求的 GET 与 POST 方式的区别
- GET请求参数放在请求头,POST参数放在请求体,因此敏感信息不可用GET请求传递
- URL对字符数目有限制,所以GET请求参数有限制大小,而POST没有
session 与 cookie 区别
- cookie存储在浏览器上,而session存储在服务器中
- session不受浏览器限制,而cookie可能会被浏览器禁用,且每一个web服务器存储的cookie大小有限,一般不超过4KB
equals 与 == 的区别
值类型(int,char,long,boolean等)中都是用==判断相等性。
对象引用中,判断引用所指的对象是否是同一个。而equals是Object中的方法,在Object实现中是使用来实现的,因此也是判断引用所指对象是否同一个,但是子类可以根据自己的需要重写该方法来实现各自的需要。
public boolean equals(Object obj) { return (this == obj); }
final, finally, finalize 的区别
①final
- 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作 为父类被继承
- 被声明为final的变量必须在声明时 给定初值,而在以后的引用中只能读取,不可修改
- 被声明为final的方法也同样只能使 用,不能重载
②finally是在异常处理时提供 finally 块来执行任何清除操作
③finalize是个方法名,在垃圾收集器删除对象之前对这个对象调用
int 和 Integer 有什么区别
- int 是基本数据类型,Integer是其包装类,注意是一个类
- Integer可以用于各种数据类型之间的转化,同时,只有包装类能作为泛型参数,而基本数据类型不可以
重载和重写的区别
①重写
- 方法名、参数、返回值相同
- 子类方法不能缩小父类方法的访问权限
- 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)
- 存在于父类和子类之间
- 方法被定义为final不能被重写
②重载
- 参数类型、个数、顺序至少有一个不相同
- 不能重载只有返回值不同的方法名
- 存在于父类和子类、同类中
反射的功能
- 在运行时构造任意一个类的对象
- 在运行时获取对象的属性、方法、构造函数等
- 在运行时调用任意一个对象的方法
- 生成动态代理
JDBC流程
//1.加载JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver"); //反射 //2.建立连接(书写形式:协议:子协议:数据源标识) Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称","用户名称","密码"); //3.创建一个Statement(对数据库发出请求) //执行静态SQL语句。通常通过Statement实例实现 //执行动态SQL语句。通常通过PreparedStatement实例实现 //执行数据库存储过程。通常通过CallableStatement实例实现 String sql="select id,username,pwd from t_user where id>?"; PrepareStatement ps=conn.prepareStatement(sql); ps.setObject(1, 2); //第一个"问号",传入2. -->把id大于2的记录都取出来 rs=ps.executeQuery(); //4.返回查询结果 ResultSet rs=ps.executeQuery(); //执行查询请求,并返回"结果集" //5.关闭链接 if(rs!=null){ //RsultSet rs rs.close(); } if(ps!=null){ //PreparedStatement ps ps.close(); } if(conn!=null){ //connection conn conn.close(); }
MVC模式
MVC是模型(model)-视图(view)-控制器(controller)的缩写,是一个架构模式,它分离了表现与交互。
- 视图是用户看到并与之交互的界面
- 模型表示业务数据,并提供数据给视图
- 控制器接受用户的输入并调用模型和视图去完成用户的需求
集合
List和Set的区别
① List,Set都是继承自Collection接口,但List元素有放入顺序,可重复;Set元素无放入顺序,重复会被覆盖,因此List支持for循环,也就是 通过下标来遍历,也可以用迭代器,但是Set只能用迭代,因为他无序,无法用下标来取得 想要的值
② Set检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变;List和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引 起其他元素位置改变。
List 和 Map 区别
List是对象集合,允许对象重复。 Map是键值对的集合,不允许key重复。
Arraylist 与 LinkedList 区别
Arraylist
优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。
LinkedList
优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等 一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适 用于要头尾操作或插入指定位置的场景
缺点:因为LinkedList要移动指针,所以查询操作性能比较低。
适用场景分析
当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时 采用LinkedList。
ArrayList 与 Vector 区别
- Vector是线程安全的,而ArrayList不是线程安全的,因此Vector效率低
- 两者都是用数组实现的,但Vector可以设置增长因子,而ArrayList每次增长都是原来的1.5倍
HashMap 和 Hashtable 的区别
- hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和 containsKey()方法
- hashTable同步的,而HashMap是非同步的,效率上比hashTable要高
- hashMap允许空键值,而hashTable不允许
HashSet 和 HashMap 区别
set是线性结构,set中的值不能重复,hashset是set的hash实现,hashset中值不能重复是 用hashmap的key来实现的。
map是键值对映射,可以空键空值。HashMap是Map接口的hash实现,key的唯一性是通过 key值hash值的唯一来确定,value值是则是链表结构。
他们的共同点都是hash算法实现的唯一性,他们都不能持有基本类型,只能持有对象
HashMap 和 ConcurrentHashMap 的区别
- ConcurrentHashMap是线程安全的HashMap的实现
- ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上 都用lock锁进行保护,相对于HashTable的syn关键字锁的粒度更精细了一些,并发性能更 好,而HashMap没有锁机制,不是线程安全的
- HashMap的键值对允许有null,但是ConCurrentHashMap都不允许
ConcurrentHashMap 的工作原理
HashTable里使用的是synchronized关键字,这其实是对对象加锁,锁住的都是对象整体, 当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时 间。ConcurrentHashMap引入了分割(Segment),把一 个大的Map拆分成N个小的HashTable,在put方法中,会根据hash(paramK.hashCode())来 决定具体存放进哪个Segment,如果查看Segment的put操作,我们会发现内部使用的同步 机制是基于lock操作的,这样就可以对Map的一部分(Segment)进行上锁,这样影响的只 是将要放入同一个Segment的元素的put操作,保证同步的时候,锁住的不是整个 Map(HashTable就是这么做的),相对于HashTable提高了多线程环境下的性能,因此 HashTable已经被淘汰了。
线程
创建线程的方式及实现
- 继承Thread类创建线程类
- 通过Runnable接口创建线程类
- 通过Callable和Future创建线程
创建线程的三种方式的对比
采用实现Runnable、Callable接口的方式创见多线程时,优势是:线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。劣势是:编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。
这篇关于Java基础知识的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器
- 2024-11-26Java云原生资料:新手入门教程与实战指南
- 2024-11-26JAVA云原生资料入门教程
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程