Java基础整理

一、Java数据类型分为两大类:基本数据类型和引用数据类型

  1. 基本数据类型
    四类八种
    整数型,浮点型,字符型,布尔型
    基本数据类型的数值是不可变的。
    基本数据类型的比较是值的比较。
    基本数据类型的变量存放在栈中。

整数型
byte 1字节 -2^7 ~ -2^7-1(-128~127)
short 2字节 -2^15 ~ -2^15-1(-32768~32767)
int 4字节 -2^31 ~ -2^31-1
long 8字节 -2^63 ~ -2^63-1
浮点型
float 4字节 大概-10^38~ 10^38-1
double 8字节 大概-10^308~ 10^308-1
字符型
char 2字节 0~65535
布尔型
boolean

  1. 引用数据类型
    数值,接口,类
    引用数据类型统一占用4个字节,记录引用对象的地址。
    引用数据类型可以定义属性和方法,数值是可变的。
    引用数据类型的值是同时保存在栈内存和堆内存的对象。
    引用类型的比较是引用的比较。

二、数组
存储同一类型多个数据的容器,大小固定。(对存入数组的元素使用下标方式进行编号,从0开始)

数组本身存储在堆内存中,同时在栈内存中存储的是地址引用。

数组的冒泡排序:
数组中两个元素进行两两比较,第一轮进行比较时,会把最大的元素放到数组的末尾,所以比较的轮数是数组的长度-1。

for(int i =1;i<arr.length;i++){//控制轮数
	for(int j =i;j<arr.length-i;j++){//控制每一轮比较的次数
		if(arr[j-1]>arr[j]){
			int tmp = arr[j-1];
			arr[j-1] = arr[j];
			arr[j] = tmp;
		}
	}
}

数组的选择排序:
从数组的第一个元素(数组索引为0)开始,依次比较数组后面的元素,第一轮之后,数组的第一个元素会是最小的,所以控制的轮数是数组的长度-1。

for(int i = 1;i<arr.length;i++){//控制轮数
	for(int j =i;j<arr.length;j++){//控制比较的下标
		if(arr[i-1]>arr[j]){
			int tmp=arr[i-1];
			arr[i-1]=arr[j];
			arr[j]=tmp;
		}
	}
}`

数组的反转:
把数组元素倒置

for (int i=0;i<arr.length/2;i++){
            int tmp=arr[i];
            arr[i] = arr[arr.length-i-1];
            arr[arr.length-i-1]=tmp;
        }

三、集合
存储同一类型的元素,而且大小不固定,只能存储对象。

Collection(List、Set)
Map

List 有序集合,可重复,允许有null值。
Set 无序集合,不可重复,允许有null值但最多有一个。
Map 存储key,value键值对,key不可重复,value可重复,一个key对应一个value。

List(ArrayList、LinkedList、Vector、Stack)

ArrayList:底层基于数组存储数据,内存空间连续。查询速度快,增加和删除数据在末尾位置相对快些。
动态扩容,默认初始容量10,每次扩容是增加当前容量的一半。
线程不安全。

LinkedList:底层基于双向链表存储数据,内存空间不连续。查询速度慢,增加和删除数据速度快。
每个节点不仅存有当前节点数据,还存有上一节点的指针,和下一节点的指针。
线程不安全。

Vector:底层基于数组存储数据。
默认初始容量10,每次扩容增加当前容量的一倍。
线程安全。

Stack:继承于Vector;遵循先进后出/后进先出原则。

Set(HashSet、TreeSet)

HashSet:底层是基于HashMap(数组加链表)存储数据,采用HashCode算法存取数据
无序,数据不重复。
线程不安全

TreeSet:底层基于TreeMap(红黑树)存储数据。
有序,数据不重复。
线程不安全,存取效率低于HashSet

Map(HashMap、HashTable、TreeMap、LinkedHashMap)

HashMap(键值可以重复)底层基于数组加链表,JDK1.8之后是数组加链表加红黑树(链表长度大于8是转化为红黑树)。
默认初始容量是16,默认加载因子是0.75f,扩容时是每次增加一倍。
线程不安全
HashMap写入数据:先计算key的hashCode值,然后与table的长度取模运算,算出index值,即放置新数据数组的索引位置,如果算出的index值相同,即出现了hash冲突,解决方法就是使用链表的形式保存数据。每个链表保存的是index相同的数据。
HashMap读取数据:先定位哈希表中index值,然后遍历对应链表的key的hashCode值相同的节点,获取对应的value。

HashTable(键值不可重复)底层与HashMap相同。
默认初始容量11,默认加载因子0.75f。扩容时是每次增加一倍再加1.
线程安全。
HashTable put数据:先获取synchronized锁,如果有null值会抛出异常,之后计算key的hash值与index,然后遍历对应位置的链表,如果找到对应的key的hash值,则更新value值,如果没有找到,则增加节点,如果需要进行扩容在链表头部添加新的节点。
HashTable get数据:先获取synchronized锁,计算key的hash值和index值,找到对应位置的链表进行遍历,如果找到对应的key的hash值返回数据,如果没有返回null。

TreeMap:排序的Map,基于红黑树实现

LinkedHashMap继承于HashMap,相对于HashMap,增加了双链表的结果(即节点中增加了前后指针),其他处理逻辑与HashMap一致,同样也没有锁保护,多线程使用存在风险。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jziwen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值