《Java核心技术》总结

一、初识Java

	主要带大家了解Java的发展历史,以及诞生原因,与其他程序语言的对比。
	JavaSun所创造,当初是为了可移植性的需求而开发出来的语言。
	Java是面对对象的语言,可能刚开始接触这门语言的时候并不理解这句话,
	在大学里我刚开始也是不理解的,直到入门以后才发现对象无处不在。
	Java虚拟机实现了与平台无关性,Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。
	JVM 有针对不同系统的特定实现(WindowsLinux,macOS),
	目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现
	是 Java 语言“一次编译,随处可以运行”的关键所在。想要使用Java开发必须安装Java开
	发工具包JDK并且配置环境变量,JDK包含JRE和编译器等,JRE是Java 运行时环境。
	它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,
	java 命令和其他的一些基础构件。刚入门建议使用记事本根据敲HelloWorld,使用命令窗口
	进行编译执行,后期入门后可使用IDEA进行开发程序。

二、Java基本语法

1、基本数据类型
	8大基本数据类型,4种整型(byte,short,int,long),2种浮点型(float,double),char类型,boolean类型。
	常用的String类型不属于基本数据类型,它是引用数据类型,后面还会学到这些基本数据类型的包装
	类Byte、Short、Integer、Long、Float、Double、Character、Boolean。Java语言是一个面向对象
	的语言,但是Java中的基本数据类型却是不面向对象的,如果仅仅有基本数据类型,那么在实际使用
	时将存在很多的不便,很多地方都需要使用对象而不是基本数据类型。比如,在集合类中,我们是无
	法将int 、double等类型放进去的,因为集合的容器要求元素是Object类型
2、变量
	有学过其他语言的应该对变量这个词并不陌生,每个变量都必须有类型去声明这个变量,变量名称是
	程序员自己定义的,但是也有一些规则限制,例如Java关键字不能使用,还有一些命名风格必须字母
	开头等等。提到变量不得不提一下常量,在Java中使用final修饰的代表是常量,习惯命名为全大写。
	变量分为成员变量和局部变量,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或
	是方法的参数;成员变量可以被	public,private,static 等修饰符所修饰,而局部变量不能被访问控制修
	饰符及 static 所修饰。
3、算术运算符
	算术运算符加减乘除(+、-、*、/),运算过程中涉及一些类型转换,大类型可以强转成小类型,但是有超
	出目标类型的表示范围。赋值运算符=,自增i++、自减i--,要区别前缀和后缀形式,前缀会先完成加1再
	运算。boolean运算符==。位运算符& | !
4、数组
	数组:是一种数据结构,用来存储相同类型的集合,声明是要指定类型和初始大小
5、String
	String是比较特殊的引用类型,使用 final 来定义 String 类,表示 String 类不能被继承,
	提高了系统的安全性。
	不变性:对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象,
					多线程下线程安全。
	常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的
						对象时,会直接返				 回缓存的引用。

三、对象与类

1、对象
	面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。对比面向过程,面向过程是把解
	决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。对象三个主要特性:行为、状态、标识;
	创建对象的几种方式:new创建新对象、通过反射机制、采用clone机制、通过序列化机制。前面2种需要
	用到构造方法,clone机制要了解深拷贝和浅拷贝。

反射:很重要,后面要学习的框架的灵魂

	反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,
	都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
	反射获取对象的三种方法:Class.forName(“类的路径”)、类名.class、对象名.getClass()
2、类
	传统的过程化程序设计, 必须从顶部的 main 函数开始编写程序,例如C语言,但在Java中不需要
	这样做。面向对象编程,首先要设计类,然后再往类中添加方法。类与类之间常见几种关系:依赖、聚合、继承
3、Java三大特性
  • 封装
封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观
事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
  • 继承
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这
些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
  • 多态
它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,
这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

四、接口

	接口不是类,而是对类的一组需求描述,编写接口的方式和类很相似,但是它们属于不同的概念。
	类描述对象的属性和方法。接口则包含类要实现的方法,这些类要遵从接口描述的统一格式进行定义
	。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,
	否则就必须声明为抽象类。JDK 1.8 以后,接口允许包含具体实现的方法,该方法称为"默认方法"
	,默认方法使用 default 关键字修饰。

