java知识点

java的反编译工具有哪些和如何防止反编译?

javap命令:javap xxx.class,其实它没有反编译源代码,只是转换成一种我们容易看得懂的字节码

jap工具,但它很久没有更新,java7有哪些语法不支持以及java8 lambda表达式也支持

cfr工具:java cfr.jar xxx.class --decodexxx xxx

防止反编译:

1、隔离.class文件

2、加密.class文件

3、将源代码转换成同等功能但阅读性更差的代码再编译成.class文件,增加阅读和理解的难度

 

理解java逃逸分析?

JIT会把jvm认为的热点代码缓存起来并优化,其中的优化包括逃逸分析。

1、同步擦除:当锁对象的作用域只在当前线程起作用时,就擦除同步

2、将堆内存转换为栈内存:当创建的对象不被外部方法引用时,有可以将堆内存转换内栈内存(说明了对象并不都是在堆内存上分配的

3、分离对象或标量替换:将对象替换成不可分解的标量

 

进程和线程的区别?

进程是程序运行的实例,进程是操作系统资源分配的基本单元,线程是cpu独立运行和调度的基本单元。同一进程的不同线程共享资源

 

什么是线程安全?

 当多个线程操作共享变量时,其结果与我们预期一样就称为线程安全。

保证线程安全的三个基本特性:

原子性:指一个操作是不可中断的

可见性:当线程修改一个共享变量时,其它线程能立即知道变量的变化

有序性:当多线程执行时,可能会发生指令重排。需要保证程序运行的顺序和源代码的执行顺序一致。

 

在jvm中线程共享的数据区域:方法区、堆

线程隔离的数据区域:程序计数器、虚拟机栈、本地方法栈

 

jvm加载class文件的原理机制

1、装载:查找与导入class文件

2、连接:

(1)检查:检查载入class文件的数据正确性

(2)准备:为类的静态变量分配存储空间

(3)解析:将符号引用转换为直接引用(可选)

3、初始化:初始化静态变量和静态代码块

 

redis如何访问海量数据

redis是单线程,如果使用keys *方式进行查询,会导致redis不可用,假死。可以scan命令,它通过游标分步进行,不会阻塞线程。注意:返回的结果可能会有重复,需要客户端去重。

 

什么是内存屏障?

是一类同步屏障指令。之前写的操作都要写入内存,之后的读的操作都能读到最新值。

 

Redis与MySQL如何保证数据一致性问题?

产生原因在于线程先删除缓存记录再更新数据库时,另一线程在缓存删除成功后数据库更新成功前进行了查询操作,把旧记录再次放到Redis缓存中。可把请求放到队列中,如果存在更新请求则先完成更新后再处理接下来的请求。

 

传统项目如何处理分布式事务?

传统项目出现分布式事务的根源在于使用多数据源,解决方案为jta+atomikos,atomikos底层基于XA两阶段提交协议 

 

spring事务分类: 声明式事务、编程式事务

spring事务原理: AOP环绕通知进行拦截

事务的默认传播行为:Propagation.REQUIRED

 

互联网安全的措施:

1. 网关ip黑白名单和限流
2. 验签防篡改
3. API接口Token授权认证
4. 加密传输和https
5. Oauth2实现接口开放平台
6. nginx隐藏真实ip
7. 字符过滤,防御xss攻击和sql注入攻击
8. 使用第三方安全扫描插件
9. 接口使用dto、do实现参数转化

 

分布式锁的实现方案
1. 采用redis实现,生产环境上使用redission
2. 使用zookeeper(效率最高)
3. 使用springcloud全局锁
4. 使用mysql锁,效率低,不推荐

 

秒杀系统的解决方案
1. 基于MQ+库存令牌桶实现削峰限流
2. 数据库分表分库、读写分离,使用redis缓存减去数据库访问压力
3. 动静分离,静态资源使用cdn加速,减轻带宽
4. 点击秒杀按钮后,让按钮disabled,防止重复提交
5. 使用图形验证码防止机器模拟
6. 限流和服务保护:ratelimter、nginx、hystrix、redis实现限流、令牌桶+漏桶算法
7. 黑白名单

 

mysql

hash:不支持范围查询
平衡二叉树:虽支持范围查询,但回旋查询效率低
B树: 在平衡二叉树基础上减少树的高度,减少io次数
B+树:相对B树而言,有一定顺序排序,提高范围查询的效率。缺点是有冗余节点数据,占用存储空间
MyISAM和InnoDB在B+树上的实现区别:MyISAM叶子节点存放数据行地址,而InnoDB存放数据,因而InnoDB占用存储空间

聚集索引:数据行的物理存储顺序与索引的逻辑顺序相同

非聚集索引:数据行的物理存储顺序与索引的逻辑顺序不同

 

replace与replaceAll区别

replace没用正则表达式,replaceAll使用正则表达式

 

mysql字段类型长度大小

 

 GET和POST的区别
1. GET在浏览器回退是无害的,而POST会再次提交请求
2. GET产生的url可以被bookmark,而POST不可以
3. GET请求会被浏览器主动cache,而POST不会
4. GET请求只能进行url编码,而POST支持多种编码方式
5. GET请求参数会被完整保留在浏览器历史记录里,而POST不会
6. GET请求在url中传送的参数有长度限制,而POST没有
7. 对于参数的数据类型,GET只接受ASCII字符,而POST没有限制
8. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
9. GET参数通过URL传递,POST放在Request body中
10. GET只会请求一次,POST请求两次
11. GET效率比POST高

 

为什么Arrays.asList返回的list不能进行add和remove操作?
Arrays.asList返回的list底层是使用数组实现,如果进行add和remove操作会改变数组大小,所以会抛出java.lang.UnsupportedOperationException异常

 

java8新特性
1. lambda表达式允许函数作为方法的参数
2. 方法引用,可以直接引用类或对象的方法或构造器
3. stream api简化代码
4. 接口允许default方法,此方法能在接口中直接实现
5. 新的日期api,它能获得对应时区的时间
6. 新的编译工具,如Nashorn引擎jjs和类依赖分析器jdeps
7. Nashorn允许jvm运行特定的javascript应用
8. Optional能解决null指针异常问题
 

sql执行很慢的原因
1. mysql正在把redolog日志同步到磁盘中,而阻塞其它操作
2. 没有建立索引或数据库选错了索引
3. 拿不到锁

 

数据库的4种隔离级别

 大部分数据库默认的级别是Read committed,但mysql默认是Repeatable read

 

java创建对象的方式
1. 通过new实例化
2. 反射
3. 反序列化
4. 通过clone方法

jsp九大内置对象
- 第一类与Servlet有关:page,config
- 第二类与Input/Output有关:out,request,response
- 第三类与Context有关:application,session,pageContext
- 第四类与error有关:exception

 

switch条件只能是byte short int char和枚举类型,Jdk7.0开始支持String,但long类型是不支持的

final修饰一个变量时,指引用变量不可变,但所指向的内容可变

面向对象的四个特征:抽象、多态、继承、封装

线程安全:StringBuffer、Vector、Hashtable

线程不安全:StringBuilder、ArrayList、HashMap

数组有length属性,String有length方法

 

异常分类:

- RuntimeException:NullPointerException、ArrayIndexOutOfBoundException、ClassCastException、NumberFormatException、ArithmeticException
- 非运行时异常:IOException、ClassNotFoundException、DataFormatException

 

常见的类:FileReader、FileWriter、String、Integer、java.util.Date

常见的包:java.lang、java.io、java.util、java.sql、javax.servlet、org.hibernate

常见的接口:List、Map、Document、Servlet、HttpSession、HttpServletRequest、HttpServletResponse

 

jsp四个作用域:page, session, application, request

4种会话跟踪技术:cookie, session, url重写,设置表单隐藏域

 

23种设计模式
- 创建型:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
- 结构型:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
- 行为型:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

面向对象设计的五大基本原则
1. 单一职责原则
2. 开放封闭原则
3. 里氏替换原则
4. 依赖倒置原则
5. 接口隔离原则

 

spring的IOC的三种实现机制:setter方法注入,接口注入,构造方法注入

hibernate的五个核心接口
1. Configuration接口创建SessionFactory对象
2. SessionFactory接口创建session对象
3. Session接口负责保存、更新、删除、加载和查询对象
4. Transaction接口负责管理事务
5. Query和Criteria接口执行数据库的查询

 

tomcat7的三个端口
8080监听浏览器发送的请求
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
使用8009 接受其他服务器转发过来的请求.
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
tomcat 监听的关闭端口.
<Server port="8005" shutdown="SHUTDOWN">

 

位运算交换两个数
x = x ^ y
y = x ^ y
x = x ^ y

雪花算法:64位,第一位不用+41位时间戳+10位工作机器id+12位序列号

 

java.util工具包
java.sql数据包
java.io输入输出流包
java.net网络包
java.lang基础包
java.awt构建图形用户界面的类库

 

mysql的存储引擎
- MyISAM适合少改写少插入的读取频繁的表,它不支持事务和外键
- InnoDB适用频繁维护的、修改插入等的数据表

oracle
- 创建用户:create user test identified by test;
- 删除用户:drop user test cascade;
- 授权角色:grant connect,resource to test;
- 撤销权限:revoke connect,resource from test;
- 创建角色:create role 角色名
- 授权角色:grant select on TABLE to 角色名
- 删除角色:drop role 角色名

 

static类中使用的方法可以不是static

设置python项目路径:export PYTHONPATH=.

异或操作可以找出没有重复的数字

 


不使用synchronized和lock,如何实现一个线程安全的单例
1. 利用ClassLoader的线程安全机制实现(本质上还是ClassLoader的loadClass方法上加上synchronized关键字),下面给出结合饿汉式和懒汉式优点的改良版

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

}

