计算机内存管理

内存又称主存,是CPU直接寻址存储空间,由半导体器件制成。内存的特点是存取速率快。内存是电脑中的主要部件,它是相对于外存而言的。我们平常使用的程序,如Windows操作系统、打字软件游戏软件等,一般都是安装硬盘外存上的,但仅此是不能使用其功能的,必须把它们调入内存中运行,才能真正使用其功能,我们平时输入一段文字,或玩一个游戏,其实都是在内存中进行的。就好比在一个书房里,存放书籍的书架和书柜相当于电脑的外存,而我们工作的办公桌就是内存。通常我们把要永久保存的、大量的数据存储外存上,而把一些临时的或少量的数据和程序放在内存上,当然内存的好坏会直接影响电脑的运行速度。

数组 - 图1

扩展

字 word
字节 byte
位 bit
字长是指字的长度
1字节=8位(1 byte = 8bit)
1字=2字节(1 word = 2 byte)
64位也就是64bit,也就是8个byte
一个字节的字长是8
一个字的字长为16
bps 是 bits per second 的简称。一般数据机及网络通讯的传输速率都是以「bps」为单位。如56Kbps、100.0Mbps 等等。
Bps 即是Byte per second 的简称。而电脑一般都以Bps 显示速度,如1Mbps 大约等同 128 KBps。
bit 电脑记忆体中最小的单位,在二进位电脑系统中,每一bit 可以代表0 或 1 的数位讯号。
Byte 一个Byte由8 bits 所组成,可代表一个字元(A~Z)、数字(0~9)、或符号(,.?!%&+-/),是记忆体储存资料的基本单位,至於每个中文字则须要两Bytes。当记忆体容量过大时,位元组这个单位就不够用,因此就有千位元组的单位KB出现,以下乃个记忆体计算单位之间的相关性:
1 Byte = 8 Bits
1 KB = 1024 Bytes
1 MB = 1024 KB
*1 GB = 1024 MB

usb2.0标准接口传输速率。许多人都将“480mbps”误解为480兆/秒。其实,这是错误的,事实上“480mbps”应为“480兆比特/秒”或“480兆位/秒”,它等于“60兆字节/秒”,大家看到差距了吧。
这要从bit和byte说起:bit和byte同译为”比特”,都是数据量度单位,bit=“比特”或“位”。
byte=字节即1byte=8bits,两者换算是1:8的关系。
mbps=mega bits per second(兆位/秒)是速率单位,所以正确的说法应该是说usb2.0的传输速度是480兆位/秒,即480mbps。
mb=mega bytes(兆比、兆字节)是量单位,1mb/s(兆字节/秒)=8mbps(兆位/秒)。
我们所说的硬盘容量是40gb、80gb、100gb,这里的b指是的byte也就是“字节”。
1 kb = 1024 bytes =2^10 bytes
1 mb = 1024 kb = 2^20 bytes
1 gb = 1024 mb = 2^30 bytes
比如以前所谓的56kb的modem换算过来56kbps除以8也就是7kbyte,所以真正从网上下载文件存在硬盘上的速度也就是每秒7kbyte。
也就是说与传输速度有关的b一般指的是bit。
与容量有关的b一般指的是byte。
最后再说一点: usb2.0 480mbps=60mb/s的传输速率还只是理论值,它还要受到系统环境的制约(cpu、硬盘和内存等),其实际读、取写入硬盘的速度约在11~16mb/s。但这也比usb1.1的12mbps(1.5m/s)快了近10倍。
原文参考链接:http://blog.csdn.net/wanlixingzhe/article/details/7107923/

数组——存储和读取

数组是一种线性表数据结构(按前后线性顺序排列),他用一组连续的内存空间,来存储一组具有相同类型的数据(每个值数据类型一样)。
数组 - 图2

读取

每个数组都有一个对应的内存地址,称为数组的开始地址——start_address。
每个元素的内存空间大小——item_size。
数组 - 图3

  1. // 第一个元素地址
  2. start_address
  3. // 第二个元素地址
  4. start_address + item_size * 1
  5. // 第三个元素地址
  6. start_address + item_size * 2
  7. // 第N个元素地址
  8. start_address + item_size * (N - 1)

image.png

