1. 二进制

进制就是进位制,常见的有二进制、十进制、十六进制等

在进制中,可用符号的数量称为基数,基数为n就称为n进制,逢n进一位:

二进制:0 1

十进制:0 1 2 3 4 5 6 7 8 9

十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F

任何一个数都可以使用不同的进制表示,比如十进数9,在二进制中表示为1001,在十六进制中表示为9

计算机内部使用二进制进行运算和存储

 

二进制只有0和1两个符号,容易用现实中物体的两个稳定状态表示,比如电路中有无电流、晶体管是否导通、磁盘磁体有无磁性等

而且二进制在运算时也较简单

一组重要的数

 

2的次幂        十进制           二进制

20                  1                   1

21                  2                   10

22                  4                   100

23                  8                   1000

24                  16                 1 0000

25                  32                 10 0000

26                  64                 100 0000

27                  128               1000 0000

28                  256               1 0000 0000

29                  512               10 0000 0000

210                 1024             100 0000 0000

二进制数转为十进制

把二进制数分解成多项,把每项转换为十进制数然后求和

1001(2) --> 1000(2) + 1(2) --> 8(10) + 1(10) -->9(10)

十进制数转二进制

二进制和十六进制相互转换

二进制从0到1111正好是16个数,可以和十六进制的16个符号一一对应

二进制数              十六进制数

0                          0

1                          1

10                        2

11                        3

100                      4

101                      5

110                      6

111                      7

1000                    8

1001                    9

1010                    A

1011                    B

1100                    C

1101                    D

1110                    E

1111                    F

二进制 --> 十六进制:从右至左每四位一组(不够四位的在前面补0)

1100100(2) --> 0110 0100(2) --> 6(16) 4(16) --> 64(16)

十六进制 --> 二进制:把每个基数转换为四位二进制数即可

64(16) --> 0110(2) 0100(2) --> 1100100(2)

整数在计算机中的表示

 

在计算机中,一个0或者1称为一个比特位(bit)

整数有正负,计算机为了可以表示正负整数,把一个二进制数分为两部分:开头1位符号位,后面的是数值位。如果符号位为0则表示正整数,为1则表示负整数。而且计算机在表示负整数时,还需要经过反码、补码的转换

Java中定义了若干基本类型来表示整数,比如byte、short、int、long,由于所占的位数不同,可以表示的整数的范围也不同

byte(字节)     8bit(1个符号位和7个数值位)                 [-27 , 27-1]、[-128 , 127]

short             16bit(1个符号位和15个数值位)             [-215 , 215-1]、[-32768 , 32767]

int                 32bit(1个符号位和31个数值位)             [-231 , 231-1] 、最大值21亿多一些

long              64bit(1个符号位和63个数值位)             [-263 , 263-1]

2. 字符编码

我们在屏幕上看到的文字,在计算机内部其实是一串二进制的数据。

每个字符都有一个编码,比如'A'的编码为65,在内存、文件中存储的就是这些编码的二进制形式(比如0100 0001),当文本处理程序遇到65时,就会在屏幕上显示A

ASCII字符集

 

最基本的字符编码表(字符集)是ASCII,规定了128个字符(编码从0到127),包括基本的英文标点符号、阿拉伯数字、英文大小写字母、还有一些不能显示的控制字符

在计算机中1byte(8位)可表示的整数范围是[-128 , 127] ,可以容纳所有的ASCII字符,所以就使用1byte的存储空间来存储、表示一个ASCII字符,而且ASCII字符编码都是正整数

需要记住的字符的编码

'A' -- 65

'a' -- 97

其他字符集

其他字符集都基于、兼容ASCII,常见的有GB2312、BIG5、GBK、Unicode、UTF-8等

GB2312是简体中文字符集,主要包含六千多个常用的汉字。在GB2312中,ASCII字符还是使用一个字节存储,其他汉字使用两个字节存储,并且这两个字节的符号位都是1(为了避免和ASCII字符混淆),比如 '中' 这个字符的编码是 -42, -48

Big5是繁体中文字符集,主要包括一万多个繁体汉字,港澳台地区用的较多

GBK是GB2312的扩展,主要包含两万多个汉字,涵盖了大部分简、繁汉字