2. 通过CAS无法机制实现

public class Singleton {
    private AtomicReference<Singleton> atomicReference = null;
    public Singleton getInstance() {
        for (; ; ) {
            Singleton singleton = atomicReference.get();
            if (singleton != null) {
                return singleton;
            }
            singleton = new Singleton();
            if (atomicReference.compareAndSet(null, singleton)) {
                return singleton;
            }
        }
    }

}


优点:减少cpu调度时间,没有线程阻塞和切换等额外消耗,可以支持较大的并行度
缺点:如果有多个线程运行到singleton = new Singleton();那么会创建大量对象,严重时会造成内存溢出

 

JVM运行时数据区域有哪些?

谈谈对AQS的理解 

AQS有一个state变量,int类型,表示加锁的状态,还有一个变量记录当前加锁的线程。首先线程加锁时先通过CAS设置它的state变量为1,如果设置成功,将加锁线程赋值。如果设置失败,需要查看加锁线程是不是自己,如果是自己而锁是可重入锁,则加锁成功。如果state变量为0,将线程放入等待队列。待释放锁后唤醒等待队列的线程去获取锁。

垃圾回收机制:分代复制垃圾回收机制、标记垃圾回收机制、增量垃圾回收机制 

 

Struts2的工作流程
1. 客户端浏览器发送HTTP请求
2. 根据web.xml配置,该请求被FilterDispatcher接收
3. 根据struts.xml配置,找到需要调用的Action类和方法,并通过Ioc方式将值注入给Action
4. Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证
5. Action执行完毕,根据struts.xml的配置找到对应的返回结果result,并跳转到相应的页面
6. 返回Http响应到客户端浏览器 

 

