Java教程

java技术总结100条

本文主要是介绍java技术总结100条,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.面向对象 与面向过程
两种不同的思维方式来实现,两种处理业务问题的角度

过程是:我们把一个业务分为:用户选择订单-付款-订单发货给用户
对象是 :我们把整个业务分成一个个对象:用户、订单,在通过对象之间的数据传递实现此业务(封装、继承(基类)、多态)

封装: 对象属性private私有,只允许调用规定方法才能访问/ 框架思想 我们引用jar包的调用,或者自己写了

多态 :比如一个父亲有10个儿子, 我定义的返回儿子方法只需父亲就可以 ,父类指向—子对象实例


2.jvm调优

jnm组成主要是和 堆、方法去(元空间)、栈   程序计数器、本地方法栈
等,主要是针对堆内存的,因为堆里存放的才是所有的对象,其他的都是引用地址或是基本类型的局部变量
,而对于堆的优化,再往下就是 GC,这里解释一下,比如用户执行了一些请求,会执行一些线程,而用户执行的这些可以归为用户线程,jvm调优说的是频繁不合理的执行gc垃圾回收这块的线程,
我们做的是保证jvm更加合理的执行gc垃圾回收。堆往下说 可以分为 年轻代、年老代。eden区占 /from区 to区 ,年老区内存满了才回去调用gc回收对象。

让GC线程和用户逻辑的线程不要同时运行, 先运行用户逻辑的线程, 运行到需要GC的时候, 就把所有用户逻辑的线程给停住, 然后启动GC线程去进行标记清除, 在GC线程标记清除运行结束后, 
再继续进行用户逻辑的线程. 这种方法就是大名鼎鼎的STW (Stop-The-World, 意思是在GC的时候停下用户逻辑的全世界)

可达性分析法


高并发(单机几十万并发)
垃圾收集器
空间换时间


3.jdk jre\ jvm

jdk 开发环境
jre  运行java程序的环境  包括(jvm+libjava基本库)
jvm 解释机器码 class文件的 保证一次打包,到处运行

4.==和equs   ,==对比的栈中的值 地址(是否为同一个对象),
equse,默认对比的事字符串的字符是否相等,但可以通过重写equs方法来做作对比


5.final 修饰变量 不可修改  ,修饰上、不能


6.String、StringBuffer和StringBuilder的区别

String 是每次操作都会产生新的String对象 ,而后面两者则是在一个对象上进行字符串的修改
Stringbuilder 是线程不安全的,性能块、而StringBuffer是线程安全的
所以对字符串如有经常改动的话,需要使用StringBuilder或者Buffer ,我们肯定不能说不考虑性能和线程安全,只能说具体情况
,如果该字符串变量涉及多个线程操作的共享变量的话还是推荐StringBuffer的

7.List和Set for循环都可以遍历
有序/重复  list:获取对象的话 ,跌迭代器和get索引 都可以 ,set是无序的获取的话只能用迭代器,还有允许null多个还是一个


8.interface接口和abstratct抽象类 区别;
一个类可以实现多个接口,但只能继承一个抽象类
接口是对实现类的规范和约束,implent的必须在接口的方法的参数和返回值来做,而抽象类的不能直接实例化,
只有继承了抽象类的子类才能实例化,才有意义这样的意义就是利于代付的复用


9.hashCode和equsls
equals方法可以被重写 ,用来对比两个对象是否相等
hashCode 主要用于查找,对象再散列hash里的索引,默认情况下返回对象在堆的位置,如果对象又重新被添加到新的散列集合中,则返回的事新集合的位置;

10.Arraylist和LinkedList区别


主要体现在数据结构中 arraylist是动态数组形式的、 linkedList是链表的  
arraylist在于尾部添加对象,和get查找对象速度较快、 链表的优势体现在中间对象的删除,添加上效率快
遍历来说linkedList的话 避免for循环\indexof的使用 ,都是内部调用get(索引)的形式来执行的,而是用迭代器

11.hashmap和hashtable
hashMap不是线程安全的,hashTable是线程安全的另外,hashtable不允许存储null值进来,原因是存储之前会调用hashcode来进行核验,此时对象是null的话就会空指针异常

12.javaIO模型
BIO传统IO流:同步IO阻塞,一个线程处理一个客户端连接,读写文件时会存在IO阻塞,线程不能执行其他操作/可以与线程池搭配使用来提高性能;
适用于固定客户端建立连接的场景, 比如服务与服务之间文件传输,并发不多,程序简单理解。

NIO:是基于通道、缓冲区、选择器实现的,一个线程可以处理多个客户端连接,一个线程把多个客户端分为不同的通道,通过选择器监听通道事件动态切换通道来实现的
适用于连接数目较多,比如用户作为客户端建立的连接,数据传输复杂的。

AIO:


