java笔记md,java基础.md

java 环境搭建

JRE

JRE(Java runtime environment Java运行环境)

包括java虚拟机和java 程序所需要的核心类库等,如果想运行一个开发好的Java下程序,计算机中只需要安装JRE即可。

JDK

JDK(Java Development Kit Java开发工具包)

JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括JRE所以安装了JDK,就不应单独安装JRE了。

其中的开发工具:编译工具(javac.exe)打包工具(jar.exe)等

简单而言:使用JDK开发完成的java程序,交给JRE去运行。

运算符

位运算

位运算是直接对二进制进行运算

<< 左移 :

相当于乘以2的移动的次幂

二进制数向左移动,被移除的高位丢弃,空缺为补0

>> 右移 :

就是除以2 的移动的次幂,最高位补什么由原有数据的最高位值而定。

如果最高位位0 右移后,用0补空位

如果最高位为1 ,右移后,用1补空位

>>> 无符号右移:

无论最高位是什么,右移后,都用0补空位

& 与运算

二进制位进行&运算,只有1&1时,结果为1,否则为0.

| 或运算

二进制位进行| 运算,只有0|0时结果为0,否则为1

^ 异或运算

任何相同二进制进行|运算,结果都是0;1^1=0 ,0^0=0

不同二进制位^ 运算结果都是1 1^0=1 ,0^1=1

~ 反码

先转换为二进制数,在每一位取反

1、最有效率的方式算出2乘以8等于几?

2<<3

2、不借用第三个变量,两个变量怎么互换?

方法一:

//如果n和m 的值非常大容易超出int 范围

int n = 3,m = 8;

n = n + m;

m = n - m;

n = n- m;

方法二:

int n = 3,m = 8;

n = n ^ m;

m = n ^ m; // (n ^ m) ^ m

n = n ^ m; //(n ^ m) ^ n

java中的内存空间

java程序在运行时,需要在内存中分配空间。为了提高效率,对空间进行了不同的区域划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

栈内存(栈区)

特点:

​数据使用完毕会自动释放

用于存储局部变量,当数据使用完,所占空间会自动释放

堆内存(堆区)

1、数组和对象,通过new建立的实例都存放在堆内存中

2、每一个实体都有内存地址值

3、实体中的变量都有默认初始值

4、实体不在被使用,会在不确定的时间内被垃圾回收器回收

方法区

本地缓存区

寄存器

数组内存结构图

b322cab923dd0f283082ce8442d00bf5.png

数组排序

选择排序

冒泡排序

相邻的两个元素进行比较,如果符合条件就换位。

折半查找

可以提高效率,但是必须是有序的

了解希尔排序

进制转换

十进制转二进制

十进制转十六进制

查表法十进制转十六进制

查找法十进制转二进制

面向对象

结合实际案例来举例子(三个)

1、面试

2、电器

面向对象java 和php的区别

面向对象:三个特征:封装、继承、多态

类和对象的关系

类就是对现实生活中事物的描述

对象:就是这类事物,实实在在存在的个体

对象的内存结构

​当创建一个对象时,new Car() 时java会现在堆内存中间建立一个对象(对象包含 color=“red” num=4),每个对象对应一个内存地址(0x0034) ,并赋值给栈内存中的c1。

82e2b1c686c625b12f37b7137afc5b45.png

函数覆盖(override)

子类中出现与父类中一模一样的方法时,会出现覆盖操作,也称之位重写或者复写。在之类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。

函数的重载(overload)

概念:

在同一个类中,函数名相同,但是参数的个数或者参数类型不同

特点:

与返回值类型无关,只看参数列表

好处:

方便阅读,优化程序设计

多态

多态可以理解为事物存在的多种表现形式

体现

父类或者接口的引用指向或者接收自己的子类对象

前提

必须是类与类直接有关系。要么继承,要么实现。

通常还有一个前提,存在覆盖。

弊端

提高了扩展性,但是只能使用父类的引用访问父类中的成员。