Unicode是全世界统一的字符集,包含了世界各地的语言文字。Unicode经过了很长时间的发展,有多个版本,本身很庞大也很复杂。在程序中直接使用Unicode会降低程序的执行效率,也很占用较多的存储空间和网络带宽,所以Unicode只用来给文字编码,实际使用时,一般使用UTF-8,它可以把Unicode字符转换为尽可能简短的形式。

UTF-8会使用尽可能少的字节数来表示Unicode字符,以便提高程序处理效率等。在UTF-8中,有的字符使用一个字节存储,有的使用两个、三个或者四个字节,比如 '中' 在UTF-8中的编码是 -28, -72, -83

3. JVM内存结构

JVM在运行时把从操作系统申请到的内存分为若干区域,主要有栈、堆和方法区,方便Java程序使用

堆内存

使用new关键字创建出来的对象都存储在堆内存中

方法区

被加载的类的信息存储在方法区中,包括类声明、字段、方法等信息

栈内存

其实Java程序中的每个线程都有自己的栈内存

栈内存用来存储方法执行时创建的局部变量

方法每执行一次,就会在栈内存中开辟一块内存空间,称为栈帧,方法执行结束后,这个栈帧随即被销毁回收

public class Test1 {
public static void main(String[] args) {
int age1 = 16;
Dog dog1 = new Dog();
User user1 = new User();
user1.setAge(age1);
user1.setDog(dog1);
}
}
class Dog {
}
class User {
private int age;
private Dog dog;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}

4. 常量池

用来把一些常用对象缓存起来,以便重复使用。包括[-128,127]范围内的整形基本类型包装类的对象(如Byte、Short、Integer等),和以 "xx" 形式出现的String对象(称为字面量)

JVM在启动时就会创建这些整形对象并保存在常量池中,在加载类时会把类中的String字面量保存在常量池中

5. 垃圾回收

当存储在堆内存中的对象不能再被程序使用时(比如已经没有变量指向这个对象),在某个时刻就会被垃圾回收器回收。

JVM会使用一个单独的线程不定时的执行垃圾回收,垃圾回收器一般从若干个根对象开始遍历并标记遍历到的对象,那些最终也没被标记的对象就会被垃圾回收器回收

开发人员也可以使用System.gc();方法“催促”垃圾回收器进行回收,但不能保证立即回收

6.  类加载

当Java程序中需要用到一个类时,JVM的类加载器就会找到这个类并把该类加载到内存中,整个加载过程分为多个阶段,其中三个阶段如下:

加载阶段

根据全限定类名找到类的.class文件并加载到方法区内存中,同时在堆内存中生成一个java.lang.Class对象来表示这个类

准备阶段

在方法区内为静态变量分配内存,这个时候静态变量的值是其类型的初始值,比如int类型的初始值为0

初始化阶段

按出现顺序把静态变量赋值语句和静态代码块合并成<clinit>()方法,然后执行此方法,以便给静态变量赋值和执行静态代码块。另外,如果一个类有父类,则父类的初始化阶段先执行

另外,使用new调用构造函数创建对象时,会按出现顺序把类的非静态字段赋值语句、非静态代码块,连同放在最后被调用的构造函数一起合并成<init>()方法,执行此方法完成对象的创建

public class Test4 {
public static int n = 16;
static {
System.out.println(n);
}
public static Object obj = new Object();
static {
System.out.println(obj);
}
public static void main(String[] args) {
System.out.println("main");
}
}
Person p  = new Person();

这句代码执行的时候,以下模块的执行顺序是如下:123456

(1)父类静态代码块

(2)子类静态代码块

(3)父类非静态代码块

(4)父类构造函数

(5)子类非静态代码块

(6)子类构造函数

7. 递归方法

方法自己调用自己就称为递归。递归方法应该有两个要素:递推规则和返回条件

递推规则指方法如何自己调用自己

返回条件指方法什么时候不再调用自己,从而让方法可以返回,不至于一直递归下去导致栈内存溢出

public class Digui {

