java基础知识

字符串对象

String s1 = "hello";
 String s2 = new String("hello");
String s3 = new String("hello");
String s4 = new String("world");

第一行在常量池创建了一个对象"hello",然后返回常量池中"hello"的地址给s1变量;
第二行在堆中创建一块内存,将该内存地址返回给s2变量。紧接着,会去常量池中找是否有“hello”字符串,如果没有就在常量池分配一块空间存放"hello",然后在堆中创建一个常量池中此"hello"对象的拷贝对象;如果有就直接在堆中创建一个new出来的"hello"对象。在本例中,由于常量池已经存在了"hello",所以这行代码只创建一个对象,即堆上new出来的对象;
第三行在堆中创建一块内存,将该内存地址返回给s3变量。该内存存放一个new出来的"hello"对象;
第四行在堆中创建一块内存,将该内存地址返回给s4变量。紧接着,发现常量池中没有"world"字符串,于是在常量池分配一块空间存放"world",然后在堆中创建一个常量池中此"world"对象的拷贝对象。因此,这行代码创建了2个对象。

equals()与==

一、对象类型不同
1、equals():是超类Object中的方法。
2、= =:是操作符。
二、比较的对象不同
1、equals():用来检测两个对象是否相等,即两个对象的内容是否相等。先判断类型再判断值。
2、= =:用于比较引用和比较基本数据类型时具有不同的功能,具体如下:
(1)基础数据类型(相同):比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。
(2)引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。

B树B+树

B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树(B树是一颗多路平衡查找树)
它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图.
在这里插入图片描述
B-树有如下特点:
所有键值分布在整颗树中(索引值和具体data都在每个节点里);任何一个关键字出现且只出现在一个结点中;搜索有可能在非叶子结点结束(最好情况O(1)就能找到数据);在关键字全集内做一次查找,性能逼近二分查找;

B+树是B-树的变体,也是一种多路搜索树, 它与 B- 树的不同之处在于:所有关键字存储在叶子节点,内部节点(非叶子节点并不存储真正的 data)为所有叶子结点增加了一个链指针
简化 B+树 如下图

在这里插入图片描述
区别:
1.B+树内节点不存储数据,所有 data 存储在叶节点导致查询时间复杂度固定为 log n。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)。
2. B+树叶节点两两相连可大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。
3.B+树更适合外部存储。由于内节点无 data 域,每个节点能索引的范围更大更精确

List、Set、Map

1.List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;
2. Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
3. Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 Tree Set 类,可以按照默认顺序,也可以通过实现 Java.util.Comparator< Type >接口来自定义排序方式。

关系:
Collection:List、Set、Queue
Map:Hashtable、HashMap

HashMap:基于hash的Map 接口实现,非线程安全(不同步的),支持null值和null键

Vector & ArrayList 的主要区别
1) 同步性:Vector是线程安全的,也就是说是同步的 ,而ArrayList 是线程序不安全的,不是同步的 。
2)数据增长:当需要增长时,Vector默认增长为原来一倍 ,而ArrayList却是原来的50% ,这样,ArrayList就有利于节约内存空间。
如果涉及到堆栈,队列等操作,应该考虑用Vector,如果需要快速随机访问元素,应该使用ArrayList 。

Hashtable & HashMap区别
Hashtable和HashMap它们的性能方面的比较类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。

线性表包括顺序表和链表;list(列表)底层数据结构为链表,元素数量可以改变;array(数组)底层数据结构为顺序表,元素数量不能改变。

访问权限限制

public:包内包外均可见
protected:包内可见、包外子类可见
default:包内可见、包外不可见
private:类内可见、类外不可见

重载

方法的重载是指:
1、在同一个类中
2、方法名相同
3、方法的形参列表不同
具体的不同表现为:
类型、个数、顺序的不同才可以构成重载
4、#比较容易忽略的一点#
与方法的返回值类型与访问权限无关

重写

子类重写父类同名的方法
重写规则:两同两小一大
方法名 参数列表相同
返回类型 抛出异常<= 重写前
访问权限>=重写前

字节-JAVA|C/C++

java中只有byte, boolean是一个字节, char是两个字节, 所以对于java来说127+1不会发生溢出,
但是对于c/c++语言来说, char是一个字节,会发生溢出, 对127加一发生溢出, 0111 1111 --> 1000 0000, 1000 0000为补码-128

异常

在这里插入图片描述

  1. 粉红色的是检查式异常(checked exceptions),可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常 状况,就必须采取某种方式进行处理。其必须被 try{}catch语句块所捕获,或者在方法里通过throws子句声明.受检查的异常必须在编译时被捕捉处理。
  2. 绿色的异常是运行时异常(runtime exceptions),运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。
  3. 而声明为Error的,则属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error不需要捕捉。

finally中的语句一定会执行。 catch捕获到异常后程序结束

接口与抽象类

