Java基础重点概要(部分)

本文介绍了Java的基础知识,包括JDK的发展历程,从1.0到1.8的关键特性变化,以及Java程序设计中的变量概念、作用域、数据类型定义和转换。还详细讨论了String类,包括其不可变性、构造器和常用方法。
摘要由CSDN通过智能技术生成

为工信部第六届全国计算机信息大赛准备 ,主要复习以下内容。

Java基础及环境:JDK发展历史,不同版本的进阶内容。Java程序的编写、编译、调试。
Java程序设计基础:常量和变量的概念,声明方式和作用域。基本数据类型的定义和概念。Java基本数据类型的转换。
Java字符串处理:String、StringBuffer和StringBuilder的基本概念和使用。正则表达式的讲解和使用。
Java数字和日期处理:数学相关类、随机数生成相关类、数字格式化以及各种类型数字的运算和转换。Java日期和时间的处理。
Java数组和基本排序算法:一维数组、二维数组和多维数组的基本概念及应用。
Java类和对象。Java类的封装、继承和多态。Java异常处理。Java集合、泛型和枚举。Java反射机制。Java输入输出流和文件操作。Java多线程编程。Java网络编程。Java图形用户界面。
Java数据库编程:JDBC的基本API。


1. JDK发展历史

1995年5月23 java(原名Oak)诞生,并且在SunWorld大会上正式发表了java1.0版本。

1996年1月23 JDK1.0发布Java语言有了第一个正式版本的运行环境。JDK1.0提供了一个纯解释执行的Java虚拟机的实现(Sun class VM)。JDK1.0的代表技术:JVM,Applet,AWT.

1997年2月19日,JDK1.1,新特性:JAR文件格式、JDBC、JavaBean、RMI、内部类(Inner class)、反射(Reflection)

1998年12月4日,JDK1.2,新特性:基础体系拆分:J2SE(面向桌面应用程序开发)、J2EE(面向企业级应用开发程序开发)、J2ME(面向手机等移动终端开发),技术:EJB、Java Plug-in、JavaIDL 、Swing、JIT(Just In Time)编译器.

2000年5月8日JDK1.3:使用CORBA IIOP实现RMI的通信协议,改进Java2D,添加JavaSound类库。

2002年2月13日JDK1.4 ,新特性:正则表达式,异常链,NIO,日志类,XML解析器,XLST转换器。

2004年9月30日,JDK1.5,新特性:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环。

2006年12月11日,JDK1.6,新特性:提供动态语言支持、提供编译API和卫星HTTP服务器API,改进JVM的锁,同步垃圾回收,类加载。

