1 java中右移和无符号右移的区别
右移>> :该数对应的二进制码整体右移,左边的用原有标志位补充,右边超出的部分舍弃。
无符号右移>>> :不管正负标志位为0还是1,将该数的二进制码整体右移,左边部分总是以0填充,右边部分舍弃。
2 double和Double分别占用几个字节
计算方式: 对象头+实例数据+对齐填充
类型 | 64位(无压缩) |
boolean | 1 |
byte | 1 |
short | 2 |
char | 2 |
int | 4 |
float | 4 |
long | 8 |
double | 8 |
普通对象头 | 16 |
数组对象头 | 24 |
reference(引用类型) | 8 |
3 java对象解析
HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
3.1 对象头
HotSpot虚拟机的对象头包含两部分信息
第一部分用来存储对象自身的运行数据,如哈希码(HashCode),GC分代年龄,锁状态标志,线程持有的锁,,偏向线程ID,偏向时间戳等; 这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32比特和64比特,官方称为"Mark Word"; 对象需要存储的运行时数据很多, 其实已经超出了32,64位Bitmap结构所能记录的最大限度,但对象头里的信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率, Mark Word 被设计成一个有着动态定义的数据结构, 以便在极小的空间内存储尽量多的数据, 根据对象的状态复用自己的存储空间;
对象头的另外一部分是类型指针, 即对象指向它的类型元数据的指针, java虚拟机通过这个指针来确定该对象是哪个类的示例;如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,
3.2 实例数据
实例数据部分是对象真正存储的有效信息, 即我们在程序代码里面所定义的各种类型的字段内容,无论是从父类集成下来的,还是在子类中定义的字段都必须记录起来;
这部分的存储顺序会受到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义顺序的影响。HotSpot虚拟机默认的分配顺序为longs/doubles、ints、shorts/chars、bytes/booleans、oops(OrdinaryObject Pointers,OOPs),从以上默认的分配策略中可以看到,相同宽度的字段总是被分配到一起存放,在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前
3.3对齐填充
对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用; 由于HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,也就是说任何对象的大小必须是8字节的整数倍; 对象头部分已经被设计成正好8字节的倍数,因此, 如果对象实例部分没有对齐的话,就需要对齐填充来补全
4 mysql自动提交如何更改,是数据库级别的更改还是连接级别的更改
- 一种是通过set命令修改会话级别或者数据库级别的参数,但是数据库重启后参数会恢复默认值;
- 第二种方法是修改mysql的配置文件my.ini,一直生效。
5 mysql 在一个事务中,删除了一张表, 回滚之后,这张表还存在吗
不存在
mysql> select * from person;
+----+------+
| id | name |
+----+------+
| 1 | 2 |
| 2 | 22 |
| 3 | 33 |
+----+------+
3 rows in set (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table person;
Query OK, 0 rows affected (0.01 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from person;
ERROR 1146 (42S02): Table 'person.person' doesn't exist
mysql>
6 如果一个表没有主健会怎么样
1 不规范, 不满足第一范式
2 查询比较慢
InnoDB表是基于聚簇索引建立的, 对主键