Java数据类型:
一、基本类型:
byte 1 对应包装类 Byte 每个首字母大写
short 2
int 4 Integer
long 8
float 4
double 8
Boolean 1
char 2 Character
用于类中的属性用包装类,基本的计算用基本数据类型
二、引用类型:
数组、类和接口
为什么有数据类型?不同的数据类型可以减少内存的使用。
内存模型
堆--以new关键词创建的对象,jdk1.7后字符串常量池也移到堆区
栈--栈帧 每调用方法都产生一个栈帧入栈 栈帧中保存该方法的临时变量,调用完后出栈
方法区--静态成员类信息1.7以前,字符串常量池
(传基本类型:调用完method方法后栈帧就出栈)
(传引用类型:new在堆区里,栈区存的是堆区的地址)
三、栈帧里面到底是什么
关于i++【先压栈,再自加】,++i【先自加,再压栈】
所有的传值都是通过操作数栈完成的
四、String的底层
string底层是char数组
string a=127;//128
string b=127;//128
system.out.prinln(a==b);
127输出true,128输出false,因为缓冲区是-128至127
字符串常量池
string a=‘abc’;
string b='abc';
system.out.prinln(a==b);
先到字符串常量池中找有没有abc,有直接引用,没有则常见一个内存空间
所以比较字符串安全的做法:a.equals(b)--看源码
拼接字符串--别用+!!!
字符串常量池不会被垃圾回收,所以那两个没用的字符串一直在,多占内存啊
所以用----StringBuffer
---StringBuilder
builder.append(‘a’)
区别:一个线程安全一个不是
并发产生原因,软件弥补硬件的不足,CPU的摩尔定律失效
CPU线程数,CPU支持的线程数越多,调度越多,性能越好
读内存数据速度跟不上CPU的速度所以就会产生线程的问题
数组---冒泡排序、选择排序 在堆区中创建一个连续的内存空间,是引用类型
数组的缺点:一旦定义长度不变
List
ArrayList,底层是数组,看源码可知每次扩容是原来的1.5倍--读取快,下标直接读,尾部添加两者一样
LinkedList 很少用 底层是链表--读取慢,从中间插入,这个比ArrayList高
Set
HashSet:重复内容添加不进去,按照自然排序的---去重,不能直接拿值
Map
HashMap:通过key,有个hash算法,拿到key就知道下标了,如果出现相同的下标,就扩建成链表 数组+链表
类和对象
分层
dao----------持久层(一般是数据库)
service-----服务层(主要写事物,)
web(controller)---------控制层
底层给上层提供服务,注入用接口
内部存储硬盘读写速度慢,所以发明了内存,慢慢发展成缓存,缓存存进程(正在运行的东西)运行的东西全在内存,
持久化:内存中的运行数据存在硬盘,一般在C盘中