一.面向对象
1.面向对象的特征
继承:
封装: 封装是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式(方法),提高安全性。
多态:
2.作用域public,private,protected,default的区别
3.最有效的算出2*8的结果
2<<3 = 2乘2的3次方
其他
12<<1 = 12乘2的1次方 12>>1 = 12除2的1次方
12<<2 = 12乘2的2次方 12>>2 = 12除2的2次方
12<<3 = 12乘2的3次方 12>>3 = 12乘2的3次方
4.数组没有leng()方法,有leng属性,String有length()方法
5.String,StringBuffer,StringBuilder的区别
Sting是不可变字符序列,存储在字符串常量池中
StringBuffer底层是Byte数组(JDK8是char类型的数组,JDK9后是byte类型的数组),系统会对该数组扩容,
线程安全,效率相对StringBuilder低
StringBuilder是JDK5加入的,用法和StringBuffer一样,线程不安全,效率比StringBuffer高
如果要对字符串做拼接,建议用StringBuffer或StringBuilder
6.Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类
方法的重载的条件:
发生在同一个类中.
方法名相同
参数列表不同(类型,个数,顺序)
构造方法是最典型的重载
方法重写:
重写是对于两个类来说的,两个类必须是继承关系,当父类中的方法无法满足子类的需求的时候,
子类可以重写父类中的方法
方法名,返回值类型,参数列表,必须和父类中的一致
重写的方法不能比被重写的方法拥有更低的访问权限
重写的方法不能比被重写的方法抛出更宽泛的异常(关于异常后面的章节再讲)
私有的方法,构造方法,静态的方法,不能被重写
重写指的是成员方法,和成员变量无关
7.JVM 加载 class 文件的原理机制
JVM 中类的装载是由 ClassLoader 和它的子类来实现的,负责在运行时查找和装入类文件的类
8.抽象类和接口的区别
相同点
接口和抽象类都不能实例化
都位于继承的顶端,用于被其他实现或继承
都包含抽象方法,其子类都必须覆写这些抽象方法
不同点
9.switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上
在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
10.final finally finalize区别
11.super和this的对比
12.==与 equals的区别
== : 对于基本数据类型比较的是地址,引用数据类型比较的的是地址值是否相等
equals :它的作用也是判断两个对象是否相等.Object类下面的equals比较两个对象是否相等的时候,比较的是地址值.String类的重写了equals,比较两个对象是否相等,比较的是对象的内容
13. 值传递
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
答案: 值传递 .
public class lianxi01 {
public static void main(String[] args) {
Student s1 = new Student("小张");
Student s2 = new Student("小李");
lianxi01.swap(s1, s2);
System.out.println("s1:" + s1.getName());
System.out.println("s2:" + s2.getName());
}
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
System.out.println("x:" + x.getName());
System.out.println("y:" + y.getName());
}
}
public class Student {
String name;
public Student() {
super();
}
public Student(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
最后输出结果:
x:小李
y:小张
s1:小张
s2:小李
图解
14.JDK 中常用的包有哪些
java.lang:这个是系统的基础类;
java.io:这里面是所有输入输出有关的类,比如文件操作等;
java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
java.net:这里面是与网络有关的类;
java.util:这个是系统辅助类,特别是集合类;
java.sql:这个是数据库操作的类。
15.IO流
15.1 java 中 IO 流分为几种?
按照流的流向分,可以分为输入流和输出流;
按照操作单元划分,可以划分为字节流和字符流;
按照流的角色划分为节点流和处理流。
15.2 BIO,NIO,AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
16.Files的常用方法都有哪些?
Files. exists():检测文件路径是否存在。
Files. createFile():创建文件。
Files. createDirectory():创建文件夹。
Files. delete():删除一个文件或目录。
Files. copy():复制文件。
Files. move():移动文件。
Files. size():查看文件个数。
Files. read():读取文件。
Files. write():写入文件。
17.String相关
String str="i"与 String str=new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
String s = new String(“xyz”);创建了几个字符串对象
两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。
18.多线程
1.线程和进程的区别?
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以开启多个线程
进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源
2.创建线程有哪几种方式
①. 继承Thread类
②. 实现Runnable接口
③. 实现Callable接口
④. 通过线程池创建线程;
3.说一下 runnable 和 callable 有什么区别
Runnable接口中的run()方法的返回值是void
Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果
4.线程有哪些状态
创建状态。
就绪状态
运行状态。
阻塞状态。
死亡状态。
5.死锁是什么?怎么防止死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
死锁的四个必要条件:
互斥条件:一个资源每次只能被一个进程使用
请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺
环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。
19.ArrayList 和 LinkedList 的区别是什么?
20.hashCode()与equals()的相关规定
如果两个对象相等,则hashcode一定也是相同的
两个对象相等,对两个equals方法返回true
两个对象有相同的hashcode值,它们也不一定是相等的
综上,equals方法被覆盖过,则hashCode方法也必须被覆盖
hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
21.Collection 和 Collections 有什么区别?
java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
22.如何比较两个文件是否相等
采用MD5算法对两个文件进行检验,如果检验的结果一致,则两文件内容一致.反之不一致.
三.京淘项目总结
1.商品查询
对商品表(tb_item)和商品分类表(tb_item_cat)表做查询.
两张表是一(分类)对多(商品)的关系,在商品表中保存商品所属分类的id,这是外键,与分类表中的id一致.
首先是对商品表做分页查询,查完后将结果封装到list集合中,然后又对tb_item做总记录数的查询,最后将总记录和list一起做封装,将封装的数据返回
第二步是对商品分类表的查询,通过商品商品分类表的id查询名称,然后将结果返回到前端页面.再这里第一次是访问数据库,后面是查缓存.
2.添加商品
涉及到三张表:商品表,商品分类表,商品详情表.商品详情表和商品表是一对一的关系.商品详情表中id及是主键也是外键,与商品表中的id一致
第一步:选着商品分类,通过访问商品分类表,返回商品分类的名称,显示在前端页面.第一次访问的是数据库,第二次访问缓存
第二步:添加商品的基本信息,如标题,价格,数量,图片等,图片回显用到nginx反向代理
第三部:添加商品的详细信息
最后提交,第一,第二步添加的数据都持久化到商品表,第三部添加的数据持久化到商品详情表
因为涉及到两张表的持久化,所以加事务控制