Java基础语法

Java基础总结


参考:https://blog.csdn.net/Song_JiangTao/article/details/80642188?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8

Java基础概览:

img

一. Java起源:

Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。
Java分为三个体系:

  • JavaSE(标准版,用于桌面应用开发)
  • JavaEE(企业版,用于企业级应用开发)
  • JavaME(微缩版,用于早期嵌入式开发)

二. Java API

​ 即Java应用程序接口
​ Java API中文手册
 常用的API

  • StringBuffer 和 StringBuilder 用法:

    ·StringBuffer(线程安全)是可变长度字符串/StringBuilder(线程不安全)
    **·**使用append方法拼接字符串,效率高
    **·**默认有16位缓冲区
    **·**使用capacity方法获取真实长度,length方法获取字符个数,append方法拼接字符串

    • 线程安全;capacity,length,append;

    String类型和StringBuffer的主要性能区别:

    ·String是不可变的对象, 因此在每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
    ·使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下
    **·**在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer。
    ·性能效率:StringBuilder>StringBuffer>String。

    • 区别比较:1.String & StringBuffer是否生成新的对象2.StringBuffer & StringBuild 通常使用前者
  • Math相关
    round(double d) 四舍五入取整返回long/int
    floor(double d) 向下取整返回double
    ceil(double d) 向上取整返回double
    abs(double/int ) 获取绝对值
    random() 获取0-1之间随机数,[0.0,1.0)前闭后开

  • Random随机数
    nextInt(int i) 获取0-i之间的随机整数,前闭后开
    nextDouble() 获取0-1之间的随机小数,前闭后开

  • java.math.BigDecimal

  • SimpleDateFormat用法

    总之,多查API

三. Java语言特性

面向对象
可移植性
跨平台
安全性(1.摒弃指针 2.GC垃圾回收机制:自动释放回收长时间不使用对象内存)
并发性(支持多线程)

四. JDK & JRE

JDK(Java Development Kit Java开发工具包),JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也**包括了JRE**。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)、执行工具(java.exe)等
JRE(Java Runtime Environment Java运行环境) ,**包括Java虚拟机(JVM Java Virtual Machine)**和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
JDK》JRE》JVM

五. Java程序的执行过程

java源文件,编译器(javac命令)进行编译
生成class文件(存放的字节码)
然后解析器(执行java命令)解析class文件
最后生成计算机识别的二进制编码

六.标识符命名规则(全局变量和局部变量):

可以由数字、字母、下划线、$符号组成,不能以数字开头
全局变量(成员变量、类变量)
· 可以供当前类的多个方法使用;
· 定义在类中;
· 成员变量存在于堆内存中,随对象的产生而产生,消失而消失。
局部变量
· 定义在方法中或者方法参数
· 只能作用于当前方法
· 没有初始值
· 局部变量存在于栈内存中,随所属区域的运行而存在,结束而释放
常量
· 只能在声明在类中,使用final关键词声明,必须赋初始值,不能再次赋值

七. Java的核心包:即java.lang包

lang包下的String类,是不可以被继承的
查API可以发现,String类是final类

八.包装类:即基本数据类型所对应的类