    //讲故事(没有返回条件,最终会栈内存溢出)
public static void story() {
System.out.println("从前有个庙,庙里的老和尚在给小和尚讲故事,讲的故事是:");
story();
} //自然数n的阶乘 n! = n*(n-1)*...*3*2*1,其中0!=1;也可以表示为 n! = n*(n-1)!,0!=1
public static int jiecheng(int n) {
if (n > 0) {
//递推规则 n! = n*(n-1)!
return n * jiecheng(n - 1);
} else {
//返回条件0!=1
return 1;
}
}
}

8. 访问类路径下的资源

类路径即classpath,JVM加载类时会到类路径下寻找并加载类的.class文件。类路径默认有JDK的lib目录,项目的bin目录

项目编译时会把src目录下的.java文件编译成.class文件,并把.class文件放在项目的bin目录下;src下的其他文件则直接被copy到bin目录下,所以访问类路径下的资源可以看成访问src目录下的非.java文件

可以使用ClassLoader对象的getResource或者getResourceAsStream方法访问类路径下的资源。注意ClassLoader以bin(src)目录为根目录,资源以相对路径的形式指定

URL url = Demo.class.getClassLoader().getResource("text1.txt");
String path = url.getFile(); InputStream input = Demo.class.getClassLoader().getResourceAsStream("text1.txt");

另外使用Class对象也可以访问类路径下的资源,但资源需要以绝对路径的形式给出

URL url = Demo.class.getResource("/text1.txt");
String path = url.getFile(); InputStream input = Demo.class.getResourceAsStream("/text1.txt");

注意:需要使用项目自己的类来获得ClassLoader或者Class对象

Java基础其他的更多相关文章

  1. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  2. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  3. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  4. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  5. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  6. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  7. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  8. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

  9. Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...

  10. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

随机推荐

  1. Qt__自定义事件

    #include <QApplication> #include <QEvent> #include <QObject> #include <QDebug&g ...

  2. 好文章之——PHP系列(一)

    注:最近实习的公司是一家做电商企业,后台主要是php开发,好久不怎么接触php的我看了几篇相关文章,提高下对它的认识与理解,发现里面的学习思路还是非常好的,当然也会重新拾一下基础知识啦! 其实自己心中 ...

  3. socketserver及相关的类 (处理socket服务端)+ event事件的使用

    编写简单的套接字服务器并不难,然而,如果要创建的并非简单服务器,还要求助于服务器模块. 模块SocketServer是标准库提供的服务器框架的基石,这个框架包括好多服务器,他们基本服务器的基础上添加了 ...

  4. Ideal test 不执行main方法了

    参考:idea 导入项目后不能执行main方法 用了ideal之后,发现自己的项目里面没有test文件夹,自己建了一个,发现竟然不能执行main函数, 后来经过点播之后,才知道,光建立文件夹是没用的, ...

  5. 一名网工对Linux运维的一次经历

    我是一名名副其实的网络工程师,驻场于某市数字化城乡管理指挥中心(简称数字城管),主要针对中大型网络系统,路由.交换机.存储.小型机等设备进行维护,主要工作职责主要分为两种: 对网络系统中的网络设备(路 ...

  6. mvc Filters 过滤器

    项目需要控制controller和action的访问权限. 看了下资料,发觉还是很方便的. 首先在mvc项目下创建一个文件夹 Filters, 然后在Filters中创建一个类.代码如下 namesp ...

  7. MVC DropDownList

    最近发现一个 MVC中绑定前台DropDownList , 并且设置默认选中项的简单方法. 直接上代码 方案一 Action:  ViewData["goodsTypeList"] ...

  8. (未完成...)Python3网络爬虫(2):利用urllib.urlopen向有道翻译发送数据并获得翻译结果

    环境: 火狐浏览器 pycharm2017.3.3 python3.5 1.url不仅可以是一个字符串,例如:http://www.baidu.com.url也可以是一个Request对象,这就需要我 ...

  9. BAI度 内部资料!Python_Threads多线程

    基本介绍 runable运行sleeping等待dead销毁(run方法执行完成或执行时抛出异常) 类继承threading.Thread线程的状态 函数介绍 在__init__里调用threadin ...

  10. BZOJ 3612: [Heoi2014]平衡

    3612: [Heoi2014]平衡 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 283  Solved: 219[Submit][Status][ ...