最近发现了很多同学出现的一个问题,就是互联网不行了, java不行了,要考虑转行了,公司根本不招人,简历已读不回,没有面试机会等等问题,甚至有人说自己这辈子最后悔的事情就是进入it这个行业。
我每次看到这样的反馈或者这样的说法的时候,心里总不是滋味,我承认大家现在反馈的问题在一定程度上确实是客观存在的情况,但是大家有没有人认真的思考过为什么会出现这样的问题,以及如何解决这个问题呢?
现在行情变差了,大家就开始抱怨市场的问题,有没有冷静的分析下是自己的问题呢?
我之前也提到过,其实现在所带来的这些所有的问题,就是因为企业的要求变高了,之前可能需要60分,现在需要80分了,但是大部分人不具备80分的水平,所以感觉自己在这个行业混不下去了,人在出现问题的时候一定不会先想到是自己的问题,一定是先找其他人的问题,这个很正常,我也是这样,但是我们冷静分析下的话,你看看企业没有在招人吗?
你身边没有一个人拿到offer吗,并不是这样的,企业依然有招人的需求,只不过那个人不是你而已,那么有没有冷静的分析下自己到底差在哪了呢,我们现在所有的抱怨都解决不了问题,你我他,任何一个人都改变不了市场,我们需要做的事情是弥补自己的差距,找到对应的解决方案,不要一味的抱怨。
我把这份笔记推荐给正在求职Java开发工作的人,扔掉网上那些千篇一律的面试题,这份笔记能让你节省时间快速复习。也将此笔记推荐给Java程序员、技术经理、架构师们——总之、还没有完全脱离开发的在职人员,不需要刻意去通读它,把它放在案头,在你用Java实现某项功能的时候,看看这本书上的相关介绍——你会发现,程序原来还可以这样写,而且这样写居然更好。
基本的编程结构
基本要点
-
在Java中,所有的方法必须在类中声明。非静态方法只能在该方法所属类的对象上调用。
-
静态方法不是通过对象调用。程序从静态的main方法开始执行。
-
Java有8个基本数据类型:5个整型、2个浮点型和1个布尔型。
-
Java操作符和控制结构与C或者JavaScript的非常相假。
-
Math类提供常见的数学函数。
-
字符串对象是字符序列,或者更精确地说,是UTF-16编码中的Unicode编码点的序列。
-
使用system.out对象,你可以在终端窗口指示输出。绑定system .in的scanner可以读取终端输入。
-
数组和集合用来收集相同类型的元素。
面向对象编程
基本要点
-
更改器方法改变对象的状态;存取器方法不改变对象的状态。
-
在Java中,变量不持有对象;它们只有对象的引用。
-
实例变量和方法实现是在类的内部声明的。
-
实例方法是通过对象调用的,通过this引用可访问该对象。
-
构造函数与类名相同。一个类可以有多个(重载)构造函数。
-
静态变量不属于任何对象。静态方法不是通过对象调用的。
-
类是按包的形式来组织的。使用import声明,这样程序中就不必使用包名。
-
类可以嵌套在其他类中。
-
内部类是非静态嵌套类。它的实例有个外部类对象的引用、这个外部类构建了内部类。
-
java doc工具处理源代码文件、根据声明和程序员提供的注释产生HTML文件。
接口和lambda表达式
基本要点
-
接口指定了一组实现类必须提供的方法。
-
接口是任何实现该接口的父类。 因此,可以将类的实例赋值给接口类型的变量。
-
接口可以包含静态方法。接口的所有变量默认是tatic和lfinal的。
-
接口可以包含默认方法, 实现类可以继承或者覆盖该默认的方法。
-
Comparable 和Comparator接口是用来比较对象的。
-
lambda表达式代表一 段代码块, 这块代码可以在稍后的某个时间点执行。类可以嵌套在其他类中。
-
lambda表达式转 变为函数式接口。.
-
方法引用和构造函数引用在不调用它们的情况下引用方法或构造函数。
-
lambda 表达式和局部内部类可以有效地访问来自闭合作用域的final变量。
继承与反射
基本要点
-
子类可以继承或者覆盖父类的方法。
-
使用关键字supe r来调用父类方法或者构造函数。
-
fina1方法不能被覆盖; final类 不能被继承。
-
abstract方法没有实现: abstract类 不能被实例化。
-
子类方法可以访问子类的受保护成员,但仅适用于同-个子类的对象。
-
所有类都是object的子类, 它提供了tostring. equals. hascode和clone方法。
-
所有枚举类型都是Enum的子类,它提供了tostring. valueOf和compareTo方法。
-
Clasa类提供 了Java类型的信息,包括类、数组、接口,基本类型或者void。
-
你可以使用c1ass对象来加载 与类文件放在- -起的资源。
-
通过类加载器,你可以通过位x而不是类路径来加载类。
-
反射类库可以让程序发现任何对象的成员、访问变量以及调用方法。
-
代理对象动态地实现任意接口,将所有的方法调用路由到-个处理器( handle)。
异常,断言和日志处理
-
当你抛出一个异常时,控制权转移到最近的异常处理器。
-
在Java中, 由编译器跟踪已检查异常( checked exception)。
-
使用try/catch结构处理异常 。
-
在正常执行完之后或者 当发生异常时,ty-wih-resources语句会 自动关闭资源。
-
使用try/finally结构处理那些 不论执行是否正常地进行都要发生的行为。
-
你可以捕获和重新抛出一 -个异常,或者将它与另-一个异常链起来。
-
堆栈踪迹 ( step trace )信息描述了程序执行中挂起时所有方法的调用情况。
-
一个断言检查-一个条件,如果启用了断言检查,当条件不满足时,会抛出一个错误。
-
日志记录器按照层次来分类,它们可以接收从SEVERE到E INEST綴别范围的日志信息。
-
日志处理器可以将8志信息发送给替代目的地,格式化器( formatter )控制信息格式。
-
你可以通过8志配置文件控制日志属性。
泛型编程
基本要点
-
泛型类是带有一个或多个类型参数的类。
-
泛型方法是带有类型参数的方法。
-
你可以要求类型参数必须是一个或者多个类型的子类型。
-
泛型类型是不变的: 当s是T的子类型时,G<S> 和G<T>没有关系。
-
通过使用通配符G<? extends T>或者G<? super T>.你可以指定一个方法接受一个带 子类或者父类参数的泛型类型的实例。
-
当泛型类这种法被编译时,类型参数会被擦除。
-
类型擦除对泛型有诸多限制。特别是,你不能实例化泛型类或数组,不能转换成泛型类型,或者抛出一个泛型类型对象。
-
Class<T>是一个泛型类,它非常有用,因为诸如newInstance这样的方法被声明为可以产生一个T类型的值。
-
即使泛型类和方法在虚拟机中被擦除。你也可以在运行时找出它们是如何声明的。
集合
基本要点
-
Collection接口 为所有集合类提供了共同方法(映射除外,映射是通过Map接口描述的)。
-
列表是一个有序的集合, 其中的每个元素都有一个整数索引。
-
set(集合 )针对高效包含测试进行过优化。Java提供 了Hashset和Treeset实现。
-
对映射来说, 你可以选择HashMap或TreeMap实现。LinkedHashMap会记住元索插人的顺序。
-
Collection接口 和collections类提供了很多有用的算法:如设置操作.查询、排序,打乱原先元素等。
-
视图通过使用标准集合接口提供了对存储在其他地方的数据的访问。
Strean
基本要点
-
迭代器使用了一种明确的遍历策略,同时也阻止了高效的并发执行。
-
你可以从集合、数组、生成器或迭代器创建流。
-
使用过滤器filter来选择元素,使用map进行元素转换。
-
对于转换流的其他操作还包括1imit. distinct. sorted。
-
要从Stream中 获得结果,请使用归约操作( reduction operation),如count、max、min. findFirst或 者findAny。这些方法中的一些会返回optiona1类型值。
-
optional类型是作 为处理nu11值而提供的一个安全替代者。 要想安全地使用它,需要借助于ifPresent和orElse方法。
-
你可以收集集合、 数组、字符串或者map中的Stream结果。
-
collectors类的groupingBy方法 和partitioningBy方法允许你将流的内容划分成组。然后获得每个组的结果。
-
针对基本数据类型如int. long、double, Java提供了专门的流。
-
并行流自动将流操作并行化。
输入与输出处理
基本要点
-
输入流是源字节,输出流是目标字节。
-
使用Reader 和Writer处理字符,确保指定了字符的编码集。
-
Files类 有读取文件中的所有字节或所有行的简便方法。
-
DataInput 和Dataoutput接口有以二进制格式写入数字的方法。
-
使用RandomAccessFile或内存 映射文件进行随机抽取。
-
Path是 文件系统中路径的绝对或相对序列。路径可以组合(或“解析”)。
-
使用Files类的方法进行 文件的复制.移动或删除,以及目录递归。
-
读取或更新ZIP文件,使用ZIP文件系统。
-
使用URI类读取网页内容, 使用URLConnect ion类读写元数据。
-
利用Pattern和Matcher类,你可以找出字符申中匹配正则表达式的所有结果,并对匹配的结果分组处理。
-
序列化机制可以保存和恢复所有实现了serializable接口的对象(只要它的实例变量也是可序列化的)。
并发编程
基本要点
-
Runnable表述- 一个可以异步执行的任务。
-
Executor将Runnable实 例列人执行计划。
-
Callable描述- 一个会产生结果的任务。
-
你可以向Executorservice提交一 个或多 个Callable实例,并且当这些Callable有执行结果后,合并这些结果。
-
当多个线程 在没有同步的情况下操作共享数据时,其结果是不可预知的。
-
与使用锁机制编程相比, 并行算法和线程安全的数据结构更好。
-
并行stream和数组操作可以 自动并且安全地将计算并行化运行。
-
ConcurrentHashMap是线 程安全的哈希表,它允许原子更新其中的元素。
-
你可以将AtomicLong用作 无锁的共享计数器:或如果线程竞争很激烈,可以使用LongAdder。
-
锁确保同- -时刻只有- -个线程执行临界区( critical sction)。
-
当设置了中断标志或者InterruptedExcept ion异常发生时,可中断任务应该终止。
-
长期运行的任务不应该阻塞程序的UI,但是进度和最终的更新需要在UI线程中出现。.
-
Process类让你可以在单独的进程中执行命令并且与输人流.输出流和错误流进行交互。
注解
基本要点
-
你可以注解声明,就像使用修饰符publ1ic或者static那样。
-
你也可以注解出现在声明。转换、instanceof检查或者方法引用中的类型。
-
注解从8符号开始,可能包含被称为元素的键/值对。
-
注解值必须是编译时常量一基本类型、 枚举( enum)常量、Class. 其他注解或者其中的数组。
-
一个被注解项可以有重复注解或者不同类型的注解。
-
要定义一个注解,你需要指定- -个注解接口, 其方法对应到注解元素。
-
Java库定义了超过- 打的注解,并且在Java企业版中大量使用。
-
为了在一个运行的Java程序中处理注解。 你可以使用反射机制,并且查询被反射的注解项。
-
注解处理器在编译期间处理源文件,使用Java语言模型API来定位被注解的项。
日期和时间API
基本要素
-
所有java . time对象都是不可变的。
-
一个Instant是时间线 上的一个点(类似于Date)。
-
在Java的时间里, 每天都是86 400秒 (也就是,没有闰秒)。
-
一个Durat ion就是两个时刻的间隔。
-
LocalDateT ime没有时区信息。
-
TemporalAdj uster方法能处理常用的8历计算,例如查找某月的第一个星期二。
-
ZonedDateTime 是指定时区的- 个时间点(类似于GregorianCalendar)。
-
当处理带时区时间时, 使用Period而不是Duration,以便更好地考虑到夏令时变化。
-
使用bateTimeFormatter来 格式化并解析日期和时间。
国际化
基本要素
-
软件的国际化支持除翻译消息外还要处理很多内容,尤其是随地域变化的日期和数字格式。
-
locale描述特定 区城用户的语言和格式等喜好。
-
NumberFormat和DateTimeFormat类处理本地化的数字、 货币、日期和时间。
-
MessageFormat类使用占位符 号格式化消息字符串,每个占位符可以有自己的格式。
-
使用collator类 可以根据localex对字符串进行排序。
-
ResourceBundle类 为多地域用户管理本地的字符申和对象。
-
可以使用Ereferences类以平 台无关的方式保存用户的首选项。
编译与脚本
基本要素
-
使用编译器API, 你可以动态生成代码并编译代码。
-
脚本API让Java程序能 与很多脚本语言交互操作。
-
JDK包含Nashom, - -个高性能井遵从JavaScript标准的JavaScript解释器。
-
Nashom提供操作Java列表 和映射以及JavaBean属性的便捷语法。
-
Nashom 支持lambda表达式以及继承Java类和实现Java接口的有限机制。
-
Nashom 支持在JavaScript中写shel脚本。
内容概述
文中资料已整理打包存放网盘,有需要的朋友可以点击下方的名片自取!