自定义List——读取函数

  1. public class YKDArrayList {
  2. // 此处需要声明一个数组,作为底层存储
  3. int[] array = new int[20];
  4. int size = 0;
  5. public YKDArrayList() {
  6. //因为还未学习插入,所以暂时内置数据
  7. this.array[0] = 1;
  8. this.array[1] = 10;
  9. this.array[2] = 30;
  10. this.size = 3;
  11. }
  12. // 获取数组的长度
  13. public int size() {
  14. return this.size;
  15. }
  16. // 数组获取某个索引值
  17. public int get(int index) {
  18. return array[index];
  19. }
  20. public static void main(String[] args) {
  21. YKDArrayList arrayList = new YKDArrayList();
  22. System.out.println(arrayList.get(0));
  23. }
  24. }

数组插入和删除

尾部插入

  1. start_address + item_size * n // n 为当前数组的个数

数组 - 图5

中间插入

数组 - 图6
插入地方的后面的数据后移
数组 - 图7

  1. 移动watch movie
  2. 移动have dinner
  3. 插入 afternoon tea

插入开始的地方需要N步,平均步数(1+2+3+…+N)/N 时间复杂度为O(N)。

空间不够

数组 - 图8
数组 - 图9
如果所有的内存空间都不足吗,系统抛出异常——out of memory,内存不足。

数组删除

与插入的操作恰好相反
尾部元素:直接删除
数组 - 图10
中间元素:

  1. 删除中间元素
  2. 右侧元素左移

数组 - 图11
时间复杂度O(N)

自定义List——插入删除函数

  1. public class YKDArrayList {
  2. // 此处需要声明一个数组,作为底层存储
  3. int[] array = new int[20];
  4. int size = 0;
  5. public YKDArrayList() {
  6. }
  7. // 获取数组的长度
  8. public int size() {
  9. return this.size;
  10. }
  11. // 数组获取某个索引值
  12. public int get(int index) {
  13. return this.array[index];
  14. }
  15. // 添加元素在末尾
  16. public void add(int element) {
  17. //相当于调用传入this.size
  18. this.add(this.size, element);
  19. }
  20. // 添加元素在中间
  21. public void add(int index, int element) {
  22. if (index < 0 || index > this.size) {
  23. return;
  24. }
  25. // 元素依次右移
  26. for (int i = this.size - 1; i >= index; i--) {
  27. this.array[i + 1] = this.array[i];
  28. }
  29. // 插入元素
  30. this.array[index] = element;
  31. // 调整size
  32. this.size++;
  33. }
  34. // 删除元素
  35. public void remove(int index) {
  36. if (index < 0 || index > this.size - 1) {
  37. return;
  38. }
  39. // 元素依次左移
  40. for (int i = index; i < this.size - 1; i++) {
  41. this.array[i] = this.array[i + 1];
  42. }
  43. // 删除最后一个元素
  44. this.array[this.size - 1] = 0;
  45. // 调整size
  46. this.size--;
  47. }
  48. public static void main(String[] args) {
  49. YKDArrayList ykdArrayList = new YKDArrayList();
  50. ykdArrayList.add(1);
  51. ykdArrayList.add(2);
  52. ykdArrayList.add(3);
  53. ykdArrayList.add(4);
  54. ykdArrayList.add(0, 5);
  55. ykdArrayList.remove(3);
  56. }
  57. }