2009年2月19日JDK1.7,新特性:提供GI收集器、加强对非Java语言的调用支持(JSR-292,升级类加载架构。

2014 年 3 月 18 日 JDK1.8新特性:Lambda 表达式、方法引用、默认方法、新工具、Stream API、Date Time API 、Optional 类、Nashorn, JavaScript 引擎。

2017年9月21日jdk9.0,新特性:模块系统、HTTP 2 客户端、多版本兼容 JAR 包、私有接口方法、改进的 Stream API、响应式流(Reactive Streams) API:

2018年3月21日jdk10,新特性:var 局部变量类型推断、统一的垃圾回收接口

2018年9月25日jdk11,新特性:HTTP客户端(标准)、无操作垃圾收集器。首个LTS版本

2019年3月19日jdk12:新增一个名为 Shenandoah 的垃圾回收器、扩展switch语句的功能、改进 G1 垃圾回收器


2. Java程序设计基础

2.1 变量和常量的概念

通常来说,在程序运行中,可以被赋值改变的一般被称为变量,在被final修饰后,会变成一个常量,在运行过程中不能发生任何的值改变。

2.2 Java变量的声明

在 Java 程序设计中,每个声明的变量都必须分配一个类型。声明一个变量时,应该先声明变量的类型,随后再声明变量的名字。声明变量的同时可以为变量赋值,也可以声明以后再赋值。在程序运行过程中,空间内的值是变化的,这个内存空间就称为变量。为了操作方便,给这个空间取了个名字,称为变量名,内存空间内的值就是变量值。所以,申请了内存空间,变量不一定有值,要想变量有值,就必须要放入值。也就是一个初始化行为。包装对象都有默认的初始化值。

2.3 Java变量的作用域

一般的来说 ,就我自身理解分为两大块,一块是成员变量,一块是局部变量。成员变量比较好理解,是类的一部分,也就是定义在类中,方法外。可供全类使用。局部变量一般定义在方法体内,举例说明。

public class Illustrate {
	// 成员变量,整个类中都可以使用
	private String username;
	// 成员变量,整个类中都可以使用
	private Integer age;
	// 成员变量,整个类中都可以使用
	private Date birthday;
	

	public void add() {
		// 定义一个局部变量,在方法体内
		int num = 10;
		num += 1;
		if (true) {
			// 定义局部变量
			int a = 5;
		}
		// 变量a是无法在if方法体外访问到的,超出了他的作用于范围。只作用于当前方法体内
		// 但是可以访问到num和成员变量
		username = "张三";
		age = 20;
	}
}

2.4 数据类型的定义和概念

在Java中,分为两大类,一种为引用数据类型,一种为基础数据类型。
在这里插入图片描述

  1. byte

byte 数据类型是8位、有符号的,以二进制补码表示的整数,最小值是 -128(-2^7)、最大值是 127(2^7-1),默认值是 0;byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;

例子:byte a = 100,byte b = -50;

 2. short

short 数据类型是 16 位、有符号的以二进制补码表示的整数最小值是 -32768(-2^15)、最大值是 32767(2^15 - 1);Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;默认值是 0;

例子:short s = 1000,short r = -20000;

 3. int
  
int 数据类型是32位、有符号的以二进制补码表示的整数,最小值是 -2,147,483,648(-2^31)、最大值是 2,147,483,647(2^31 - 1),一般地整型变量默认为 int 类型;默认值是 0 ;

例子:int a = 100000, int b = -200000;

 4. long

long 数据类型是 64 位、有符号的以二进制补码表示的整数,最小值是 -9,223,372,036,854,775,808(-2^63)、最大值是 9,223,372,036,854,775,807(2^63 -1);这种类型主要使用在需要比较大整数的系统上;默认值是 0L;

例子: long a = 100000L,Long b = -200000L;

【L】理论上不分大小写,但是若写成【l】容易与数字【1】混淆,不容易分辩。所以最好大写;

 5. float

float 数据类型是单精度、32位、符合IEEE 754标准的浮点数,float 在储存大型浮点数组的时候可节省内存空间,默认值是 0.0f;浮点数不能用来表示精确的值,如货币;

例子:float f1 = 234.5f;

 6. double

double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数,浮点数的默认类型为double类型;double类型同样不能表示精确的值,如货币,默认值是 0.0d;

例子:double d1 = 123.4;

 7. boolean

boolean数据类型表示一位的信息,只有两个取值:true 和 false,这种类型只作为一种标志来记录 true/false 情况;默认值是 false;

例子:boolean one = true;

 8. char

char类型是一个单一的 16 位 Unicode 字符,最小值是 \u0000(即为0)、最大值是 \uffff(即为65,535),char 数据类型可以储存任何字符;

例子:char letter = ‘A’;

2.5 Java基本数据类型的转换

Java要求=等号左边和=等号右边的类型要一致,如果不一致,就需要进行数据类型转换。Java中不同的类型之间,在满足数据兼容的条件下可以实现转换。Java的数据类型转换,大致有如下几种转换方案:

  1. 自动类型转换:容量小的类型自动转换为容量大的数据类型;

  2. 强制类型转换:容量大的数据类型转换为容量小的数据类型;

  3. 隐含强制类型转换(初始化):在变量初始化时,int类型会隐含强制转换成低级别的byte和short类型;

  4. 其他类型转换:包装类、字符串、基本类型直接的转换。

对基本类型来说,常见的数据转换方式包括自动类型和强制类型转换;对引用类型而言,只存在强制类型转换一种形式。

我们在进行类型转换时,无论自动和强制类型转换,都要遵循如下基本原则:

  1. 不能对boolean类型进行类型转换;

  2. 不能把对象类型转换成不相关的类对象;

  3. 把容量大的类型转换为容量小的类型时,必须使用强制类型转换;

  4. 类型转换过程中,可能会导致溢出或损失精度;

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


3. Java字符串

附上ASCII码表图片
在这里插入图片描述

3.1 String类

String是一种引用数据类型,我们会用它来存储字符串,什么是字符串呢,和他的名字一样,就是一个个字符拼在一起,串成一串。如下代码

String str = "Hello World";

String的底层,其实就是一个个字符拼在一起,那么也就是说,底层是一个char数组。我们上面看到的Hello World实际上存储的时候是以这样的方式存储的。那一个个的char是怎么存储的,也就是通过字符集,ASCII码表,来进行存储的。

char[] str = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};

