Java集合
Java中的集合类Java中集合类主要分为两大类:Collection接口和Map接口。前者是存储对象的集合类,后者存储的是键值对。
Collection接口下又分为List、Set、Queue接口。每个接口有其具体实现类:
List 接口:
ArrayList:基于动态数组,查询速度快,插入、删除慢。
LinkedList:基于双向链表,插入、删除快,查询速度慢。
Vector:线程安全的动态数组,类似于ArrayList,但开销较大。
Set接口:
HashSet:基于哈希表,元素无序,不允许重复。
LinkedHashSet:基于链表和哈希表,维护插入顺序,不允许重复。
TreeSet:基于红黑树,元素有序,不允许重复。
所以网上有些说Set是无序集合非常不准确,因为需要看具体的实现类。
Queue 接口:
PriorityQueue:基于优先级堆,元素按照自然顺序或指定比较器排序。
LinkedList:可以作为队列使用,支持FIFO(先进先出)操作。
Map 接口:
存储的是键值对,也就是给对象(value)设置了一个key,这样通过key可以找到那个value. ...
面向对象和面向过程的区别
概念面向对象编程(Object Oriented Programming,OOP)是一种对象为中心的编程范式或者说编程风格。把类或对象作为基本单元来组织代码,并且运用提炼出的:封装、继承和多态来作为代码设计指导。
面向过程编程是一种以过程或函数为中心的编程范式或者说编程风格,以过程作为基本单元来组织代码。过程其实就是动作,对应到代码中来就是函数,面向过程中函数和数据是分离的,数据就是成员变量。
总结来看:面向对象编程注重对象之间的交互和模块化设计,而面向过程编程注重逻辑的分步实现。
主要区别:
思维方式:
面向对象:通过定义对象的属性和行为来解决问题,关注对象之间的关系和交互。
面向过程:通过函数或过程一步步实现业务逻辑,关注执行的步骤和顺序。
数据与行为的关系:
面向对象:数据和行为封装在对象内部,数据操作由对象方法进行管理。
面向过程:数据和函数是分离的,函数对数据进行操作。
可扩展性和复用性:
面向对象:通过继承、接口、多态等机制支持代码的高复用性和扩展性。
面向过程:复用性较低,扩展需要修改已有代码,影响整体稳定性。
适用场景:
面向对象:适合处理复 ...
Java基础
Java中的Exception和ErrorException和Error都是Throwable类的子类(Java中只有继承了Throwable类的实例才能被throw和catch)。
总结来看:Exception表示可以被处理的程序异常,Error表示系统及的不可恢复错误。
详细说明:
Exception:是程序中可以处理的异常情况,表示程序逻辑或外部环境中的问题,可以通过代码进行恢复或处理。如IOException,SQLException,NullPointerException等
Exception又分为Checked Exception(编译期异常)和Unchecked Exception(运行时异常)
Checked Exception:在编译时必须显式处理(如使用 try-catch抛出)。如 IOException。
Unchecked Exception:运行时异常,不需要显式捕获。常见的如IllegalArgumentException 等,继承自
Error:表示严重的错误,通常是JVM层次内系统级的、无法预料的错误,程序无法通过代码进行处理或恢复。例如内 ...
java中的不可变类
不可变类是指在创建后其状态(对象的字段)无法被修改的类。一旦对象被创建,它的所属性都不能被更改。这种类型的实例在整个生命周期内保持不变。
特征
声明类为final,防止子类继承。
类的所有字段都是private和final,确保它们在初始化后不能被更改。
通过构造函数初始化所有字段。
不提供任何修改对象状态的方法(如setter方法)。
如果类包含可变对象的引用,确保这些引用在对象外部无法被修改。例如getter方法中返回对象的副本(new一个新的对象)来保护可变对象。
不可变类的优缺点优点:
线程安全:由于不可变对象的状态不能被修改,它们天生是线程安全的,在并发环境中无需同步。
缓存友好:不可变对象可以安全地被缓存和共享,如String 的字符串常量池。
防止状态不一致:不可变类可以有效避免因意外修改对象状态而导致的不一致问题。
缺点:性能问题;不可变对象需要在每次状态变化时创建新的对象,这可能会导致性能开销,尤其是对于大规模对象或频繁修改的场景(例如String频繁拼接)。
如何实现一个不可变类?String就是典型的不可变类,可以参考。下面是String的部分源码(jdk-1 ...
Java中的序列化与反序列化
序列化将对象转换成字节流的过程。这样对象就可以通过网络传输,持久化存储或者缓存。Java提供了java.io.serializablr接口来支持序列化,只要实现这个接口,就可以将该类的对象进行序列化。
反序列化将字节流重新转换为对象的过程。也就是从存储中读取数据并重新创建对象。
Java序列化关键类和接口ObjectOutputStream用于序列化,ObjectInputStream用于反序列化。类必须实现Serializable接口才能被序列化。在序列化过程中,可以用transient关键字来标记不需要序列化的字段。
安全性反序列化是一个潜在的安全风险。因为通过恶意构造的字节流,可能会加载不安全的类或执行不期望的代码。因此,反序列化过程需要进行输入验证,避免反序列化漏洞。
serialVersionUIDprivate static final long serizlVersionUID = 1L;
这个ID其实就是用来验证序列化的对象和反序列化的对象的ID是否一致。这个ID数字其实不重要,无论是1L还是idea自动生成,只要序列化的时候对象的serialVersionUID和反序 ...
Java面试
Java中有哪几种方式来创建线程执行任务继承Thread类1234567891011public class myThread extends Thread{ public static void main(String[] args) { myThread myThread = new myThread(); myThread.start(); } @Override public void run(){ System.out.println("Hello DrownedFish!"); }}
重写了run方法,而不是start方法。但是占用了继承名额,Java中类是单继承的。
实现Runnable接口12345678910public class myThread implements Runnable{ public static void main(String[] args) { T ...
git操作
Git安装git下载git官网下载Git-Downloads,这里我下载的是Git 2.46.0 for windows如果太慢,可以用腾讯提供的下载方式点击这里,记住要用普通下载,不然会下载腾讯的电脑管家!
接下来是协议,同意即可
之后选择默认,接着是选择编辑器,这里我选择vsCode
接下来一路选择默认即可。(直接点击Next,直到install)
安装完成后会有以下:
Git Bash:基于CMD的,在CMD的基础上增添一些新的命令与功能,平时主要用这个,功能很丰富
Git CMD: 和CMD很像
Git GUI:git的GUI界面
配置远程github进入git bash
首先配置一下名字和email
12$ git config --global user.name "xxx"//自定义用户名$ git config --global user.email "xxx@xx.com"//用户邮箱
输入
1ssh-keygen -t rsa -C "xxx@xx.com"
如上图中,public key被保存的位 ...
Redis基础知识
Redis 是一种开源(BSD 许可)内存数据结构存储,用作数据库、缓存、消息代理和流引擎。
1 Redis介绍 Redis 是一种开源(BSD 许可)内存数据结构存储,用作数据库、缓存、消息代理和流引擎。Redis 提供数据结构,例如字符串、哈希、列表、集、带有范围查询的排序集、位图、超日志、地理空间索引和流。 Redis 具有内置复制、Lua 脚本、LRU 逐出、事务和不同级别的磁盘持久性,并通过 Redis Sentinel 和 Redis 集群的自动分区提供高可用性。
基于内存的KV键值对内存数据库
Redis在某些场景中明显优于MySQL,比如计数器、排行榜等。两者是共用和配合使用。
功能与应用:
分布式缓存,挡在MYSQL数据库之前的带刀护卫。
内存存储和持久化(RDB+AOF),redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务。
高可用架构搭配。
缓存穿透、击穿、雪崩。
分布式锁。
队列。
排行版+点赞。
。。。。。。
2 Redis安装官网下载稳定版
Linux下
1.解压Redis-x.x.x.tar.gz (tar -zxvf Red ...