支持扩容

  1. public class YKDArrayList {
  2. // 此处需要声明一个数组,作为底层存储
  3. int[] array = new int[20];
  4. int size = 0;
  5. public YKDArrayList() {
  6. }
  7. // 获取数组的长度
  8. public int size() {
  9. return this.size;
  10. }
  11. // 数组获取某个索引值
  12. public int get(int index) {
  13. return this.array[index];
  14. }
  15. // 添加元素在末尾
  16. public void add(int element) {
  17. //相当于调用传入this.size
  18. this.add(this.size, element);
  19. }
  20. // 添加元素在中间
  21. public void add(int index, int element) {
  22. if (index < 0 || index > this.size) {
  23. return;
  24. }
  25. // 支持扩容
  26. this.judgeMemory(this.size + 1);
  27. // 元素依次右移
  28. for (int i = this.size - 1; i >= index; i--) {
  29. this.array[i + 1] = this.array[i];
  30. }
  31. // 插入元素
  32. this.array[index] = element;
  33. // 调整size
  34. this.size++;
  35. }
  36. // 删除元素
  37. public void remove(int index) {
  38. if (index < 0 || index > this.size - 1) {
  39. return;
  40. }
  41. // 元素依次左移
  42. for (int i = index; i < this.size - 1; i++) {
  43. this.array[i] = this.array[i + 1];
  44. }
  45. // 删除最后一个元素
  46. this.array[this.size - 1] = 0;
  47. // 调整size
  48. this.size--;
  49. }
  50. private void judgeMemory(int size) {
  51. // 如果内存不满足,则需要扩容
  52. if (size > this.array.length) {
  53. // 申明两倍空间
  54. int[] newArray = new int[this.array.length * 2];
  55. // 拷贝操作
  56. this.copy(this.array, newArray);
  57. // 新数组赋值给原数组
  58. this.array = newArray;
  59. }
  60. }
  61. // 拷贝操作
  62. private void copy(int[] source, int[] aim) {
  63. for (int i = 0; i < source.length; i++) {
  64. aim[i] = source[i];
  65. }
  66. }
  67. public static void main(String[] args) {
  68. YKDArrayList ykdArrayList = new YKDArrayList();
  69. ykdArrayList.add(1);
  70. ykdArrayList.add(2);
  71. ykdArrayList.add(3);
  72. ykdArrayList.add(4);
  73. ykdArrayList.add(0, 5);
  74. ykdArrayList.remove(3);
  75. }
  76. }

总结

优势

  • 查询特别快,时间复杂度O(1)

    劣势

  • 插入删除比较慢,时间复杂度O(N)

  • 需要连续内存空间,并且会申请额外的内存空间便于起扩展,这种数据结构对内存要求比较高,利用率低。
  • ArrayList底层就是利用数组实现的

    demo 回文字符串

    回文字符串:正着读,和反着读都一样的字段串。

    1. madam
    2. 我爱我
    3. 地满红花红满地
    4. 天连碧水碧连天
    5. 洞帘水挂水帘洞
    6. 山果花开花果山
    7. 上海自来水来自海上

    ```java public class Demo {

    // 判断是否为回文字符串 public static boolean isPalindrome(String content) { int i = 0; int end = content.length()-1; while(i<content.length()/2 + 1) {

    1. if (content.charAt(i)!=content.charAt(end)){
    2. return false;
    3. }
    4. i++;
    5. end--;

    } return true; }

    public static void main(String[] args) { System.out.println(isPalindrome(“洞帘水挂水帘洞”)); System.out.println(isPalindrome(“上海自来水来自海上”)); System.out.println(isPalindrome(“maddam”)); System.out.println(isPalindrome(“m”)); System.out.println(isPalindrome(“maxcam”)); } }

  1. <a name="cTlhF"></a>
  2. ### 括号匹配
  3. 匹配(){}括号,有开有合。
  4. ```java
  5. public class Demo {
  6. // 判断括号是否匹配
  7. public static boolean isBracketMatch(String content) {
  8. // 用两个整数存储括号值,出现左括号就+1,出现右括号则-1
  9. int bracketNum = 0;
  10. int bigBracketNum = 0;
  11. for (int i = 0; i < content.length(); i++) {
  12. char c = content.charAt(i);
  13. if (c == '(') {
  14. bracketNum++;
  15. }
  16. if (c == '{') {
  17. bigBracketNum++;
  18. }
  19. if (c == ')') {
  20. bracketNum--;
  21. // 不能出现负值,负值表示右括号先出现。
  22. if (bracketNum < 0) {
  23. return false;
  24. }
  25. }
  26. if (c == '}') {
  27. bigBracketNum--;
  28. // 不能出现负值,负值表示右括号先出现。
  29. if (bigBracketNum < 0) {
  30. return false;
  31. }
  32. }
  33. }
  34. if (bigBracketNum != 0 || bracketNum != 0) {
  35. return false;
  36. }
  37. return true;
  38. }
  39. public static void main(String[] args) {
  40. System.out.println(isBracketMatch("public void run(int a){if(a == 1){System.out.println(a)}}"));
  41. System.out.println(isBracketMatch("public void run(int a){if(a == 1)System.out.println(a)}}"));
  42. }
  43. }