struts2的工作原理
1. 浏览器初始化一个指向Servlet容器(比如Tomcat)的请求
2. 该请求经过一系列过滤器
3. 紧接着StrutsPrepareAndExecuteFilter(FilterDispatcher)被调用并询问ActionMapper是否调用某个action
4. ActionMapper决定调用某个action,并将请求的处理交给ActionProxy
5. ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6. ActionProxy创建一个ActionInvocation实例
7. ActionInvocation通过命名模式调用具体方法,该过程可能涉及Interceptor的调用
8. Action执行完毕后,ActionInvocation根据struts.xml中的配置找到对应的返回结果 

 

springmvc的工作流程

1. 用户发送请求到前端控制器DispatcherServlet
2. DispatcherServlet收到请求调用HandlerMapping处理器映射器
3. 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
4. DispatcherServlet调用HandlerAdapter处理器适配器
5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
6. Controller执行完成返回ModelAndView
7. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9. ViewReslover解析后返回具体View
10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
11. DispatcherServlet响应用户

简答:系统启动时根据配置文件创建spring的容器,首先是发送http请求到核心控制器DispatcherServlet,spring容器通过映射器去寻找业务控制器。使用适配器找到相应的业务类,在进入业务类时进行数据封装,在封装前可能涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,数据放在model中,用map传递数据进行页面显示

 

抽象类和接口的区别
1. 抽象类可以有构造方法,而接口没有
2. 抽象类可以有普通成员变量,而接口不能有普通成员变量
3. 抽象类可以包含非抽象的抽象方法,而接口中所有方法必须是抽象的,不能有非抽象的普通方法
4. 抽象类的抽象方法访问类型可以是public、protected和默认类型,但接口中的抽象方法只能是public,并且默认是public abstract类型
5. 抽象类可以包含静态方法,而接口不能
6. 抽象类和接口都可以包含静态成员变量,抽象类中静态成员变量的访问类型可以任意,而接口只能是public static final类型,并且默认为public static final
7. 一个类可以实现多个接口,但只能继承一个抽象类
8. 抽象方法只能申明,不能实现。接口是设计的结果,抽象类是重构的结果。jdk8允许接口定义默认方法和静态方法

 