13.字节码
 我们的java程序需要编译成class文件来交给jvm去运行,class文件就是字节码文件 ,,jvm在把clss文件解释成相应系统的机器码让机器运行
扩展 java可以说是 半编译半解释型语言,  因为java具有编译语言的运行速度、也具有解释性语言(js、Python)的跨平台。

14.异常
异常可分为两种Error和Exception
Error主要是程序无法处理的错误,一旦出现Error程序就会停止,如内存溢出
Exception 的话主要是程序可以进行try catch捕获操作的,出现后,不会影响程序运行。空指针/下标越线/sql/Io异常等
编译异常,一般正在开发时Ideal检查就会报错(语法写错了)

15.Gc回收对象
引用计数器算法 ,当堆中的对象被栈所引用后 ,计数就会+1,如果减少了引用就会减一,当计数属性为0时可以被回收。
可达性分析算法,以gcRoot(静态变量/方法里的局部变量等对象)作为根节点往下查找指向,查完为止,没有被指向就会被回收


16.线程
线程 生命周期:创建 new THread 、就绪 start、运行 run、阻塞 wait(释放资源)sleep(不释放资源)加锁、销毁
sleep是Thread线程额方法,自带阻塞时间,wait是D对象的,需要notify唤醒

线程安全的理解
单机的情况下 jvm堆可以作为所有线程的共享空间,
当所有线程同时访问一个公共数据时,公共数据就是指的堆中的同一个对象,不会出现数据错误的情况就是线程安全的

堆是所有线程共有的空间, 分布式事务 \ 分布式锁

Thread类 Runable接口的区别没区别


守护线程:
java中线程分为两类,一类是用户线程,一类是服务于用户线程的守护线程,gc可以理解为守护线程:会一直监控整个堆中所产生的垃圾,并去回收

ThreadLocal提供了线程内存储变量的作用
ThreadLocal 内部有一个map属性,key就是当前的线程,value就是需要存储的对象。
ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题,不同的点是

Synchronized是通过线程等待
牺牲时间来解决访问冲突
ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,并且相比于Synchronized,ThreadLocal具有线程隔离的效果,
只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。


17.并发并行串行
串行就是各个线程按照顺序执行
并行是各个线程同时执行;线程之间是异步的,线程资源互不干扰
并发指的各个线程互相干扰切换执行,同一时刻cpu只会执行其中一个线程


并发三大特性 原子性:全部执行/全不执行  可见性:共享数据操作所有线程均可见 有序性,计算机会按照cpu执行效率来对代码重新排序执行

18.线程池
1.线程池降低资源消耗,提升运行速度,可以省掉线程的重复创建、销毁耗时操作
2.对于所有线程的统一监控管理


线程池的参数详解:
线程池的参数都是对线程池的各个组成来进行管理的, 线程池包括核心线程.临时线程。执行任务队列。 
corePoolSize:线程池的大小。线程池创建之后不会立即去创建线程,而是等待线程的到来。当当前执行的线程数大于改值是,线程会加入到缓冲队列;
maximumPoolSize:线程池中创建的最大线程数;
keepAliveTime:空闲的线程多久时间后被销毁,默认情况下对临时线程才会起作用的


线程池对线程复用原理
1.线程与任务进行解耦,
2.将start开启线程方法,与就绪装状态后执行的run方法分离,
通过执行while(true)方式卡主线程,里面是循环查询任务,如果有任务就调用run方法执行,而不在去调用start重新开启线程了


19.Spring 就是IOC和aop的容器
ioc就是在这个容器里需要一个对象不需要再去主动new出来,IOC容器会去自动提供出来,(依赖注入)
aop面向切面,把相对独立的业务利用aop的几大通知类型(前置、后置、环绕、异常、最终通知等)切入进当前项目上,可以到达可插拔式效果;

20.序列化
就是讲对象转化为二级制或者字节流的过程

21.JAVA代理 
代理分为:正向代理,反向代理,静态代理、动态代理,业务通过代理类去调用被代理类的服务,并可以加入代理类的一些业务;


22.spring用到的设计模式
单例模式 一个类有且只有一个实例对象
工厂模式 提供一个类可以创建实例多个类对象
适配器模式:原本不兼容的两个接口,可以互相合作,把一个对象转换成另一个类的对象

23.事务@Tracition注解失效
1.没有public修饰,因为事务是全局控制的
2.trycatch
3.分布式微服务涉及其他服务之间调用的问题

24.springBoot/spring mvc和sprign区别
sprign是一个有aop机制的IOC容器 ,通过依赖注入的方式实现控制反转
springMVC是spring对Web框架的一种解决策略,一种后端处理前端请求的执行流程,从接受用户请求的控制器controlle层r到处理业务的model层再到返回给前端数据的view视图层
springBoot是基于spring容器和springMVC的封装好的框架,能够更简便快速的开发。核心增加了starter机制。


 

这篇关于java技术总结100条的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!