如何验证他是正确的结论,在String类中,看源码。我们会看到这样的一行代码,说明了确实是由一个char数组来进行存储数据的。且说明不可变。(final)

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
		 private final char value[];
}

且类上被final修饰过,说明类是没有办法被继承的。

3.1.1 String构造器

在String中,存在了不少的构造器,分别列出以下构造器,且做说明描述。

  1. public String(): 空构造器。
  2. public String(String original):把字符串常量值转换为字符串对象。
  3. public String(char value[]):把字符数组转为字符串对象。
  4. public String(char value[], int offset, int count): 把字符数组的一部分转为字符串对象。
  5. public String(byte ascii[], int hibyte, int offset, int count):把字节数组的一部分转换为字符串对象。
  6. public String(byte ascii[]): 把字节数组转换为字符串对象。

以代码的形式实现分别如下:

package oop;
public class ObjectContext {

    public static void main(String[] args) {

        // public String(String original):把字符串常量值转换为字符串对象。
        String str1 = new String("Hello World");

        // public String(char value[]):把字符数组转为字符串对象。
        String str2 = new String(new char[] {'A', 'B', 'C'});

        // public String(char value[], int offset, int count): 把字符数组的一部分转为字符串对象。
        String str3 = new String(new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G'}, 0, 3);

        // public String(byte ascii[], int hibyte, int offset, int count):把字节数组的一部分转换为字符串对象。
        String str4 = new String(new byte[] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 3);

        // public String(byte ascii[]): 把字节数组转换为字符串对象。
        String str5 = new String(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10});

        System.out.println("把字符串常量值转换为字符串对象: " + str1);
        System.out.println("把字符数组转为字符串对象: " + str2);
        System.out.println("把字符数组的一部分转为字符串对象: " + str3);
        System.out.println("把字节数组的一部分转换为字符串对象:" + str4);
        System.out.println("把字节数组转换为字符串对象: " + str5);

    /*
    把字符串常量值转换为字符串对象: Hello World
    把字符数组转为字符串对象: ABC
    把字符数组的一部分转为字符串对象: ABC
    把字节数组的一部分转换为字符串对象: 
    把字节数组转换为字符串对象:  	
     */
    
    }

}
3.1.2 String常用的判断方法
  1. boolean equals(Object obj):比较字符串的内容是否相同,区分大小写。
  2. boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写。
  3. boolean contains(String str):在一个字符串中是否包含另外一个字符串。
  4. boolean startsWith(String str):判断字符串是否以某个指定的字符串开头。
  5. boolean endsWith(String str):判断字符串是否以某个指定的字符结尾。
  6. boolean isEmpty():判断字符串是否为空。

以下是这些API代码实现的实际使用方式:

package oop;
public class ObjectContext {

    public static void main(String[] args) {

        ObjectContext objectContext = new ObjectContext();

        // boolean equals(Object obj):比较字符串的内容是否相同,区分大小写。
        objectContext.isEquals("abc", "abc");   // true

        // boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写。
        objectContext.isEqualsIgnoreCase("aBc", "abc"); // true

        // boolean contains(String str):在一个字符串中是否包含另外一个字符串。
        objectContext.isEqualsIgnoreCase("Hello World", "World");   // false

        // boolean startsWith(String str):判断字符串是否以某个指定的字符串开头。
        objectContext.isStartsWith("Hello", "Hel");     // true

        // boolean endsWith(String str):判断字符串是否以某个指定的字符结尾。
        objectContext.isEndsWith("Hello", "llo");   // true

        // boolean isEmpty():判断字符串是否为空。
        objectContext.empty("ABC");    // false
    }

    /**
     * boolean equals(Object obj):比较字符串的内容是否相同,区分大小写。
     */
    public void isEquals(String str1, String str2) {
        System.out.println(str1.equals(str2));
    }

    /**
     * boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写。
     */
    public void isEqualsIgnoreCase(String str1, String str2) {
        System.out.println(str1.equalsIgnoreCase(str2));
    }

    /**
     * boolean contains(String str):在一个字符串中是否包含另外一个字符串。
     */
    public void isContains(String str1, String str2) {
        System.out.println(str1.contains(str2));
    }

    /**
     * boolean startsWith(String str):判断字符串是否以某个指定的字符串开头。
     */
    public void isStartsWith(String str1, String str2) {
        System.out.println(str1.startsWith(str2));
    }