进程和线程的区别
1. 一个程序至少有一个进程,一个进程至少有一个线程
2. 线程的划分尺度小于进程,使得多线程的并发性高
3. 进程在执行过程中拥有独立的内存单元,而多线程共享内存,从而极大提高程序运行效率
4. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序出口,但线程不能独立运行,必须依托于程序中,由应用程序提供多个线程执行控制
5. 从逻辑的角度来说,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用来实现进程的调度和管理以及资源分配。这就是线程和进程的重要区别

两者的优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正好相反。同时,线程适合于SMP机器(多核处理机)运行,而进程则可以跨机器迁移。

 

3种bean的实例方式:默认构造、静态工厂、实例工厂

 

sql的执行顺序
select--from--where--group by--having--order by
实际执行顺序为:from--where--group by--having--select--order by
select定义的内容只能order by可使用

 

BeanFactory延迟加载,第一次getBean时才会初始化Bean

ApplicationContext是BeanFactory的子接口,功能更强大,当配置文件被加载,对象就被实例化

 

各个变量在类加载时的初始化顺序
1. 初始化父类的静态变量,静态代码块,初始化的顺序按出现顺序
2. 初始化子类的静态变量,静态代码块
3. 初始化父类的成员变量
4. 父类构造代码块创建对象时执行
5. 执行父类的构造函数
6. 初始化子类的成员变量
7. 子类构造代码块创建
8. 执行子类的构造函数

 

过滤器和拦截器的区别
1. 拦截器基于java的反射机制的,而过滤器则基于函数回调
2. 拦截器不依赖于Servlet容器,而过滤器依赖
3. 拦截器只能对action请求起作用,而过滤器可以对几乎所有请求起作用
4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
6. 拦截器可以获取IOC容器中的各个bean,而过滤器不能。这点很重要,在拦截器里注入一个service,可以调用业务逻辑

 

hibernate
一级缓存是Session级别的缓存,同一个session相同的查询操作,第二次直接从一级缓存中取。
二级缓存是SessionFactory级别的缓存,同一个SessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果 

 

OSI(Open System Interconnect),即开放式系统互联,一般都叫OSI参考模型,问OSI七层模型
1. 物理层:建立、维护和取消物理连接
2. 数据链路层:提供介质访问和链路管理
3. 网络层:IP地址及路由选择
4. 传输层:建立、管理和维护端到端的连接
5. 会话层:建立、管理和维护会话
6. 表示层:数据格式转化、数据加密
7. 应用层:为应用程序提供服务

TCP/IP五层模型
物理层->数据链路层->网络层->传输层->应用层

TCP/IP四层模型
网络接口层->网络层->传输层->应用层

 

TCP三次握手
SYN:同步序列编号(Synchronize Sequence Numbers)

第一次握手:建立连接时,客户端发送syn包(syn = j)到服务器,并进入SYN_SENT状态,等待服务器确认

第二次握手:服务器收到syn包,必须确认客户的SYN(ack = j + 1),同时自己也发送一个SYN包(syn = k),即SYN + ACK包,此时服务器进入SYN_RECV状态

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack = k + 1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手

 

TCP四次挥手

1. 客户端A发送一个FIN报文,用来关闭客户端A到服务器B的数据传送
2. 服务器B收到这个FIN报文,它发回一个ACK,确认序号为收到的序号加,和SYN一样,一个FIN将占用一个序号
3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A
4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1

详解:假设Client端发起中断连接请求,也就是发送FIN报文。Server端收到FIN报文后,意思是说"我Client端没有数据要发给你了,但如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据"。所以你发送ACK,"告诉Client端,你的请求我已收到了,但是我还没准备好,请继续你等我的信息"。这时Client就会进入FIN_WAIT状态,继续等待Server端的FIN报文后。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是它还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。Server收到ACK后,就知道可以断开连接了,Client等待了2MSL(2倍报文的最大生存时间)后依然没有收到回复,则证明Server端已正常关闭,那好,Client端也可以关闭连接。

 

什么是多态

它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。多态就是父类的引用可以指向子类的对象。

java两种实现多态的方法:方法重载(编译时多态)、接口、继承

 

hashmap、hashset

负载因子0.75

默认初始容量为16

扩容为1倍

Vector:加载因子1,初始容量10,缺省情况下自动增长原来一倍的数组长度

ArrayList增长为原来的50%,初始容量为10,java8比java7在第一次add方法才初始为10

 

linux压缩tar czvf 解压tar zxvf

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值