[个人笔记] JAVA基础

0. 推荐书单

java编程思想
Effective Java
深入浅出JVM
Head First设计模式
重构:改善既有代码的设计

1. 面向对象四大特征:

封装:把过程和数据包围起来,对数据的访问只能通过特定的界面
继承:允许和鼓励类的重用,提供一种明确表达共性的方法,一个新类可以从现有的类中派生
多态:不同类的对象对同一个消息做出响应
抽象:忽略一个主题中和当前目标无关的东西,专注与当前目标有关的东西。

2. 面向对象五大基本原则

单一职责原则:一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。
开放封闭原则:对象或实体应该对扩展开放,对修改封闭。
里氏替换原则:在对象 x 为类型 T 时 q(x) 成立,那么当 S 是 T 的子类时,对象 y 为类型 S 时 q(y) 也应成立。(即对父类的调用同样适用于子类)
依赖倒置原则:高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。
接口隔离原则:不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多!
最少知道原则(迪米特法则):一个类对其他类最少知道

3. JDK,JRE,JVM之间的区别

JVM是一个运行字节码的本机应用程序;java运行时环境(JRE)包含了JVM和类库;JDK包括JRE再加上一个编译器和其他工具,是编写和编译java程序所必须的

4.OOP优势

面向对象编程(OOP)通过对真实对象模拟应用程序来工作,他的优势包括:代码易于维护,可重用性和可扩展性

5.类成员访问控制修饰符

在这里插入图片描述

6. StringBuilder和StringBuffer的区别

StringBuffer中的方法是同步的,所以他适用于多线程的环境,这带来的代价就是性能的降低,StringBuilder是StringBuffer的非同步版本
在不需要同步的时候,可以选择StringBuilder而不是StringBuffer

7. 使用可变参数和参数数组的区别

可变参数形式:main(String… args),数组形式:main(String[] args)
可变参数形式允许不传递参数或者传递任意数量的参数,数组形式就需要传递数组或者传递null;所以可变参数只需要列出参数不需要创建一个数组来完成参数的输入

多态对静态方法不起作用,因为静态方法属于前期绑定,final方法不支持扩展,所以多态对final方法也是不起作用的

8.一些需要注意的问题:

1.在一个“.java”源文件中是否可用包括多个类(非内部类)有何限制
ans:可用有多个类,但是只能够有一个public的类,并且类名和文件名要一致。
2.在switch条件判断中:
条件判断是转换成int进行处理的,所以其判断的值不能够是long类型;在java版本1.7之后支持String类型作为switch参数,但是是在编译器层面实现的,在编译的过程中,编译器根据源代码的含义来进行转换,把字符串类型转换成和整数类型兼容的格式,在switch中的字符串被替换成了对应的hashcode,case子句中也是这样,同时在case中需要使用String的equals方法进行字符串的比较
3.char类型可以存储一个中文汉字,存储unicode编码字符,包含了汉字,如果某些汉字没有被包含进这个库,那么就不能表示,char类型占用两个字节
4.final修饰 是引用不能变,引用指向的对象是可以变的
5.==和equals的区别:==判断是否是同一个对象 equals判断对象的内容是否相同,String对象的equals方法进行了重写
6.Integet和int的区别
int是8种原始数据类型之一,java为每一种原始数据类型都提供了封装类
八种基本的数据类型:char,short,int,long,boolean,float,double,byte
int默认值是0,Integer默认值是null
7.round函数:=floor(x+0.5)
8.if(username.equals(“zxx”)) username可能是null,会报空指针异常,需要改成“zxx”.equals(username)
9.public,private,protected和不写的区别
在这里插入图片描述

10.构造器是否可以被重写,构造器不能被继承,所以不能够重写,但是可以重载
11.接口可以继承接口,抽象类可以实现接口,抽象类可以继承具体类。抽象类可以有静态的main方法
抽象类和普通类的唯一区别:抽象类不能创建实例对象,允许有abstract方法
12.java中实现多态的机制
靠父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,而程序调用的方法在运行期才动态绑定。
13.抽象类和接口的区别
抽象类中定义的方法必须在具体子类中实现,所以不能够有抽象的构造方法或者抽象的静态方法,
接口中所有的方法都是抽象的,默认为public abstract类型,接口中的成员变量类型默认是public static final类型
他们的语法区别

  1. 抽象类可以有构造方法,接口不能有构造方法
  2. 抽象类中可以有普通成员变量,接口中没有普通成员变量
  3. 抽象类中可以有普通的方法,但是接口中方法全都是抽象的
  4. 接口只能pulic方法,抽象类可以protected
  5. 抽象类中可以有静态方法,接口中不能有静态的方法
  6. 一个类可以实现多个接口,但是只能继承一个抽象类
    14.内部类 static nested class和inner class
    15.super.getClass().getName()等价于getClass().getName() ,这是因为getClass方法是final的不能覆盖 ;;如果想要得到父类的名称,需要这样getClass().getSuperClass().getName()
    16.String和StringBuilder,StringBuilder没有覆盖equals方法和hashcode方法
    17.String s=“a”+“b”+“c”+"d"只会创建一个String对象,这是因为javac编译对字符串常量直接相加的表达式进行了优化,不必等到运行期间去进行加法运算,在编译期间去掉加号,直接编译成一个这些常量相连的结果。 注意区别String a=“a”;a+“b”“ab”(值为false) ;;;“a”+“b”“ab”(值为true)
    18.try中有return,finally中的code执行时间
    try中碰到return,先把返回值记录下来,然后去执行finally里面的代码之后返回之前记录下来的返回值
    19.final,finally,finalize的区别
    final是声明属性,方法,类表示属性不可变,方法不可覆盖,类不可继承
    finally是异常处理语句结构的一部分,表示总是要执行
    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的这个方法,可以覆盖这个方法提供垃圾收集时的其他资源回收,比如关闭文件等,不保证此方法总被调用(无法保证什么时候使用垃圾收集)
    20.error和exception的区别
    error表示恢复不是不可以但是很困难的一种严重问题,程序本身无法克服和恢复,比如内存溢出,exception是一种设计或者实现问题,程序可以克服和恢复,在程序运行正常的时候会不会发生的
    21.java异常处理机制
    首先,异常是指java程序在运行的时候(非编译)所发生的非正常的情况或者错误,,java中的每一个异常都分别封装到一个对象来表欧式,这个对象中包含有异常的信息,所有异常的跟是java.lang.Throwable,下面派生了两个子类:Error和Exception。Exception又分为系统异常和普通异常,系统异常是软件本身缺陷导致的问题,也就是软件开发人员考虑不周导致的,软件使用者无法克服和恢复这种问题,但是在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,空指针异常,数组下标索引越界异常,算术异常(÷0),方法未找到异常,类转换异常,数组中包含不兼容的值异常;普通异常是运行环境的变化或者异常导致的问题,用户可以克服,如网络短线,硬盘空间不够等
    22.线程的实现
    new thread().start();一个类继承Thread类,然后实现run方法,
    实现Runnable接口,重写run方法
    在这里插入图片描述

