当前位置:   article > 正文

Java进阶学习之路_java进阶之路

java进阶之路

Java进阶之路

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Java入门

Java基础

1、Java概述

1.1 什么是Java

   java语言是SUN(Stanford University Network,斯坦福大学网络公司 ) 1995年推出的一门高级编程语言,是一种面向Internet的编程语言。
  Java一开始富有吸引力是因为Java程序可以在Web浏览器中运行。这些Java程序被称为Java小程序(applet)。applet使用现代的图形用户界面与Web用户进行交互。 applet内嵌在HTML代码中。
  随着Java技术在Web层面的不断成熟,已经称为Web应用程序的首选开发语言。
  java语言的三个平台版本:
    JavaSE: Java 语言的(标准版),用于桌面应用的开发,是其他两个版本的基础
    JavaME: Java 语言的(小型版),用于嵌入式消费类电子设备
    JavaEE: Java 语言的(企业版),用于 Web 方向的网站开发

1.2 java的发展史
  • 1995年5月23日,Oak语言改名为Java,并且在SunWorld大会上正式发布Java 1.0版本。Java语言第一次提出了“Write Once,Run Anywhere”的口号。
  • 1999年4月27日,HotSpot虚拟机诞生。HotSpot虚拟机刚发布时是作为JDK 1.2的附加程序提供的,后来它成为JDK 1.3及之后所有JDK版本的默认Java虚拟机。
  • 2004年9月30日,JDK 5发布,工程代号为Tiger(老虎),是Java语言的发展史上的又一里程碑事件。JDK的版本不再是“1.x”的命名方式,而采用“JDK x”方式进行命名。
  • JDK 8的第一个正式版本于2014年3月18日发布,从JDK 8开始,Oracle启用JEP(JDK Enhancement Proposals)来定义和管理纳入新版JDK发布范围的功能特性。
  •   JEP 126:对Lambda表达式的支持,这让Java语言拥有了流畅的函数式表达能力。
  •   JEP 104:内置Nashorn JavaScript引擎的支持,成为Java的嵌入式JavaScript引擎。
  •   JEP 150:新的时间、日期API。
  •   JEP 122:彻底移除HotSpot的永久代。
  •   ……
  • JDK9于2017年9月21日发布。JDK 9发布后,Oracle随即宣布Java将会以持续交付的形式和更加敏捷的研发节奏向前推进,以后JDK将会在每年的3月和9月各发布一个大版本。每六个JDK大版本中才会被划出一个长期支持(Long Term Support,LTS)版,只有LTS版的JDK能够获得为期三年的支持和更新,普通版的JDK就只有短短六个月的生命周期。JDK 8和JDK 11是LTS版,再下一个就到2021年发布的JDK 17了。
  • 2018年3月20日,JDK 10如期发布,这版本的主要研发目标是内部重构,诸如统一源仓库、统一垃圾收集器接口、统一即时编译器接口等,这些都将会是对未来Java发展大有裨益的改进。
  • 2018年9月25日,JDK 11发布,这是一个LTS版本的JDK,包含17个JEP,其中有ZGC这样的革命性的垃圾收集器出现,也有把JDK 10中的类型推断加入Lambda语法这种可见的改进。
  • 2019年2月,在JDK 12发布前夕,Oracle果然如之前宣布那样在六个月之后就放弃了对上一个版本OpenJDK的维护,RedHat同时从Oracle手上接过OpenJDK 8和OpenJDK 11的管理权利和维护职责。
  • 2019年3月20日,JDK 12发布,只包含8个JEP,其中主要有Switch表达式、Java微测试套件(JMH)等新功能,最引人注目的特性无疑是加入了由RedHat领导开发的Shenandoah垃圾收集器。Shenandoah作为首个由非Oracle开发的垃圾收集器,其目标又与Oracle在JDK 11中发布的ZGC几乎完全一致,两者天生就存在竞争。Oracle马上用实际行动抵制了这个新收集器,在JDK 11发布时才说应尽可能保证OracleJDK和OpenJDK的兼容一致,转眼就在OracleJDK 12里把Shenandoah的代码通过条件编译强行剔除掉,使其成为历史上唯一进入了OpenJDK发布清单,但在OracleJDK中无法使用的功能。
  • 2020年 3 月 17 日,JDK14 正式 GA(General Available),新增了Records、switch表达式(JDK 12和JDK 13中的预览特性,现在正式使用)、文本块等新特性。在JVM方面,弃用Parallel Scavenge和SerialOld GC组合、删除CMS垃圾回收器。