作用

多态的存在提高了程序的扩展性和后期的可维护性

内部类

内部类的访问规则

1、内部类可以直接访问外部类中的成员,包括私有。

​ 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部类名.this

2、外部类要访问内部类,必须建立内部对象。

访问格式:

​当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。

格式:

​外部类名.内部类名 变量名 = 外部类对象.内部类对象;

​外部类名.内部类名 变量名 = new 外部类类名().new 外部类类名();

多线程

学习链接

进程:是一个正在执行中的程序

​ 每个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。

线程: 就是进程中的一个独立的控制单元

​线程在控制着进程的执行

一个进程中至少有一个进程

java vm 启动的时候回有一个进程java.exe

该进程中至少一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。

该线程称之为主线程。其实hm启动的时候,还有负责垃圾回收机制的线程。

创建多线程

方法一:定义类继承Thread

步骤:

​1、定义类继承Thread

​2、复写 Thread 中的run方法

​目的:将自定义代码存储在run方法,让线程运行。

​ 3、调用线程的start 方法

该方法两个作用:启动线程,调用run方法。

为什么要覆run方法?

Thread 类用于描述线程。

该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。也就是说Thread类中的run方法,用于存储线程要运行的代码

class Test extends Thread{

public void run(){

for(int i =0 ;i< 60 ;i++){

System.out.println("test run" + i);

}

}

}

class ThreadDemo {

public static void main(String[] args){

Test test = new Test();

test.start();

for(int i=0; i< 60;i++){

System.out.println("main run "+ i);

}

}

}

运行结果:

531e0ec768cfcdfc31a9b59540977c50.png

方法二:实现Runnable方法

1、定义类实现Runnable接口

2、覆盖Runnable接口中的run方法

​将线程要运行的代码存放在该run方法中

3、通过Thread类建立线程对象

4、将Runnable接口之类对象作为实际参数传递给Thread类的构造函数

​为什么要将Runnable 接口的子类对象传递给Thread 的构造函数

​ 因为,自定义的run方法所属的对象是Runnable 接口子类对象

​ 所以要让线程去执行指定对象的run方法。就必须明确该run方法所属对象。

5、调用Thread类的start 方法开启线程并调用Runnable接口子类的run方法

5、调用Thread类的start 方法开启线程并调用Runnable接口子类的run方法

class TestDemo implements Runnable{

public void run(){

for(int i =0 ;i<60;i++){

System.out.println("test run "+ i);

}

}

}

class RunnableDemo{

public static void main(String[] args){

TestDemo test = new TestDemo();

Thread thread = new Thread(test);

thread.start();

for(int i =0 ;i<60;i++){

System.out.println("main run "+ i);

}

}

}

执行结果

ab5516077acb3f6dd2ca8c6f87120206.png

实现方式和继承方式有什么区别?

​实现方式的好处是避免了单继承的局限性,在定义线程的时候,建议使用实现方式。

​ 两种方式区别:

​继承Thread :线程代码存放在Threa的子run方法中。

​实现Runnable ,线程代码存在接口的子类的run方法中。

多线程安全问题

产生原因:

​当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。

解决办法一,同步代码块:

​对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。

​Java对于多线程的安全问题提供了 专业的解决方案:同步代码块

​synchronized(对象){

​需要执行的代码

​}

对象如同锁。持有锁的线程可以在同步中执行。没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。

解决方法二,同步函数:

​public synchronized void 函数名(){

​ }

同步函数用的是哪一个锁?

函数需要被对象调用,那么函数都有一个所属对象引用。就是this。所以同步函数使用的锁是this。

如果同步函数被静态修饰后,使用的锁是什么呢?

​静态进内存时,内存中没有本类对象(this),但是一定有该类对应的字节码对象(类名.class)

同步代码块和同步函数

单例设计模式(多线程)

饿汉式

懒汉式(有线程安全问题)

死锁

产生原因:

​同步中嵌套同步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值