摘要

本文是对一些java基础知识的整理,把之前印象笔记里面的全部慢慢搬到这个blog来

为了方便就按照《Thinking In Java》的目录来编辑。

这里面的内容均为面试题相关,可能的考点等

这本书里面有些翻译不是很好,建议和英文版对照。


Chapter1-Introduction to Objects

特性

抽象、封装、继承、多态

面向对象设计方法主要特征:继承、封装、多态。

延伸点:反射会破坏代码的封装性(mock等)


Chapter2-Everything Is an Object

Object方法

return method 解释
protected Object clone() 创建并返回此对象的一个副本。
protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
void notify() 唤醒在此对象监视器上等待的单个线程。
void notifyAll() 唤醒在此对象监视器上等待的所有线程。
void wait() 在其他线程调用此对象的 notify()方法或 notifyAll()方法前,导致当前线程等待。
void wait(long timeout) 在其他线程调用此对象的 notify()方法或 notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。
void wait(long timeout, int nanos) 在其他线程调用此对象的 notify()方法或 notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。

方法属于对象的成员,静态方法属于类的成员

Q:为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面?

一个很明显的原因是 JAVA 提供的锁是「对象级」 的而不是「线程级」的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的 wait()方法就有意义了。

如果 wait()方法定义在 Thread 类中,线程正在等待的是哪个锁就不明显了。

简单的说,由于 wait,notify 和 notifyAll 都是锁级别的操作,所以把他们定义在 Object 类中因为锁属于对象。

拓展:
在 Java 中,每个对象都有两个池,锁(monitor)池和等待池

  1. 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized 方法(或者 synchronized 块),由于这些线程在进入对象的 synchronized 方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。

  2. 等待池:假设一个线程A调用了某个对象的 wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在 synchronized 中,这样自然在执行 wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。

如果另外的一个线程调用了相同对象的 notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的 notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.


Q:为什么 wait 和 notify 方法要在同步块中调用?

  1. 避免 IllegalMonitorStateException
  2. 避免任何在 wait 和 notify 之间潜在的竞态条件

参考资料:并发编程之 wait notify 方法剖析

基本数据类型

Integer,Float,Double等都继承自Number类

名称 包装类型 初始化 其他
boolean Boolean false 1位
byte(1字节) Byte (byte)0 ASCII码:空格:32;数字0到9:48到57,后面为大小写字母; byte 类型用在大型数组中节约空间,主要代替整数,因为 占用的空间只有 int 类型的四分之一
short(2字节) Short (short)0 Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
char(2字节) Character '\u0000'(null) 单一的 16 位 Unicode 字符;
int(4字节) Integer 0
float(4字节) Float 0.0f 精确到小数点后6位,在储存大型浮点数组的时候可节省内存空间;
long(8字节) Long 0L
double(8字节) Double 0.0d 精确到小数点后15位(默认的小数类型)

BigInteger 任意精度的整数,不可变

BigDecimal 任何精度的定点数(商业计算),不可变,通常建议优先使用String构造方法

参考:Java BigDecimal详解

延伸点:为什么int整型(32位)的范围是-32768到32767?

parseInt()是把String变成int的基础数据类型;

类型转换

byte,short,char-> int -> long -> float -> double 不同类型运算结果类型向右边靠齐。

浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入


拆箱和装箱

装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的

大多数情况下两者相同,java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)等实现了自己的equals,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true。

valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。

在 Java 8 中,Integer 缓存池的大小默认为 -128~127,所以除非用 new Integer() 显式的创建对象,否则都是同一个对象(-128~127)

比较符号 比较对象 数据转型
== 同一个对象 有表达式会触发
equals 同一个类型和内容 不触发

一般会考你“==”和equals的区别,数据转型,拆箱装箱

“==”和equals记住,前者相同,后者相等。前者会触发数据转型。

new Integer()新建对象

valueof装箱,xxxValue拆箱

Math类

方法 功能 返回值
ceil() 向上取整 double
floor() 向下取整 double
round() 原来的数字加上0.5后再向下取整 int

变量名

三种元素构成:数字+字符+$+下划线。

不能以数字开头+不能是关键字.

类名

一个文件中可以有多个类,如果没有public类,则可以与任意类名相同,如果有public类则文件名必须与此类名相同,因为一个文件中只能有一个public类。如果文件中只有一个类,则文件名必须与类名相同

注释

名称 功能
Override 标识当前的方法,是否覆盖了它的父类中的方法
Deprecated 已经过期或者即将过期的方法,不推荐我们使用
SuppressWarning 屏蔽相应的警告

Chapter3-Operators

运算符 结合性 其他
() [] . 从左到右
! +(正) -(负) ~ ++ -- 从右向左 ~n=-n-1
* / % 从左向右 %取余操作,只适用于整型
+(加) -(减) 同上
<< >> >>> 同上 按位左(右)移运算符, 按位右移运补零运算符。
< <= > >= instanceof 同上
== != 同上
& 同上 相对应位都是1,则结果为1,否则为0
^ 同上 相对应位值相同,则结果为0,否则为1
同上 相对应位都是0,则结果为0,否则为1
&& 同上 逻辑与(前面表达式为false,后面不计算)
逻辑或 同上 逻辑或(前面表达式为true,后面不计算)