1.3 java的特性和优势
  • 简单性

与C语言不同,Java是一种面向对象编程的语言,他的底层借鉴了C++语言但又不是完全相同,Java语言并不支持多继承、指针、go to 语句、操作符重载、头文件等,但其语法基于C语言,免去了预处理操作。

  • 面向对象

Java语言是一个面向对象的语言,基本思想是使用对象、类、封装、继承、多态等概念进行程序设计。每一个物体都可以成为一个对象,其本身具有唯一性,有各自不同的变化状态,对Java来说,现有类,才有对象,对象是类实例化后的产物。

  • 可移植性

不同于其他语言,Java优点在于自身的跨平台和可移植性,在Java环境安装好后,会自带一个Java的虚拟机,它可以屏蔽掉不同操作系统之间的差异,实现了跨平台运行Java程序。

  • 高性能

在我们实际编写项目中通常会用到一些Java中间件,像网关、缓存、负载均衡、数据库、分布式架构等方面都有涉及,这都可以较快提高我们项目的性能,同时Java可以通过虚拟机来优化提升运行效率。

  • 分布式

分布式系统是由多个互通节点组成在一起的系统,主要有增加系统容量、加强系统可用、扩展性高、通过服务模块的拆分提升相应效率、团队协作流程得到改善等优点。基于Java自身可以实现信息之间的通信,通常使用TCP/IP异步通信可以达到分布式的效果。

  • 动态性

Java中的动态性主要体现在反射机制、动态字节码操作、动态编译、执行其他脚本编码等方面,在后期建立各模块之间的互通,这就意味着在现有的应用程序下可以实现各模块之间的互连。

  • 多线程

一个进程可以启动多个线程,例如:我们可以将火车站看作一个进程而其中的每一个售票窗口可以看作一个线程,每一个线程都有一个单独的栈空间,栈与栈之间互不干扰,各自执行各自的线程并发。

  • 安全性

Java安全措施主要体现在面向对象的规范上,主要包括:封装数据细节,只提供接口给用户、在Java除了基本类型的操作外都是引用的操作、数组边界检查、强制类型转换和语言对线程的支持。

  • 健壮性

在Java中有一种机制:自动垃圾回收机制(GC机制),Java虚拟机负责调动该机制,不需要编码者过多的干涉。

1.4 Java的跨平台性

  我们知道java有跨平台的特性,即一次编译处处运行,其实质是jvm在编译java代码时,会将代码编译成.class的字节码文件,只要在不同的环境中安装对应的JDK(其中包含jvm),我们就可以运行程序了。

  其实java虚拟机不仅可以支持java语言,对于其他语言,我们都可以通过把它转换成字节码文件,最后转换的字节码文件都能通过Java虚拟机进行运行和处理。随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。

  Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。
Java跨平台原理

1.5 字节码

  我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。
  不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式——Class文件格式所关联,Class文件中包含了Java虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息。

1.6 JDK和JRE
1.6.1 JDK和JRE的区别
  • JVM(Java Virtual Machine),Java虚拟机,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。包括了Java运行环境JRE、Java工具和Java基础类库。
  • JRE(Java Runtime Environment),Java运行环境,包含了JVM和Java的核心类库(Java API)
  • JDK(Java Development Kit)称为Java开发工具,包含了JRE和开发工具
    在这里插入图片描述
1.6.2 JDK安装

2、Java基础语法

2.1 基础数据类型
2.1.1 计算机存储单元

我们知道计算机是可以用来存储数据的,但是无论是内存还是硬盘,计算机存储设备的最小信息单元叫“位 (bit)”,我们又称之为“比特位”,通常用小写的字母”b”表示。而计算机中最基本的存储单元叫“字节(byte)”,
通常用大写字母”B”表示,字节是由连续的8个位组成。
除了字节外还有一些常用的存储单位,其换算单位如下:
1B(字节) = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB

2.1.2 Java基本数据类型
数据类型关键字内存占用取值范围
整数类型byte1-128~127
short2-32768-32767
int(默认)4-2的31次方到2的31次方减1
long8-2的63次方到2的63次方减1
字符型float4
double(默认)8
字符类型char20-65535
布尔类型boolean1
e35表示的是乘以10的38次方,同样e-45表示乘以10的45次方,在java中整数默认是int类型

3、面向对象

3.1 面向对象和面向过程
  • 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。
  • 面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
  • 面向对象设计程序(简称OOP):
3.2 对象和类
  • 类:类是构造对象的模板或蓝图;就是将具有相似的行为或者属性的事物抽象或者集合形成一个类;是抽象的、概念上的定义
  • 对象:是实际存在的该类事物的每个个体,是类的实例
  • 由类创建对象的过程称为创建类的实例