int/double/float/byte/long/char/boolean 是一种值表示;
Integer/Double/Float/Byte/Long/Character/Boolean 包装类
常用的方法:
· valueOf(" “)
· valueOf(int i)
· toString()
· parselnt(” ")
· 注意异常! NumberFormatException

九. ==和equals

比较即比较内容也比较地址是否相同;
equals方法,比较两个对象内容是否相同
注意:
(1)字符串比较,不允许用
,只能通过equals方法
(2)如果Integer和Integer/int比较具体是否相等,此时绝对不允许使用==
补充:127 128 问题

Integer a = 127;
Integer b = 127;
System.out.println(a==b);true
//超一个字节会重新分配空间
Integer c = 128;
Integer d = 128;
System.out.println(c==d);false

(3)注意:数字,和字符串比较是否相等;

String str="10";
Integer m=10;
System.out.println(m.equals(str));//false
System.out.println(m.toString().equals(str));//true

equals()是方法,而==是关系操作符;

总结:(其中第五点)
比较基本数据类型的时候,就是比较他们本身的值。
比较引用数据类型的时候, 就是比较他们在内存的地址
equals用来比较引用数据类型一般都要重写该方法。例如String类就重写了这个方法
如果没有重写equals就直接比较,就是比较他们的内存地址
equals不能用于基本数据类型

== 和 equals区别

比较地址,作为常量在方法区中的常量池里面以HashSet策略存储起来;
equals默认比较引用,在object类中与“
”没有区别,但是可以通过重写equals方法在新类中覆盖来实现对内容的比较

        int a = 123;
        int b = 123;
        System.out.println(a==b);

        String s1 = "123";
        String s2 = "123";
        System.out.println(s1==s2);

        String s3 = new String("123");
        System.out.println(s1==s3);
结果:   true    //比较的是常量,在常量池中存储,指向同一内容
        true
        false   //new 新建一个管理者,比较的是地址,不同(对象的引用)
        Integer i1 = 127;
        Integer i2 = 127;
        System.out.println(i1==i2);

        Integer m = 128;
        Integer n = 128;
        System.out.println(m==n);
结果:   true     //Integer范围[-128,127]
        false    //超出后需保存在堆内存中,不同

对于基本数据类型,==比较;
对于对象的引用,要实际确定;

十. 数组

一维数组,二维数组
数组复制:

System.arraycopy(strArr,0, strArr1, 0, 3);//从左到右参数意义:从哪个数组,从哪开始复制,复制到哪?开始位置,复制多长

System.out.println("copyOf复制:"+Arrays.toString(Arrays.copyOf(strArr, 3)));

数组排序:

Arrays.sort(strArr1);

十一. 类

类是一类事物的描述, 程序中为class; 类中包含对象, 对象具有属性和方法;
属性:即一类事物具有的共有特点或者特性, 程序中为全局变量(成员变量);
方法:一类事物具有的动作;

class 类名称{
   属性
   方法
}

思考: 创建一个对象都在内存中做了什么事情?
先查看对象所属的类有没有加载到内存,如果没有的话,需要先加载并初始化类(加载、验证、准备、解析、初始化先父后子),然后创建对象:1.在堆区分配对象需要的内存;2.对所有实例变量赋默认值;3.执行实例初始化代码;4.如果有类似于Child c=new Child()形式的c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象的地址赋值给它

  • 抽象类:abstract

  • 接口:interface

  • 抽象类和接口的区别

  • 面向对象和面向过程

十二. static

十三. this

十四. super

十五. final

  • 修饰类
  • 修饰方法
  • 修饰变量

十六. 访问字符串

public protected private

十七. 面向对象三个过程

OOA
OOD
OOP

十八. 面向对象的三个特性(属性)

  • 继承
    继承是从已有类得到继承信息创建新类的过程。
    父类子类;extends(用于基本类和抽象类,只允许有一个父类),implements(用于接口,不限);单一继承(object类)

  • 封装
    通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。

    Java的四种访问控制符:

    • 默认的,default,同一包内可见;

    • 私有的,private,同一类可见;

    • 共有的,public,所有类可见;

    • 受保护的,protected,对同一包内的类和所有子类可见。

  • 多态
    多态性是指允许不同子类型的对象对同一消息做出不同的响应。
    多态分为编译时的多态性和运行时的多态性。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

    详见:Java面向对象的三个特征与含义

十九. 构造方法

二十. 程序的执行过程

二十一. 方法重载

当前类中方法名相同,参数个数或者参数类型不同好处便于记忆筛选,体现了java的多态

二十二. 方法重写

发生在子类中,子类的方法与父类方法名、参数个数、参数类型,返回值类型完全相同,并且访问权限不能严于父类
需要拓展父类的方法时使用

二十三. 继承

二十四. 所有类的父类Object类

Object位于java.lang包下面

  • 其中常用的方法有:
    • toString(); 返回当前对象本身的有关信息,按字符串对象返回
    • equals(); 比较两个对象是否是同一个对象,是则返回true
    • hashCode(); 返回该对象的哈希代码值
    • getClass(); 获取当前对象所属的类信息,返回Class对象
  • equals方法的重写
  • toString方法重写

二十五. 主方法分析

public static void main(String[] args){}
  • 1)保证该类的独立运行。
  • 2)它是程序的入口。
  • 3)它被jvm调用

二十六. Java内存总结