Chapter4-Controlling Execution

break continue return

  1. break 中断并跳出当前循环。直接跳出当前的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试。他只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出.

  2. continue 终止当前的循环过程,但他并不跳出循环,而是继续往下判断循环条件执行语句.他只能结束循环中的一次过程,但不能终止循环继续进行.
  3. return 导致当前的方法退出,并返回那个值。

switch

选择因子:整数类型(long除外),enum(jdk1.5后),String(jdk1.7后)

字符串的switch是通过equals()和hashCode()方法来实现的。

注意break


Chapter5-Initialization & Cleanup

类的加载包括:加载,验证,准备,解析,初始化

构造方法内可以用this调用另一个构造方法

重载与重写

同名不同参数为重载与返回值类型无关;(比如你调用这个方法的时候java怎么根据返回值来区分你实际调用的方法)与访问修饰符无关

子类覆写父类的方法为重写

方法重写应遵循“三同一小一大”原则:

  1. ​ “三同”:即方法名相同,形参列表相同,返回值类型相同;
  2. ​ “一小”:子类方法声明抛出的异常比父类方法声明抛出的异常更小或者相等;
  3. ​ “一大”:子类方法的访问修饰符应比父类方法更大或相等。

题型:怎么算重载和重写,重写的修饰符范围

final不能重写


Chapter6-access control

访问控制符

名称 功能
包访问权限 不提供任何权限修饰词情况下;默认包:处于同一个文件目录下
public 都可用
protected 修饰方法和成员变量,处理继承的概念,保证了仅有继承的类才能访问这个成员。同时具有包访问权限
private 仅在被包含的类里面可用,类的变量通常声明为private

❤class编写顺序可按照:public

Java基础-基于《Thinking In Java》的更多相关文章

  1. 【Java基础】11、java方法中只有值传递,没有引用传递

    public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...

  2. 【Java基础】4、java中的内部类

    内部类的分类:常规内部类.静态内部类.私有内部类.局部内部类.匿名内部类. 实例1:常规内部类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  3. Java基础系列1:Java基本类型与封装类型

    Java基础系列1:Java基本类型与封装类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括两 ...

  4. 【JAVA】基于MVC架构Java技术荟萃案例演练

    基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servle ...

  5. java基础3.0:Java常用API

    本篇介绍Java基础中常用API使用,当然只是简单介绍,围绕重要知识点引入,巩固开发知识,深入了解每个API的使用,查看JavaAPI文档是必不可少的. 一.java.lang包下的API Java常 ...

  6. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...

  7. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

  8. Java基础系列1:Java面向对象

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 概述: Java是面 ...

  9. Java 基础之详解 Java 反射机制

    一.什么是 Java 的反射机制?   反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...

随机推荐

  1. P3357 最长k可重线段集问题 网络流

    P3357 最长k可重线段集问题 题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\sub ...

  2. spring-mybatis源码追踪

    启用一个扫描类 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <propert ...

  3. CPU缓存刷新的误解

    即使是资深的技术人员,我经常听到他们谈论某些操作是如何导致一个CPU缓存的刷新.看来这是关于CPU缓存如何工作和缓存子系统如何与执行核心交互的一个常见误区.本文将致力于解释CPU缓存的功能以及执行程序 ...

  4. rpm 安装卸载

    安装命令 rpm -i example.rpm 安装 example.rpm 包: rpm -iv example.rpm 安装 example.rpm 包并在安装过程中显示正在安装的文件信息: rp ...

  5. java编码规范_缩进和注释

    1.       缩进排版(Indentation) 4个空格常被作为缩进排版的一个单位.缩进的确切解释并未详细指定(空格 vs. 制表符).一个制表符等于n个空格(视具体的编辑器而定,Eclipse ...

  6. 爬虫6:pyquery库

      强大又灵活的网页解析库,如果觉得正则写起来太麻烦,BeautifulSoup语法太难记,而你又熟悉jQuery的语法,那么用PyQuery就是最佳选择     一. 初始化 1. 字符串初始化 h ...

  7. 读取Properties文件的六种方法

    1.使用java.util.Properties类的load()方法 示例: InputStream in = new BufferedInputStream(new FileInputStream( ...

  8. CentOS7打开关闭防火墙与端口

    http://www.javahelp.com.cn/h-nd-747.html#_np=153_1707

  9. Xcode括号自动补全以及二次编译后不显示输入

    今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...

  10. FlowPortal-BPM——验证控件

    自上而下依次是: 非空验证.范围验证.规则表达式验证.比较验证.自定义验证 非空验证的使用: 1.ControlToValidate - 监控的控件 2.ErrorMessage - 为空时提示信息