3.2.1 对象内存图
  • 单个对象内存图
    在这里插入图片描述
  • 多个对象内存图
    在这里插入图片描述
    总结:多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份
  • 多个对象指向相同内存图
    在这里插入图片描述
    总结:
      当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
      只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。
3.3 变量

在这里插入图片描述

3.3.1 成员变量

成员变量(方法外、类内)的声明格式:
【访问修饰符】【类型修饰符】<数据类型>变量名

  • 访问修饰符:设置变量的访问权限
访问级别访问控制修饰符同类同包不同类(不含子类)同包子类不同包不同类不同包子类
公开public
受保护protected×✓(注意)
默认没有访问修饰符××
私有private××××

注:成员变量通常设置为private,然后在设置一些public权限的方法来设置、获取成员变量的值,防止由对象直接访问变量导致数据的错误、混乱或安全性问题。

3.4 构造方法
3.4.1 构造方法概述

在Java中,构造方法(Constructor)是一种特殊类型的方法,用于初始化对象

3.4.2 构造方法特点
  • 方法名称与类名相同:构造方法的名称必须与类名完全相同。
  • 没有返回类型:构造方法没有返回类型,甚至不写 void。
  • 在创建对象时自动调用:当使用 new 关键字实例化一个对象时,会自动调用该对象的构造方法。
  • 可以有多个构造方法:一个类可以有多个构造方法,根据参数列表的不同来区分构造方法的重载。

4、字符串

4.1 String为什么是不可变的

String内部是一个使用final修饰修饰的字符数组,所以不可变
在这里插入图片描述
为何这样设计

  • 安全性:字符串经常用于存储敏感信息,如网络连接的用户名、密码、URL等。如果字符串是可变的,那么这些信息可能会被恶意修改,从而导致安全问题。

  • 线程安全:由于字符串是不可变的,所以它们在多线程环境中是安全的,不需要额外的同步。

  • 哈希码缓存:字符串是哈希映射(如HashMap和HashSet)中常用的键类型。由于字符串的内容不会改变,所以它们的哈希码可以被缓存,而不需要每次使用时都重新计算。这可以提高哈希映射的性能。

  • 字符串池:Java虚拟机(JVM)维护了一个特殊的内存区域,称为字符串池(String Pool)。当你创建一个字符串字面量(如"Hello")时,JVM首先会检查字符串池中是否已经存在该值。如果存在,JVM将返回对现有字符串的引用;否则,JVM将在字符串池中创建一个新的字符串。这种技术可以节省内存,因为相同的字符串字面量只需要存储一次。

  • 从源码角度来看:String类的不可变性主要体现在其内部使用了一个私有的、最终的字符数组来存储其值,并且没有提供修改这个数组的方法。这意味着一旦一个String对象被创建,其内部的字符数组就不能被改变了。

4.2 字符串常量池

字符串常量池又称为字符串池,全局字符串池(Spring Pool)。在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,就是字符串常量池。字符串常量池由String类私有保护。

4.2 String.intern()
/**
     * Returns a canonical representation for the string object.
     * <p>
     * A pool of strings, initially empty, is maintained privately by the
     * class {@code String}.
     * <p>
     * When the intern method is invoked, if the pool already contains a
     * string equal to this {@code String} object as determined by
     * the {@link #equals(Object)} method, then the string from the pool is
     * returned. Otherwise, this {@code String} object is added to the
     * pool and a reference to this {@code String} object is returned.
     * <p>
     * It follows that for any two strings {@code s} and {@code t},
     * {@code s.intern() == t.intern()} is {@code true}
     * if and only if {@code s.equals(t)} is {@code true}.
     * <p>
     * All literal strings and string-valued constant expressions are
     * interned. String literals are defined in section 3.10.5 of the
     * <cite>The Java&trade; Language Specification</cite>.
     *
     * @return  a string that has the same contents as this string, but is
     *          guaranteed to be from a pool of unique strings.
     */
    public native String intern();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

由源码可知,String.intern()是一个native方法,注释大致意思是:如果常量池中存在当前字符串,就会直接返回当前字符串,如果常量池中没有此字符串,会将此字符串放入常量池中,然后返回。

5、数组

Java集合框架

二、Java进阶

java高级特性

多线程

1、初识多线程

多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持能够在同一时间执行多个线程,提升性能。

2、进程和线程

  • 进程:

二、使用步骤

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
  • 1
  • 2
  • 3

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号