031. 内存中堆和栈的区别
功能方面:堆是用来存放对象的,栈是用来执行程序的。
共享性:堆是线程共享的,栈是线程私有的。
空间大小:堆大小远远大于栈。
032 java当中IO流的分类
字节流 InputStream(抽象类) OutputStream
FileInputStream FileOutputStream (实现类)
装饰者模式对传统的字节流进行了封装,增加了缓冲区功能
BufferedInputStream BufferedOutputStream(带有缓冲区的字节流)
字符流 Reader writer
FileReader FileWriter
BufferedReader BufferedWriter
033多线程并发或线程安全问题如何解决?
1:通过volatile 关键字修饰变量,可以实现线程之间的可见性,
避免变量脏读的出现,底层是通过限制jvm指令的重排序来实现的
适用于一个线程修改,多个线程读的场景
2:通过synchronized锁(任意对象)来实现线程同步,自动锁的思想,
底层实现原理:当有线程进入同步代码块之后,利用jvm的计数器将
锁的标记置为1,当别的线程再想进入的时候,发现锁的标记为1,
该线程就去锁池等待,当第一个线程出来之后,锁的标记会置为0,
之后cpu会随机分配一个线程再次进入同步代码块.
3:通过lock锁的机制,进行手动lock,和unlock,但是这种很容易出现死锁。
注意加锁以及解锁的顺序,就可以避免死锁
4:通过线程安全的集合类,可以解决并发问题
ConcurrentHashMap
CopyonWriteArrayList
5:使用并发包下面的原子类,底层使用的是cas机制(乐观锁),可以解决并发问题 atomicInteger 线程安全的原子整型类
6:使用线程池来创建和管理线程,也可以一定程度上解决并发问题
7:使用ThreadLocal来修饰变量,可以解决并发问题
ThreadLocal底层是怎么实现的?
多个线程会复制一份threadLocao变量的副本进行操作,互不影响,来保证线程安全的
034. 接口的默认方法
Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法,
示例如下:
interface Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
Formula 接口在拥有 calculate 方法之外同时还定义了 sqrt 方法,实现了 Formula 接口的子类只需要实现一个 calculate方法,默认方法 sqrt 将在子类上可以直接使用。
035. 反射的概念
可以通过 class 字节码文件对象,操作类的成员(构造方法,成员变量,成员方法),动态获取类的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
036. 反射获取文件对象的三种方式
1、Class.forName(类的全限定名)
2、类名.class
3、对象.getClass()
037. 反射中的常用类
1、Class 类:反射的核心类,可以获取类的属性,方法等内容信息
2、Constractor :构造方法
3、Method: 成员方法
4、Field;
038. 反射的作用和应用场景
可以通过配置文件来动态配置和加载类,以实现软件工程理论里所提及的类与类,模块与模块之间的解耦。反射最经典的应用是 spring 框架。
039.iso7层模型
物理层 数据链路层 网络层 传输层 会话层 表示层 应用层
tcp/udp属于传输层的协议
040.tcp和udp有什么区别?
tcp是面向连接的,建立连接前需要进行三次握手,断开连接前需要进行
四次挥手,可靠的不会造成数据丢失的,可以简单理解成打电话,效率低
udp协议是面向无连接,不可靠有可能造成数据丢失,可以理解成发电报,
效率高
更多请点开我的首页进行查看,谢谢