面试题
是阿羡
这个作者很懒,什么都没留下…
展开
-
Java Socket
Java Socket基本原理Java Socket编程是基于应用服务与TCP/IP通信之间的一种抽象,将TCP/IP协议里面复杂的通信逻辑进行封装,对应用程序来讲,只要通过一组简单的API即可实现网络的链接。 进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远程主机的IP地址,远程进程的协议端口。Socket连接的三个步骤1.服务器监听:服务器端Socket不定位具体客户端Socket,而是出于等待连接的状态,实时监控网络状态(ServerSocket.ac原创 2020-12-16 14:19:17 · 165 阅读 · 0 评论 -
2020-11-18
TCP/IP指的是TCP/IP协议簇,按照层次分为四层,应用层、传输层、网络层、和数据链路层应用层(HTTP、ping、DNS、FTP等协议):负责应用程序之间的沟通传输层(TCP、UDP等协议):负责网络层(ip):负责提供基本的数据封包传输工作数据链路层(ARP协议):接收IP数据报并进行传输ip:负责传输数据的协议,它是一种不可靠的传输协议icmp:IP数据报在发送途中一旦发生异常导致无法到达目标地址时,需要给发送端发送一个发生异常的通知。icmp就是为了这一功能定制的,应用层的ping命原创 2020-11-18 18:49:07 · 59 阅读 · 0 评论 -
项目
实现了用户的注册及登录功能;考试成绩的增删改查功能难点:再使用下拉菜单选项的时候不知道怎么办,单独设计一张表,实际存放的数据也不会太多,,最后使用了数据字典数据库:创建了用户表、班级表、学生表、课程信息表、考试信息表、学生考试记录表和数据字典表、数据字典标签表。首先设计了Http请求的基类设计了统一响应类 ResponseResult...原创 2020-11-17 13:59:37 · 171 阅读 · 0 评论 -
JSP和Servlet
Servlet:用来处理客户端请求并生成动态网页内容的Java类Servlet的生命周期:Servlet的执行流程也就是他的生命周期,当服务器启动的 时候生命周期开始,然后通过init()方法初始化Servlet,再根据不同的请求调用doGet或doPost方法,最后再通过destroy方法进行销毁。即:初始化:web容器加载servlet,调用init()方法处理请求:当请求到达时,根据请求使用具体的doGet或doPost方法销毁:服务结束,web容器会调用destroy方法销毁servlet原创 2020-08-08 11:13:55 · 141 阅读 · 0 评论 -
数据库总结
数据库总结1.常见的三种引擎InnoDB:支持事务处理,支持外键,(支持行级锁和表级锁),有64TB的存储限制。若需要对事务的完整性要求比较高,需要实现并发控制,则选择InnoDBMyISAM:不支持事务和外键(仅支持表级锁),插入速度快,空间和内存的使用比较低,若表主要使用于数据的插入与读取,则选择MyISAMMEMORY:不支持事务和外键,所有的数据都在内存中,数据处理速度很快,但安全性不高,若表需要很快的读写速度,则需要选择MEMORY。2.数据库的三大范式第一范式(1NF):保证每一列原创 2020-07-18 00:09:08 · 254 阅读 · 0 评论 -
网络知识总结
1、三次握手和四次挥手:必要知识:ACK:称为确认ACK,当ACK等于1时确认号字段有效,否则无效,TCP规定,在连接建立之后所有有传送的报文段都必须将ACK置为1;seq:数据包的大小长度。确认号:期望收到的下一个报文段的序号SYN:同步SYN,在建立连接时用来同步序号;当SYN=1,ACK=0,则表示这是一个连接请求报文段,若对方同意建立连接,则相应报文中SYN=1,ACK=1;终止FIN:用来释放一个连接,当FIN=1时则表示此报文段的发送方数据已发送完毕,并请求释放连接。客户端向服原创 2020-07-15 21:32:03 · 227 阅读 · 0 评论 -
ThreadLocal
ThreadLocal是一个本地线程副本变量的工具类多个线程之间的共享变量,但每个线程都有自己的独立的值。每个Thread内部都有一个ThreadLocalMapThreaLocalMap里存着多个entry;每个entry里有本地对象(Key)和线程变量副本(value)。方法:get()方法:用于获取当前线程的副本变量值set()方法:用于设置当前线程的副本变量值initialValue()方法:用于初始化当前线程的副本变量值remove()方法:用于解除当前副本entry的key和原创 2020-07-14 10:35:12 · 124 阅读 · 0 评论 -
JVM类加载过程
JVM类加载过程所有的类都由类加载器加载,加载的作用就是将 .class文件加载到内存。类的一个完整生命周期分为:加载–>链接–>初始化–>使用–>卸载而连接又可以分为:验证–>准备–>解析加载:通过此类的全类名,查找此类的字节码文件,利用字节码文件创建Class文件。验证:确保Class文件符合虚拟机要求,不会危害到虚拟机自身安全。准备:进行内存分配,为static修饰的类变量分配内存,并设置初始值0或null,不包含final修饰的静态变量,因为fi原创 2020-07-13 20:05:18 · 116 阅读 · 0 评论 -
JVM类加载器
JVM中有三个重要的类加载器BootstrapClassLoader(启动类加载器):最顶层的类加载器,由C++实现,负责加载%JAVA_HOME%/lib目录下的jar包和类。ExtensionClassLoader(扩展类加载器):主要负责加载%JAVA_HOME%lib/ext目录下的jar包和类。AppClassLoader(应用程序类加载器):面向用户的类加载器,负责加载当前应用下Classpath下的所有jar包和类。双亲委派模型类加载之间的”父子“关系不是由继承来体现的,而是由”优先原创 2020-07-13 20:04:42 · 123 阅读 · 0 评论 -
JVM
JVM----垃圾回收0.GC堆?GC堆被分为新生代和老年代,还可以细分为Eden、From Survivor、To Survivor、Old Memory大部分对象都会出生在Eden区,特别大的对象会直接出生在Old memory,当经历过垃圾回收后就进入Survivor,并且对象的年龄+1,当超过15岁时就会进入Old Memory1.如何判断对象是否死亡?引用计数法:对象有引用指向它则+1,引用不指向-1,当为0时被回收。不能处理循环引用。可达性分析法:根据称为GC-Roots的对象为原创 2020-07-13 12:09:18 · 123 阅读 · 0 评论 -
多线程知识总结
进程和线程进程:简单来说就是运行的一个程序,在我们运行一个main程序时,就会有一个JVM线程,而这个main程序就是一个线程,也称为主线程。(CPU资源分配的最小单位)线程:一个进程可以有多个线程,同一个进程的线程可以共享该线程的堆区、方法区资源,但每个线程有自己的程序员计数器、虚拟机栈、本地方法栈。程序计数器:简单来说就是指示线程运行到哪一行,字节码指示器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令。还有在线程切回时获取该线程上次执行到那.java虚拟机栈:主要有局部变量表、常量原创 2020-06-25 23:05:57 · 329 阅读 · 0 评论 -
Java设计模式
Java设计模式设计原则:开闭原则:对扩展开放,对修改关闭,就是在程序进行扩展的时候,不能去修改原有的代码里氏代换原则:任何基类可以出现的地方,子类一定可以出现依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体迪米特法则:一个实体应尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立设计模式工厂模式简单工厂模式根据参数的不同返回不同的实例优点:调用者像创建一个对象,直接向工厂请求即可,不需要知道具体的实现,以提高系统的可维护性,可扩展性原创 2020-06-22 22:45:03 · 248 阅读 · 0 评论 -
Java对象的序列化与反序列化
java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨。1.Java序列化与反序列化Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。2.为什么需要序列化与反序列化我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可原创 2020-06-18 12:39:51 · 112 阅读 · 0 评论 -
Java创建对象的五种方式
Java创建对象的五种方式1. 使用new关键字Object obj = new Object();2.使用反射的Class类的newInstance()创建Class cla = Class.forName("全类名");Object obj = cla.newInstance();3.使用反射的Constructor类的newInstance()创建Class cla = Object.class();Constructor constructor = cla.getConstruc原创 2020-06-22 17:53:17 · 290 阅读 · 0 评论 -
反射的使用及其案例
反射:框架设计的灵魂;将类的各个组成部分封装为其他对象,这个就是反射机制好处:1.可以在程序运行过程中,操作这些对象。2.可以解耦,提高程序的可扩展性获取class对象的方式:Class.forName(“全类名”):将字节码文件加载进内存,返回class对象多用于配置文件类名.class:通过类名的属性class获取对象.getClass():getClass()方法在object类中定义着。###结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载原创 2020-06-22 17:23:54 · 454 阅读 · 0 评论 -
深入理解Java中的自动装箱与自动拆箱
自动装箱与自动拆箱Java中基本类型有八种,分别是byte,short,int,long,float,double,char,boolean;但是我们在使用集合类的时候,因为集合类在设计的时候持有的是我们所有类型的超类Object,这是基本类型就不能使用集合类了,所以Java就为每个基本类型封装了相应的包装类。自动拆装箱//Java5之前//装箱Integer integer = new Integer(10);//拆箱int i = integer.intvalue();//java5原创 2020-06-21 23:14:13 · 299 阅读 · 0 评论 -
异常
一、异常的分类1、异常可分为error和Exception,继承自Throwable;Error:描述JVM运行时的内部错误,如栈溢出、堆溢出等Exception:由于代码问题产生的错误IoException:由于输入输出产生的异常,RuntimeException:发生在运行时期:如数组下标越界,空指针异常,类型转换异常2、异常可分为受查异常和非受查异常;非受查异常:Error及其子类和RuntimeException及其子类,不强制用户进行异常处理;原创 2020-06-21 18:22:42 · 96 阅读 · 0 评论 -
HashMap和ConcurrentHashMap
HashMap :HashMap是线程不安全的,在并发环境下,可能会形成环状链表,导致get操作时,cpu空转,所以,在并发环境中使用HashMap是非常危险的。HashTable : HashTable和HashMap的实现原理几乎一样,差别无非是1.HashTable不允许key和value为null;2.HashTable是线程安全的。但是HashTable线程安全的策略实现代价却太大了,简单粗暴,get/put所有相关操作都是synchronized的,这相当于给整个哈希表加了一把大锁,多线程访问原创 2020-06-21 10:25:07 · 431 阅读 · 0 评论 -
包装类和基本数据类型
包装类是一个类,拥有方法和属性;包装类放在堆中,而基本数据类型放在虚拟机栈的局部变量表中;包装类的初始值是null,而基本数据类型整性是0,浮点型是0.0,boolean是false;相互转换Integer --> int:A = new Integer(2); int a = A.intValue()int --> Integer: int a = 3; new Integer(a);...原创 2020-06-19 11:59:24 · 94 阅读 · 0 评论 -
Java集合
SortedSet:有序的setDeque:双端队列SortedMap:有序的MapArrayList和LinkedList的区别?ArrayList的底层实现是数组,如果通过有参创建ArrayList的话,ArrayList就会创建一个定长的数组,而通过无参构造是就会创建一个长度为10的数组,若容量已满,则ArrayList扩容1.5倍Linkedlist的底层实现是链表所以实际比较的是数组和链表的区别ArrayList和Vector的区别(两者底层均是有数组实现)?线程安全..原创 2020-06-18 22:14:49 · 89 阅读 · 0 评论 -
数组和链表的区别
数组和链表的区别:1、连续性:数组需要连续的内存空间链表不需要连续的内存空间2、结构大小:数组的大小固定,不可以动态改变链表的大小不固定,可以动态改变3、增删查数组的查询速度快(下标),增删速度慢(需要移动大量元素)链表的查询速度慢(遍历),增删速度块(修改引用)4、访问数组可以通过下标随机访问链表必须经过遍历访问,不能随机访问。为什么数组的访问及查询比较快?CPU在读取数据的时候,会先将一部分数据读取到cache,而cache在读取数据的时候会将连续的一部分内存原创 2020-06-18 21:26:36 · 389 阅读 · 0 评论 -
== 和 equals 及HashCode
==:因为Java是值传递,所以,对于 " == "来说 ,不管是基本数据类型还是引用数据类型,其本质都是值比较,只不过引用数据类型的值是对象的地址。equals():不能比较基本数据类型,因为他是object的方法,在object中它也是和”==“作用相同。但在重写了equals()方法后,则是比较两个对象是否相等。HashCode和equals()当你把对象加入HashSet时,HashSet会先计算对象的HashCode值,与之前加入的对象的HashCode值相比较,如果没有相同的则直接加入原创 2020-06-18 12:25:45 · 70 阅读 · 0 评论 -
String StringBuilder Stringbuffer
String为什么是不可变的?String的是实现是private final char[] value,所以String对象是不可变的,所以String也就没有线程安全一说,因为它就相当于一个常量。public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. *原创 2020-06-18 11:28:23 · 82 阅读 · 0 评论 -
抽象类和接口
抽象类只可以继承一个,而接口可以实现多个。抽象类中的方法可有普通方法,而接口中的方法只能是抽象方法(JDK1.8后,接口方法也可以有默认实现)。接口中的变量只能是static、final变量,抽象类中不一定抽象类是对类的抽象,而接口是对具体行为的抽象接口中的方法默认是public,而抽象类中的方法可以是public、protected、default...原创 2020-06-18 10:38:35 · 79 阅读 · 0 评论 -
final this super static关键字
final:final关键字,意思是最终的,不可修改的,用来修饰类、方法、变量。final修饰的类,是不可以被继承的,并且类中的所有方法都会被隐式的指定为final方法。final修饰的方法,是不能被重写的;final修饰的变量,是常量,如果是基本数据类型,则其在初始化后便不可以被改变,如果是引用数据类型,则其在初始化后,便不能指向新的对象。static:static关键字主要有四种使用场景:1.修饰成员方法和成员变量,2.修饰静态代码块, 执行顺序(非静态代码块-》静态代码块-》构造方法原创 2020-06-17 11:34:07 · 75 阅读 · 0 评论 -
面向对象的三大特征
封装:对一个类中的属性进行封装,是外部类不能直接修改,保证了代码的安全性,但是可以提供一些外部可以访问的方法去操作属性。继承:不同类型的对象,可能有一定的共同点,继承可以减少代码的书写,提高代码的重用性、可维护性,提高我们的开发效率。多态:多态表现在类上就是类的向上向下转型;表现在方法上就是方法的重写,...原创 2020-06-17 10:57:25 · 109 阅读 · 0 评论 -
会创建几个对象?
虚拟机主要分为三块:栈:存基本数据类型和局部变量及对象的引用堆:存放对象实例和数组方法区:类加载后的信息,常量、静态变量str只是一个引用变量,他不是对象。new String()是在运行期间,通过String的构造器创建了一个对象,放在堆中”hello“是在编译期间,JVM会查询常量池是否有”hello“如没有,则开辟一个空间存储”hello“所有创建了两个对象:堆中的对象是运行的时候,会将常量池中的对象的值复制过去,并且将栈中的引用的值赋为堆中的对象的地址...原创 2020-06-16 15:49:08 · 205 阅读 · 0 评论 -
面向对象和面向过程
面向过程:面向过程的性能比较高,但是其开销较大,比较耗费资源,并且其的没有面向对象易维护,易复用,易扩展。面向对象:易维护,易复用,易扩展原创 2020-11-17 13:43:37 · 44 阅读 · 0 评论 -
深拷贝和浅拷贝
浅拷贝和深拷贝是相对于引用数据类型的,对基本数据类型没有此说法浅拷贝:创建一个引用,是引用的值为需要拷贝的对象的地址,此为浅拷贝;深拷贝:创建一个引用和一个新的对象,复制需要拷贝的对象的值,此为深拷贝。...原创 2020-06-21 17:18:50 · 81 阅读 · 0 评论 -
重载和重写
重载:同一个类中,多个方法的方法名相同,参数列表不同,返回类型、修饰符、异常可以不同,发生在编译时期。重写子类中,方法名、参数列表、返回值类型必须相同,异常可以变小,修饰符可以变大,发生在运行时期。...原创 2020-11-17 13:43:21 · 53 阅读 · 0 评论 -
==和equals hashcode
==本质是值比较,不管是基本数据类型还是引用数据类型,其本质比较的都是值,只不过引用数据类型变量存的值是对象的地址equals的作用也是判断两个对象是否相等,她不能用于比较基本数据类型,因为他是object的方法hashcode和equals(相等的hashcode是冲突)重写equals必须重写hashcode,因为如果eaulas相等,则hashcode一定相等,而hashcode相等,equals不一定相等,hashcode默认行为是堆上的对象产生独特值,如果没有重写hashcode,那么该cl原创 2020-06-19 10:05:37 · 76 阅读 · 0 评论 -
JDK JRE JVM
JRE java运行环境JDK 拥有JRE的一切,还有编译器和其他工具JVM 是运行Java字节码的虚拟机,字节码是(.class)文件Java程序从源代码到运行.java文件(源文件)----JDK中的javac编译----->.class文件(JVM可理解的Java字节码)—JVM–>机器可执行的二进制机器码Java语言是编译与解释并存的(Java源程序要先经过编译步骤,生成字节码文件,Java的字节码由解释器解释执行)编译:翻译完才能看解释:边翻译边看...原创 2020-06-16 11:41:00 · 89 阅读 · 0 评论