接口是特殊的抽象类
相同点
(1)都不能被实例化 (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点
(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

单例模式

单例模式有以下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。
  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

多线程

1.start方法
用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。
2.run方法
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。
3.yield()不释放锁
yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会。
因此,使用yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。
但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次选中。
4.sleep()不释放锁
会使当前线程睡眠指定时间
5.wait()释放锁
会使当前线程回到线程池中等待,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
6.join()释放锁
1.当前线程调用 某线程 join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁
2.即join()的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。

创建并启动线程的过程为:定义线程—实例化线程—启动线程。
一 、定义线程:
1、扩展java.lang.Thread类。 2、实现java.lang.Runnable接口。
二、实例化线程:
1、如果是扩展java.lang.Thread类的线程,则直接new即可。
2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法
三、启动线程:
在线程的Thread对象上调用start()方法,而不是run()或者别的方法。

命令行编译运行.java

1.安装jdk
2.javac xxx.java
3.java xxx

JRE(Java Runtime Enviroment)是Java的运行环境。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。
JDK(Java Development Kit)又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运 行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。

内存共享与私有

私有:java虚拟机栈,程序计数器,本地方法栈
共享:java堆,方法区

JAVA标识符命名规则

Java 标识符有如下命名规则:
由26个英文字母大小写,数字:0-9 符号:_ $ 组成
标识符应以字母_$开头。
标识符不能是关键字。
Java中严格区分大小写

jvm内存配置参数

-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
-Xmx:最大堆大小
-Xms:初始堆大小=最小内存值
-Xmn:年轻代大小
-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值

年轻代5120m, Eden:Survivor=3:1,一个Survivor区大小=1024m(Survivor区占两份,年轻代分为5份),总大小为2048m。

正则表达式

\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]'。
\W 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。

初始化

初始化过程:
1.初始化父类中的静态成员变量和静态代码块 ;
2.初始化子类中的静态成员变量和静态代码块 ;
3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.初始化子类的普通成员变量和代码块,再执行子类的构造方法;
静态内容只在类加载时执行一次,之后不再执行。

&/&&

&和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假;但是&&当第一个条件不成之后,后面的条件都不执行了,而&则还是继续执行,直到整个条件语句执行完为止

JAVA线程状态

在这里插入图片描述
初始-就绪-运行-阻塞-结束

注意(JAVA)

  1. JAVA关键字均为小写:boolean a=false;
  2. 常量关键字final:修饰变量,变量的引用地址不可变但是地址中的内容可以变(常量)。修饰方法,方法不可被重写但是还是可以重载;修饰类,类不可继承。;static修饰静态变量,对象共享这一个变量的存储空间。(全局变量)
    static,确保方法静态加载,不用实例化对象,即可加载。即:静态方法可以直接使用 类名.方法不用实例化对象。
  3. 一个java文件里,public 的类只能出现一个
  4. a= a++;这一操作并未改变a的值
    但要区别a++
 class HelloChina{
	public static void main(String[] args){
	int b=2;
	int a=2;
	a=a++;		
	System.out.println(b);
	System.out.println(b++);
	System.out.println(b);
	System.out.println(a);
	}
}

在这里插入图片描述

  1. 基本类型(byte,short,int,long,double,float,char,boolean)为传值;对象类型(Object,数组,容器)为传引用;
  2. threadlocal 使用开放地址法 - 线性探测法:当前哈希槽有其他对象占了,顺着数组索引寻找下一个,直到找到为止。hashset 中调用 hashmap 来存储数据的,hashmap 采用的链地址法:当哈希槽中有其他对象了,使用链表的方式连接到那个对象上
  3. 在每个线程中都是顺序执行的,而线程之间是穿插执行的。
  4. int是基本数据类型,默认值为0,Integer 是类,默认值为null;
  5. 不可变类(Immutable Class)是一旦被实例化就不会改变自身状态(或值)的类。String就是一种典型的不可变类。
  6. java中的main方法,必须满足以下要求:方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数
  7. 定义数组:char[ ][ ] ch = new char[2][3];等号左边不能出现数字
  8. HashMap,TreeMap是线程不安全的。 HashTable 和 ConcurrentHashMap 都是线程安全的。同时Collection类还提供了synchronized()方法,使得线程安全。
  9. Java中类之间的六种关系:
    第一种:继承关系,例如:子类继承父类,子接口继承父接口。
    第二种:实现关系,例如:类实现接口。
    第三种:依赖关系,例如:一个类作为另一个类中方法的参数存在,这种关系具有偶然性和临时性。
    第四种:关联关系,例如:一个类作为另一个类中的成员变量存在,它是一种强依赖关系。
    第五种:聚合关系,例如:整体和部分之间,他们是可以分离的拥有各自的生命周期,并且部分是相同的。像鸟群和鸟。
    第六种:组合关系,它是一种强聚合,并且整体和部分之间不可分离,具有相同的生命周期,整体包含该部分,也包含其他部分,其他部分和该部分是不相同的,像cpu和计算机,计算机除了包括cpu还有键盘和显示器等。
  10. continue是停止本次循环,回到循环起始处,进入下一循环操作。break是直接跳出当前循环。如果需要跳出多重循环,需要在多重循环外面设一个标识flag,然后使用带有标识的break flag,这样就可以跳出多重循环。
  11. 当类加载时,static静态方法随着类加载而初始化,此时实例对象还未被创建,但是非静态成员变量需要等到实例对象创建才会被初始化。
  12. javac将源程序编译成.class文件,字节码;java将字节码转为机器码,.exe程序
  13. 成员变量:在类范围里定义的变量,有初始值。局部变量:在方法内定义的变量,无初始值。
  14. JAVA的跨平台特性表述为“一次编译,到处运行”,JAVA程序运行在JVM上,而JVM对上屏蔽了底层操作系统差异。
  15. abstract类不能与final,static使用。final修饰方法,子类可以调用,但不能覆盖。最好不要有private因为私有和抽象放在一起,子类如果想重写父类的私有方法根本继承不过来,也就无法重写抽象类中可以有非抽象方法抽象类中可以都是非抽象的,但是抽象方法一定要在类和接口中
  16. 抽象类不能实例化, 理解多态就好了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值