lambda 表达式

	Lambda 表达式的加入,使得 Java 拥有了函数式编程的能力。在其它语言中,Lambda 表达式的
	类型是一个函数。

常用示例:

(int a, int b) -> {  return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }
() -> 42
() -> { return 3.1415 };
Comparator c = Comparator.comparing(Person::getAge);

五、异常与日志处理

1、异常
	Throwable是所有的异常的父类,包含2大类Error和Exception。Error级别异常表示重大错误,是内部系统
	错误和资源耗尽的错误,只能终止程序。Exception又细分为RuntimeException和IOException,第一种
	异常是我们开发中经常见到的,例如:空指针异常、数组越界异常、类型转换异常等等。
	在企业开发中,我们都会进行一个全局异常的处理,通过@ExceptionHandler(异常类型)可以捕获异常
	,然后进行进一步处理,也可以自定义业务异常,业务逻辑出现问题可以直接抛出一个异常告诉前端出现什么问题。
2、日志
	日志就是记录程序的运行轨迹,方便查找关键信息,也方便快速定位解决问题。常用的日志框架:Log4j 、Slf4j 、Logback。
	日志级别:
		OFF:关闭,最高级别,不输出日志。
		FATAL:致命,输出非常严重的可能会导致应用程序终止的错误。
		ERROR:错误,输出错误,但应用还能继续运行。
		WARN:警告,输出可能潜在的危险状况。
        INFO:信息,输出应用运行过程的详细信息。
        DEBUG:调试,输出更细致的对调试应用有用的信息。
        TRACE:跟踪,输出更细致的程序运行轨迹。
        ALL:所有,输出所有级别信息。
	日志优先级别标准顺序为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

六、集合

Java集合框架的顶层是Collection接口,包含List、Set、Queue。还有一个容器是Map。
  • List(对付顺序的好帮手): 存储的元素是有序的、可重复的。
1. `Arraylist`: `Object[]` 数组
2. `Vector`:`Object[]` 数组
3. `LinkedList`: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
  • Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。
1、HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素
2、LinkedHashSet: LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现
	    的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有
	    一点点区别
3、TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)
  • Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是

  • 有序的、可重复的。

  • Map(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),

  • “x” 代表 key,“y” 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,

  • 每个键最多映射到一个值

底层:数组+链表+红黑树,链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前
数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,
以减少搜索时间

七、并发

并发: 同一时间段,多个任务都在执行 (单位时间内不一定同时执行);
进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行
一个程序即是一个进		程从创建,运行到消亡的过程。当我们启动 main 函数时其实就是启动了
一个 JVM 的进程,而 main 函      数所在的线程就是这个进程中的一个线程,也称主线程。
线程:线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。
线程几个状态:New(新建)、Runnable(可运行)、Bloacked(阻塞)、Waiting(等待)、死亡
	线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。
	另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。另外现在
	互联网行业对于并发量要求升到百万级甚至千万级,单线程很难处理的这么高的并发量,多线程编
	程应运而生。多并发编程,可以通过创建多个线程,但是这种方式开发中不会用到。Java给我们提供
	了Excutors类创建线程池,可以方便管理这种方式,但是开发规范明确禁止使用这种方式,强调要通
	过ThreadPoolExcutor去创建线程池,这样开发者可以更明确线程池的运行规则,去规避资源耗尽的风险。
	线程的程序计数器、虚拟机栈、本地方法栈都是私有的,但是堆是所有线程共享的,这就引发了多线程编程
	下的数据安全问题。Java中解决共享资源竞争下的安全问题采取的是,使用关键字synchronized。当线程执
	行被synchronized保护的代码片段的时候,会对这段代码进行上锁,其他调用这段代码的线程会被阻塞,
	直到锁被释放。前面提到的常用集合ArraryList它是线程不安全的,Java提供了高效的线程安全集合ConcurrentHashMap等等
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值