    /**
     * boolean endsWith(String str):判断字符串是否以某个指定的字符结尾。
     */
    public void isEndsWith(String str1, String str2) {
        System.out.println(str1.endsWith(str2));
    }

    /**
     *  boolean isEmpty():判断字符串是否为空。
     */
    public void empty(String str) {
        System.out.println(str.isEmpty());
    }

}
3.1.3 String常用的其他API
  1. int length():获取字符串的长度。
  2. char charAt(int index):获取指定索引位置的字符。
  3. int indexOf(int ch):返回指定字符在此字符串中第一次出现的索引,ch是字符的码表值。
  4. int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
  5. int indexOf(int ch, int fromIndex):返回指定字符在字符串指定下标位置后第一次出现的位置。
  6. int indexOf(String str, int fromIndex):同上,码表字符变为字符串。
  7. int lastIndexOf():同上。
  8. String substring(int start):从指定位置开始截取字符串,默认到末尾。
  9. String substring(int start, int end):从指定位置开始到指定结束位置截取字符串。

以下是这些API代码实现的实际使用方式:

package oop;
public class ObjectContext {

    public static void main(String[] args) {

        ObjectContext objectContext = new ObjectContext();

        // int length():获取字符串的长度。
        objectContext.ObjLength("HelloWorld");  // HelloWorld 的字符长度为: 10

        // char charAt(int index):获取指定索引位置的字符。
        objectContext.ObjCharAt("HelloWorld", 2);   // l

        // int indexOf(int ch):返回指定字符在此字符串中第一次出现的索引,ch是字符的码表值。
        objectContext.ObjIndexOfCh("HelloWorld", 72);   // 0

        // int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
        objectContext.ObjIndexOfStr("HelloWorld", "oWo");   // 4

        // int indexOf(int ch, int fromIndex):返回指定字符在字符串指定下标位置后第一次出现的位置。
        objectContext.ObjIndexOfFromIndex("HelloWorld", 114, 2);    // 7

        // int indexOf(String str, int fromIndex):同上,码表字符变为字符串。
        objectContext.ObjIndexOfFromIndexStr("HelloWorld", "orl", 2);   // 6

        // String substring(int start):从指定位置开始截取字符串,默认到末尾。
        objectContext.ObjSubString("HelloWorld", 5);    // World

        // String substring(int start, int end):从指定位置开始到指定结束位置截取字符串。
        objectContext.ObjSubStringAanEnd("HelloWorld", 0, 5);   // Hello

    }

    /**
     * int length():获取字符串的长度。
     */
    public void ObjLength(String str) {
        System.out.println(str + " 的字符长度为: " + str.length());
    }

    /**
     *  char charAt(int index):获取指定索引位置的字符。
     */
    public void ObjCharAt(String str, int index) {
        System.out.println(str.charAt(index));
    }

    /**
     * int indexOf(int ch):返回指定字符在此字符串中第一次出现的索引,ch是字符的码表值。
     */
    public void ObjIndexOfCh(String str, int ch) {
        System.out.println(str.indexOf(ch));
    }

    /**
     * int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
     */
    public void ObjIndexOfStr(String str1, String str2) {
        System.out.println(str1.indexOf(str2));
    }

    /**
     * int indexOf(int ch, int fromIndex):返回指定字符在字符串指定下标位置后第一次出现的位置。
     */
    public void ObjIndexOfFromIndex(String str, int ch, int fromIndex) {
        System.out.println(str.indexOf(ch, fromIndex));
    }

    /**
     * int indexOf(String str, int fromIndex):同上,码表字符变为字符串。
     */
    public void ObjIndexOfFromIndexStr(String str1, String str2, int fromIndex) {
        System.out.println(str1.indexOf(str2, fromIndex));
    }

    /**
     * String substring(int start):从指定位置开始截取字符串,默认到末尾。
     */
    public void ObjSubString(String str, int start) {
        System.out.println(str.substring(start));
    }

    /**
     * String substring(int start, int end):从指定位置开始到指定结束位置截取字符串。
     */
    public void ObjSubStringAanEnd(String str, int start, int end) {
        System.out.println(str.substring(start, end));
    }

}

依然存在其他的重要的API,如下

  1. byte[] getBytes():把字符串转换为字节数组。
  2. char[] toCharArray():把字符串转换为字符数组。
  3. static String valueOf(char[] chs):把字符数组转为字符串。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王子良.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值