基础语法
数据类型
java中有8种基本类型:
byte, short, int, long, float, double, boolean, char
还有引用类型
类、数组、接口等。
比如String就是引用类型。引用类型的默认是 null
类型
位数
默认值
包装类
byte
8
0
Byte
short
16
0
Short
int
32
0
Integer
long
64
0L
Long
float
32
0.0f
Float
double
64
0.0d
Double
char
16
‘\u0000’
Character
boolean
1
false
Boolean
浮点数的默认类型是double 赋给 float 需加 f 后缀。精度变小
byte是循环的,满了128就从-128开始
double和long都是默认占64位的存储空间
long用于存储整数值,范围为-2^63^到 2^63^-1,double用于存储浮点数,遵循IEEE 754标准。
基本数据类型和引用类型的主要区别在于:
基本类型变量存储的是实际的数据 ...
基础面试题目
概念
1.说一下Java的特点
平台无关性:Java的编写一次,运无不在"哲学是其最大的特点之一。Java编译器将源代码编译成字节码(bytecode),该字节码可以在任何安装了Java虚拟机(JVM)的系统上运行。
面向对象:JaVa是一严格的面可对象编程语言,几乎一切都是对象。面可对象编程(OOP)特性使得代码更易于维护和重用,包括类(class)、对象(object)、继承(inheritance)、多态 (polymorphism)、抽象(abstraction)和封装(encapsulation)。
内存管理:JaVa有目己的垃圾回收机制,目动管理内存和回收不再使用的对象。这样,开发者不需要手动管埋内存,从而减少内存泄漏和其他内存相关的问题。
支持多线程和网络编程。
然后是一个解释性语言和编译性结合的语言,先把java代码编译成字节码文件,然后使用JNT来解释字节码文件给机器。更加高效
2.Java 的优势和劣势是什么?
首先,Java的优势,我记得跨平台应该是一个大点,因为JVM的存在,一次编写到处运行。然后面向对象,这个可能也是优势,不过现在很多语 ...
基础
1.详细的说说Redis的数据类型
redis中常用的五种数据结构:string、list、set、zset、hash。
String结构底层是一个简单动态字符串,支持扩容,存储字符串。所以可应用于微信文章的阅读数或点赞,缓存对象、常规计数、分布式锁、共享 session 信息等。
list存储线性有序且可重复的元素,底层数据结构可以是双向链表/压缩列表。微薄的粉丝列表或好友列表,消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等。
set存储不可重复的元素,一般用于求交集、差集等,底层数据结构可以是hash和整数数组,所以可应用于抽奖,通过sadd添加不同的用户,srandom key number选出中将用户。还有集合的运算:sdiff、sintern与sunio就是集合的差交并运算,所以可应用于QQ的共同好友 聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。
zset存储的是有序不可重复的元素,zset为每个元素添加了一个score属性作为排序依据,底层数据结构可以是ziplist和跳表,所以可应用于排行榜 ...
java
未读相向双指针
两个指针 left=0, right=n−1,从数组的两端开始,向中间移动,这叫相向双指针。上面的滑动窗口相当于同向双指针。
344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。
1234567891011class Solution344{ public void reverseString(char[] s){ int n = s.length; for (int left=0,right=n-1;left<right;left++,right--){ char tmp = s[left]; s[left] = s[right]; s[right] = tmp; } }}
简单的双指针解决
就是让头和尾互换值就ok了
125. 验 ...
前置知识
JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!
进程:一个运行中的程序的集合; 一个进程往往可以包含多个线程,至少包含一个线程
Java默认有几个线程? 两个 main线程 gc线程
线程:线程(thread)是操作系统能够进行运算调度的最小单位。
并发(多线程操作同一个资源,交替执行)
CPU一核, 模拟出来多条线程,天下武功,唯快不破,快速交替
并行(多个人一起行走, 同时进行)
CPU多核,多个线程同时进行 ; 使用线程池操作
线程实现主要分为三类:用户级线程(ULT)、内核级线程(KLT)和混合型线程实现。
线程实现主要分为三类:用户级线程(ULT)、内核级线程(KLT)和混合型线程实现。轻量级进程(LWP)不是线程的实现方式,而是操作系统内核用来支持线程运行的一种机制。
分析三种线程实现方式:
\1. 用户级线程(ULT):
- 线程的创建、调度和管理都由用户程序完成
- 操作系统对线程一无所知
- 优点是切换开销小,缺点是无法利用多处理器
\2. ...
滑动窗口
看到一串数组,要求数量的时候,可能就会用到滑动窗口
定长
只需要考虑进出即可
然后考虑窗口大小不足的时候,continue
模板:
123456789101112131415class Solution643{ public double findMaxAverage(int[] nums, int k){ int maxS = Integer.MIN_VALUE; int s= 0; for (int i =0;i<nums.length;i++){ s +=nums[i]; if (i<k-1){ continue; } maxS = Math.max(maxS,s); s -=nums[i-k+1]; } return (double) maxS/k; }}
...
简介
Spring是一个支持快速开发Java EE应用程序的框架。它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发Java EE应用程序的必备。
Spring Framework主要包括几个模块:
支持IoC和AOP的容器;
支持JDBC和ORM的数据访问模块;
支持声明式事务的模块;
支持基于Servlet的MVC开发;
支持基于Reactive的Web开发;
以及集成JMS、JavaMail、JMX、缓存等其他模块。
Ioc容器
在学习Spring框架时,我们遇到的第一个也是最核心的概念就是容器。
什么是容器?容器是一种为某种特定组件的运行提供必要支持的一个软件环境。例如,Tomcat就是一个Servlet容器,它可以为Servlet的运行提供运行环境。类似Docker这样的软件也是一个容器,它提供了必要的Linux环境以便运行一个特定的Linux进程。
通常来说,使用容器运行组件,除了提供一个组件运行环境之外,容器还提供了许多底层服务。例如,Servlet容器底层实现了TCP连接,解析HTTP协议等非常复杂的服务,如果没有容器来提供这些服务, ...
事务
1.spring 事务失效的场景有哪些?
spring事务的实现原理是基于AOP的动态代理和TransacationInterceptorh还有底层依赖
AOP:Spring 通过 ProxyFactoryBean 生成代理对象,默认对接口用 JDK 动态代理,对类用 CGLIB 代理;是采用cglib继承目标类的方式去创建代理类,非pulic的方法不能能继承。
拦截器:核心拦截器,在方法调用前后开启 / 提交 / 回滚事务,基于 ThreadLocal 存储事务状态;基于运行时异常来回滚的,所以把运行时异常给catch或者返回没指定的异常
底层依赖:通过 PlatformTransactionManager 接口适配不同事务管理器(如 JDBC、JPA)。
使用ThreadLocal存储事务的状态,(如连接、隔离级别)通过TransactionSynchronizationManager存在线程本地变量,保证线程安全。
所以基于这个情况,spring事务失效的场景有:
1.吃掉运行时异常没抛出:
2.未配置回滚规则,要配置rollbackFor=Exception.class指 ...
English
未读5.1
No work is insignificant. All labor that uplifts humanity has dignity and importance and should be undertaken with painstaking excellence.
cheque 支票
cherish 珍爱
chimney 烟囱
choke 窒息
cholesterol 胆固醇
5.2
The beautiful thing about learning is nobody can take it away from you.
Christian 基督徒
circuit 巡回
chilly 寒冷的
5.3
Today’s mighty oak is just yesterday’s nut, that held its ground.
clap 鼓掌
clarity 清楚的
ceremonial 礼仪的
clause 子句
claw 爪子
clerical 牧师的
cliff 悬崖
cereal 谷物
5.4
Young people have chang ...
java
未读定长型
定长型:
直接考虑头和尾就行。
只需要考虑移除(离开窗口)的字母 a 是不是元音,以及添加(进入窗口)的字母 i 是不是元音即可
然后考虑窗口大小不足的时候,continue
1456. 定长子串中元音的最大数目
给你字符串 s 和整数 k 。
请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。
英文中的 元音字母 为(a, e, i, o, u)。
解决定长窗口的问题:
只需要考虑移除(离开窗口)的字母 a 是不是元音,以及添加(进入窗口)的字母 i 是不是元音即可
1234567891011121314151617181920212223class Solution1456{ public int maxVowels(String S,int k ){ char[] s = S.toCharArray(); int ans = 0; int vowel = 0; for (int i =0;i<s.length;i++){ if ...
总体架构
架构思想:
分层:
Controller → Service → Entity,这三层架构体系,
Controller 层 不直接操作数据库,而是通过 subjectService 去拿数据。
业务逻辑集中在 Service 层,Controller 只负责接收请求、调用服务、返回结果。
统一的返回结果:
不直接返回裸的 List 或 对象,而是包一层 RestResponse。
成功返回 RestResponse.ok(数据)。
统一格式,前端处理简单。
后期可以很方便统一加异常码、消息、分页信息。
合理的使用对象映射:
Subject 是实体类(Entity),对应数据库。
SubjectVM、SubjectEditRequestVM 是视图模型(VM),对应前端页面。
通过 modelMapper.map(d, SubjectVM.class) 进行转换,不暴露数据库结构。进行反序列化,更加安全
使用流式编程:
123456List<SubjectVM> subjectVMS = subjects.stream().map(d -> { ...
redis数据类型
基础
String
redis中的数据是以键值对的形式存储的,然后存储是以二进制安全的形式进行存储
默认是不支持中文的,但连接的时候可以加上参数–raw,就是以原始的形式进行存储。这样就可以看到中文了
set:set key value 设置一个键值对
get:get key,返回的是值
12345127.0.0.1:6379> set name 你好OK127.0.0.1:6379> get name"\xe4\xbd\xa0\xe5\xa5\xbd"127.0.0.1:6379>
123127.0.0.1:6379> get name你好127.0.0.1:6379>
del:del key,用来删除一个键
exists:exists key 用来看一个键是否存在
123127.0.0.1:6379> exists name1127.0.0.1:6379>
返回1表明存在
keys:key * 用来查看所有的键,支持通配符
123127.0.0.1:6379> keys *name127.0.0 ...













