1.== 和 equals 的区别是什么?
答:==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值。(比较地址值即是指是否为同一个对象的引用)
equals()是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后比一般是比较对象的属性。
2.final 在 Java 中有什么作用?
答:a) final可以修饰类,这样的类不能被继承。
b) final可以修饰方法,这样的方法不能被重写。
c) final可以修饰变量,这样的变量的值不能被修改,是常量。
3.普通类和抽象类有哪些区别?
答: 抽象类:
1、抽象类中可以有普通方法,如果想让方法子类必须实现,就弄成抽象方法。
2、如果抽象类中有抽象方法,那么这个类必须定义为抽象类。
3、抽象类不能被new。
普通类:
1、普通类中不能有抽象方法。
2、如果一个普通类实现了一个抽象接口或者抽象类,那么意味着必须重写抽象方法。
4.Java 中 IO 流分为几种?
按流向分(站在程序角度考虑):输入流(input) 、输出流(output)
按类型分:
字节流(InputStream/OutputStream):任何文件都可以通过字节流进行传输。
字符流(Reader/Writer):非纯文本文件,不能用字符流,会导致文件格式破坏,不能正常执行。
节点流(低级流:直接跟输入输出源对接):FileInputStream/FileOutputStream/FileReader/FileWriter/PrintStream/PrintWriter.
处理流(高级流:建立在低级流的基础上)
转换流:InputStreamReader/OutputStreamWriter,字节流转字符流/字符流转字节流
缓冲流:BufferedInputStream/BufferedOutputStream BufferedReader/BufferedWriter可对节点流经行包装,使读写更快
5.File的常用方法都有哪些?
答: createNewFile()在指定位置创建一个空文件,成功就返回true,如果已存在就不创建,然后返回false。
mkdir() 在指定位置创建一个单级文件夹。
mkdirs() 在指定位置创建一个多级文件夹。
renameTo(File dest)如果目标文件与源文件是在同一个路径下,那么renameTo的作用是重命名, 如果目标文件与源文件不是在同一个路径下,那么renameTo的作用就是剪切,
而且还不能操作文件夹。
删除:
delete() 删除文件或者一个空文件夹,不能删除非空文件夹,马上删除文件,返回一个布尔值。
deleteOnExit()jvm退出时删除文件或者文件夹,用于删除临时文件,无返回值。
判断:
exists() 文件或文件夹是否存在。
isFile() 是否是一个文件,如果不存在,则始终为false。
isDirectory() 是否是一个目录,如果不存在,则始终为false。
isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute() 测试此抽象路径名是否为绝对路径名。
获取:
getName() 获取文件或文件夹的名称,不包含上级路径。
getAbsolutePath()获取文件的绝对路径,与文件是否存在没关系
length() 获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。
getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。
lastModified()获取最后一次被修改的时间。
6.List、Set、Map 之间的区别是什么?
答: Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List
的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。
Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对象按特定方式排序,例如TreeSet类,它可以按照默认排序,也可以通过实现
java.util.Comparator<Type>接口来自定义排序方式。
List中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,如通过list.get(i)方式来获得List集合中的元素。
Map中的每一个元素包含一个键对象和值对象,它们成对出现。键对象不能重复,值对象可以重复。
7.HashMap 和 Hashtable 有什么区别?
答: HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不
能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元
素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,
要看JVM。这条同样也是Enumeration和Iterator的区别。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
HashMap不能保证随着时间的推移Map中的元素次序是不变的。
8.如何实现数组和 List 之间的转换?
答:数组转list:Arrays.asList(array);list转数组list.Array()。
9.创建线程有哪几种方式?
答: 一、继承Thread类创建线程类
二、通过Runnable接口创建线程类
三、通过Callable和Future创建线程
10.常见的异常类有哪些?
答: Exception 类扩展出数个子类,其中 IOException、RunntimeException 是较常用的两种。
NullPointerException、ClassNotFoundException、IllegalArgumentException、ArithmaticException、ArrayIndexOutOfBoundsException。
11.TCP 为什么要三次握手,两次不行吗?为什么?
答: 为什么不采用两次握手?
如果是两次握手的情景:
客户端在发送一个连接建立请求之后进入等待状态,等到服务端确认之后就进入established状态。服务端在发送一个确认连接建立请求报文之后(不管客户端是否有回应)也进入
established状态。
这就好比,
A给B打电话,
A:你听得到我说话吗?
B:我听得到啊
A和B就都以为对方都能听得到自己了。
但有一种情况是,B的麦是坏的,A根本就听不到B说话,结果A没收到B的回应,但B却以为A能听得到他,B就一直等着A说点什么...这样让B身心俱疲。
三次握手:
客户端在发送一个连接建立请求报文之后进入等待状态,等到服务端返回确认建立连接的通知;
服务端发送确认建立连接请求报文,同时向客户端发送连接建立请求报文,进入等待状态。
客户端接受到服务端发送的确认请求报文。进入established状态。客户端接受到来自服务端的连接建立请求报文,发送确认连接建立请求报文。
服务端接受到来自客户端的确认建立连接报文,进入established。
12.OSI 的七层模型都有哪些?
从下到上依次为:
物理层-数据链路层-网络层-传输层-会话层-表示层-应用层
13.说一下你熟悉的设计模式?
答: 工厂方法模式(Factory Method Pattern)
Ø 抽象工厂模式(Abstract Factory Pattern)
Ø 建造者模式(Builder Pattern)
Ø 原型模式(Prototype Pattern)
Ø 单例模式(Singleton Pattern)
结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:
Ø 适配器模式(Adapter Pattern)
Ø 桥接模式(Bridge Pattern)
Ø 组合模式(Composite Pattern)
Ø 装饰者模式(Decorator Pattern)
Ø 外观模式(Facade Pattern)
Ø 享元模式(Flyweight Pattern)
Ø 代理模式(Proxy Pattern)
行为型模式用来对类或对象怎样交互和怎样分配职责进行描述主要包含以下11种设计模式:
Ø 责任链模式(Chain of Responsibility Pattern)
Ø 命令模式(Command Pattern)
Ø 解释器模式(Interpreter Pattern)
Ø 迭代器模式(Iterator Pattern)
Ø 中介者模式(Mediator Pattern)
Ø 备忘录模式(Memento Pattern)
Ø 观察者模式(Observer Pattern)
Ø 状态模式(State Pattern)
Ø 策略模式(Strategy Pattern)
Ø 模板方法模式(Template Method Pattern)
Ø 访问者模式(Visitor Pattern)
14.为什么要使用 Spring?
答: 1.方便解耦,便于开发(Spring就是一个大工厂,可以将所有对象的创建和依赖关系维护都交给spring管理)
2.spring支持aop编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能)
3.声明式事务的支持(通过配置就完成对事务的支持,不需要手动编程)
4.方便程序的测试,spring 对junit4支持,可以通过注解方便的测试spring 程序
5.方便集成各种优秀的框架()
6.降低javaEE API的使用难度(Spring 对javaEE开发中非常难用的一些API 例如JDBC,javaMail,远程调用等,都提供了封装,是这些API应用难度大大降低)
15.解释一下什么是 AOP?
答: AOP即面向切面编程,是OOP编程的有效补充。
使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。
从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。
这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可。从而达到了 将不同的关注点分离出来的效果。
16.解释一下什么是 IOC?
在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
17.Spring 常用的注入方式有哪些?
答: 构造方法注入,setter注入,接口注入。
18.什么是 Spring Boot?
答: spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置。
19.Mybatis 中 #{}和 ${}的区别是什么?
答: . #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值
是id,则解析成的sql为order by "id".
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by
id.
3. #方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名.
6.一般能用#的就别用$.
20.数据库的三范式是什么?
答: 第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要
求,否则,将有很多基本操作在这样的关系模式中实现不了。
第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF。
21.说一下 ACID 是什么?
答: Atomicity原子性
Consistency一致性
Isolation隔离性
Durability耐久性
22.Char 和 VarChar 的区别是什么?
答: 1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的
VARCHAR2 (10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。
2.CHAR的效率比VARCHAR2的效率稍高。
3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类
型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用
VARCHAR2而不是VARCHAR
23.Float 和 Double 的区别是什么?
答: float:占4个字节
double: 占8个字节
double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,在不确定的情况下还是尽量用double以保持正确性.
24.如何做 MySQL的性能优化?
答: 1.为查询缓存优化你的查询
2.EXPLAIN你的SELECT查询
3.当只要一行数据时使用LIMIT1
4.为搜索字段建索引
5.在Join表的时候使用相当类型的例,并将其索引
6.千万不要ORDER BY RAND()
7.避免 SELECT *(select (0))
8.永远为每张表设置一个ID
9.使用ENUM而不是VARCHAR
10.从PROCEDURE ANALYSE()
11.尽可能的使用NOT NULL
12. Prepared Statements
13.无缓冲的查询
14.把IP地址存成UNSIGNED INT
15.固定长度的表会更快
16.垂直分割
17.拆分大的DELETE或INSERT语句
18.越小的列会越快
19.选择正确的存储引擎
20.使用一个对象关系映射器
21.小心“永久链接”
25.Redis 支持的数据类型有哪些?
答: 1) 字符串类型 string
2) 哈希类型 hash
3) 列表类型 list
4) 集合类型 set
5) 有序集合类型 sortedset