实现Callable接口,重写call方法
在这里插入图片描述

使用线程池
在这里插入图片描述

runablle和callable的区别
runable接口中的run方法返回值是void类型的,他的作用只是为了获得run方法中的代码
callable接口中的call方法是有返回值的,是一个泛型,和future,futuretask配合可以用来获取异步执行的结果
23.synchronized和java.util.concurrent.locks.Lock异同
主要相同点:Lock能够完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语言和更好的性能,synchronized会自动释放锁,而Lock一定要求程序员手动书房,并且必须在finally从句中释放,Lock还有更强大的功能,比如tryLock方法可以非阻塞的方式去拿锁
24.ArrayList和Vector的区别
同:两个类都实现了List接口(List接口继承了Collection),都是有序的集合,可重复
异:(1)同步性:Vector是线程安全的,他的方法之间是线程安全的,ArrayList是线程序不安全的;;类似的比较Hashtable和HashMap(见下)
(2)数据增长:ArrayList和Vector都有一个初始的容量大小,当超过容量的时候,ArrayList每次增加1.5倍(根据源码),Vector增长2倍
25.HashMap和HashTable
同:HashMap是Hashtable的轻量级实现(非线程安全的实现)都完成了Map的接口,
异:HashMap允许空键值,非线程安全;HashMap把HashTable的contains方法去掉了,改成了containsvalue和containsKey方法
26.字节流和字符流的区别:
27.Serializeable标注该对象可以被序列化
28.JVM加载class文件的原理机制:
jvm中类的加载是由ClassLoader和他的子类实现的,Java ClassLoader是一个重要的java运行时系统组件。负责在运行时查找和转入类文件的类
29.heap和stack
java内存分为两类,一类是栈内存,一类是堆内存,栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用来存储这个方法内部的局部变量,这个方法结束的时候,分配给这个方法的栈会释放,栈内部的变量也会随之释放;;堆一般存放不放在当前方法栈中的那些数据,比如new创建的对象就放在堆里,所以,他不会随着方法的结束而消失,方法中的局部变量使用final修饰后,也会放在堆里。
30.垃圾回收
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存,垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者是长时间没有使用的对象进行清理回收。回收机制:标记清理,标记整理,复制,分代回收算法
31.内存泄漏问题

9. javaweb

1.get和post的区别
2.request.getAttribute和request.getParameter()区别
3.jsp内置对象:
request:用户端请求
response:网页传回用户端的响应
pageContext网页属性
session与请求有关的会话期
application:servlet正在执行的内容
out用来传送回应的输出
config:servlet的构架部件
page:jsp网页本身
exception:针对错误网页,未捕捉的例外

10. HashMap实现

1.8以前
底层是数组和链表结合在一起使用也就是链表散列
在1.8以后
链表大于阈值(默认是8) (数组长度如果小于64,那么就先进行数组扩容,而不是转换成红黑树)时,把链表转化成红黑树,减少搜索时间
HashMap的长度为什么是2的n次幂
为了让HashMap存取高效,也就是尽量把数据分配均匀,hash值映射要比较的松散,这个散列值使用的时候需要对数组的长度取取模运算,得到余数才是对应的数组下标,数组下标计算方法是(n-1)&hash,n是数组的长度,从这里可以看出n需要是2的幂次方,,对于不适用%的原因是,在长度是2的n次幂的时候,&和%效果一致,并且运算效率更高
为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?
new 一个 Thread,线程进入了新建状态;调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 而直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。

11. 并发

synchronized关键字
synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被他修饰的方法或者代码在任意时刻只能有一个线程执行。
三种使用方法

  1. 修饰实例方法: 作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁
  2. 修饰静态方法: 也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份)。所以如果一个线程 A 调用一个实例对象的非静态 synchronized 方法,而线程 B 需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。
  3. 修饰代码块: 指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值