java分了5片内存

  • 1:程序计数器:类似于CPU中的PC寄存器,用于存放下一条指令的地址,但是虚拟机不使用CPU的程序计数器,而是自己在内存里设立一片区域模拟CPU的程序计数器。
  • 2:本地方法栈:区别于虚拟机栈执行的是Java方法,本地方法栈则是虚拟机使用的Native方法服务,我们在看一些库的源码时正常定位到最后就是用Native方法实现的
  • 3:方法区:方法区也是各个线程间共享的区域,一般存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
  • 4:虚拟机栈:Java虚拟机栈也是线程私有的,它的生命周期等同于线程的生命周期。如局部变量表,操作数栈,动态链接,方法出口
  • 5:堆:实例对象,数组;垃圾回收主阵地;

:存储的都是局部变量 ( 方法中定义的变量,方法上的参数,语句中的变量 );只要数据运算完成所在的区域结束,该数据就会被释放。

:用于存储数组和对象,也就是实体。啥是实体啊?就是用于封装多个数据的。

1:每一个实体都有内存首地址值
2:堆内存中的变量都有默认初始化值。因为数据类型不同,值也不一样。
3:垃圾回收机制。

JVM虚拟机内存管理:

详见

Java程序的执行过程:

运行时数据区RDA,就是我们常说的JVM内存

堆:实例对象,数组
栈:局部变量
方法区:类中方法
本地方法区:native查看方法
寄存器:地址

二十七.自动装箱, 自动拆箱

Java有8种基本类型,每种基本类型又有对应的包装类型。在Java中,一切都以对象作为基础,但是基本类型并不是对象,如果想以对象的方式使用这8中基本类型,可以将它们转换为对应的包装类型。基本类型和包装类型的对应

img

  • 可以直接将整型赋给Integer对象,由编译器来完成从int型到Integer类型的转换,这就叫自动装箱
  • 与此对应的,自动拆箱就是可以将包装类型转换为基本类型,具体的转换工作由编译器来完成。

二十八. 异常和错误

二十九. 泛型

了解泛型:泛指一种某一种数据类型;

三十. 集合

线性表,链表,哈希表这些常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。因此,我们一般的程序员不必自己开发相关的方法
集合(框架):java提供了一组对数组、链表数据结构操作的API,这组API即集合;存在于java.util

img

1、List、Set、Map 的区别

img

2、HashMap 和 Hashtable 有什么区别?

存储:HashMap 运行 key 和 value 为 null,而 Hashtable 不允许。
线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。

3、如何决定使用 HashMap 还是 TreeMap?

对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择

4、HashMap 的实现原理?

HashMap 基于 Hash 算法实现的,我们通过 **put(key,value)**存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

5、HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值

6、ArrayList 和 LinkedList 的区别是什么?

数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。
综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

7、数组和 List 之间的转换?

数组转 List:使用 Arrays.asList(array) 进行转换。
List 转数组:使用 List 自带的 toArray() 方法。

8、ArrayList 和 Vector 的区别是什么?

线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。
性能:ArrayList 在性能方面要优于 Vector。
扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。

9、Array 和 ArrayList 有何区别?

Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。

三十一. IO流

三十二. XML解析

三十三. JDBC数据库连接

Java多线程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
区别并发并行: 并发是指:多个事件在同一时间间隔内发生,并行是指:多个事件在同一时刻发生

Java数据类型

  • Java基本数据类型
    int 32bit
    short 16bit
    long 64bit
    byte 8bit
    char 16bit
    float 32bit
    double 64bit
    boolean 1bit
  • Java基本数据类型封装类
    Integer // 4 byte
    Short // 2 byte
    Long // 8 byte
    Byte // 1 byte
    Character: // 2 byte
    Float // 4 byte
    Double // 8 byte
    的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
    区别并发并行: 并发是指:多个事件在同一时间间隔内发生,并行是指:多个事件在同一时刻发生

Java数据类型

  • Java基本数据类型
    int 32bit
    short 16bit
    long 64bit
    byte 8bit
    char 16bit
    float 32bit
    double 64bit
    boolean 1bit
  • Java基本数据类型封装类
    Integer // 4 byte
    Short // 2 byte
    Long // 8 byte
    Byte // 1 byte
    Character: // 2 byte
    Float // 4 byte
    Double // 8 byte
    1个字节等于8位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值