本笔记大部分内容来自:微学苑

数据类型以及变量

对于整型数据,通常情况下使用 int 类型。但如果表示投放广岛长崎的原子弹释放出的能量,就需要使用 long 类型了。byte 和 short 类型主要用于特定的应用场合,例如,底层的文件处理或者需要控制占用存储空间量的大数组。

八进制有一个前缀 0,例如 010 对应十进制中的 8;十六进制有一个前缀 0x,例如 0xCAFE;从 Java 7 开始,可以使用前缀 0b 来表示二进制数据,例如 0b1001 对应十进制中的 9。同样从 Java 7 开始,可以使用下划线来分隔数字,类似英文数字写法,例如 1_000_000 表示 1,000,000,也就是一百万。下划线只是为了让代码更加易读,编译器会删除这些下划线。

float 类型有效数字最长为 7 位,有效数字长度包括了整数部分和小数部分。
double 类型有效数字最长为 15 位。与 float 类型一样,double 后面也带有标志“D”或“d。
注意:不带任何标志的浮点型数据,系统默认是 double 类型。
大多数情况下都是用 double 类型,float 的精度很难满足需求。

print

Java中也有 printf() 语句,用来控制输出格式,不过实际开发中不常用,因为输出到控制台的数据很少要求严格的格式,一般println() 和 print() 就够了。

println() 输出内容后换行,print() 不换行。

数组

定义

Java 中定义数组的语法有两种:

int demoArray[];
int[] demoArray;

type 为Java中的任意数据类型,包括基本类型和组合类型,arrayName为数组名,必须是一个合法的标识符
与C、C++不同,Java在定义数组时并不为数组元素分配内存,因此[ ]中无需指定数组元素的个数,即数组长度。而且对于如上定义的一个数组是不能访问它的任何元素的,我们必须要为它分配内存空间,这时要用到运算符new,其格式如下:

    arrayName=new type[arraySize];

通常,

int demoArray[] = new int[3];

初始化

// 静态初始化
// 静态初始化的同时就为数组元素分配空间并赋值
int intArray[] = {1,2,3,4};
String stringArray[] = {"微学苑", "http://www.weixueyuan.net", "一切编程语言都是纸老虎"};
// 动态初始化
float floatArray[] = new float[3];
floatArray[0] = 1.0f;
floatArray[1] = 132.63f;
floatArray[2] = 100F;

遍历

int arrayDemo[] = {1, 2, 4, 7, 9, 192, 100};
for(int i=0,len=arrayDemo.length; i<len; i++){
    System.out.println(arrayDemo[i] + ", ");
} 

增强版Foreach:(类似python中的for x in …:)

int arrayDemo[] = {1, 2, 4, 7, 9, 192, 100};
for(int x: arrayDemo){
    System.out.println(x + ", ");
}

二维数组

Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。

总结

几点说明:

  • 上面讲的是静态数组。静态数组一旦被声明,它的容量就固定了,不容改变。所以在声明数组时,一定要考虑数组的最大容量,防止容量不够的现象。
  • 如果想在运行程序时改变容量,就需要用到数组列表(ArrayList,也称动态数组)或向量(Vector)。
  • 正是由于静态数组容量固定的缺点,实际开发中使用频率不高,被 ArrayList 或 Vector 代替,因为实际开发中经常需要向数组中添加或删除元素,而它的容量不好预估。

String

字符串可以通过“+”连接,基本数据类型与字符串进行“+”操作一般也会自动转换为字符串。

  • length() :返回字符串的长度。无论是字母、数字,还是汉字,每个字符的长度都是1。

  • charAt() :charAt() 方法的作用是按照索引值获得字符串中的指定字符。Java规定,字符串中第一个字符的索引值是0,第二个字符的索引值是1。

  • contains() : contains() 方法用来检测字符串是否包含某个子串

  • replace(): 字符串替换,用来替换字符串中所有指定的子串。注意:replace() 方法不会改变原来的字符串,而是生成一个新的字符串。

  • split():以指定字符串作为分隔符,对当前字符串进行分割,分割的结果是一个数组。

import java.util.*;
public class Demo {
    public static void main(String[] args){
        String str = "wei_xue_yuan_is_good";
        String strArr[] = str.split("_");
        System.out.println(Arrays.toString(strArr));
    }
}

运行结果:
[wei, xue, yuan, is, good]

StringBuffer

String 的值是不可变的,每次对String的操作都会生成新的String对象,不仅效率低,而且耗费大量内存空间。

StringBuffer类和String类一样,也用来表示字符串,但是StringBuffer的内部实现方式和String不同,在进行字符串处理时,不生成新的对象,在内存使用上要优于String。

StringBuffer 默认分配16字节长度的缓冲区,当字符串超过该大小时,会自动增加缓冲区长度,而不是生成新的对象。

StringBuffer不像String,只能通过 new 来创建对象,不支持简写方式,例如:
StringBuffer str1 = new StringBuffer(); // 分配16个字节长度的缓冲区
StringBuffer str2 = =new StringBuffer(512); // 分配512个字节长度的缓冲区
// 在缓冲区中存放了字符串,并在后面预留了16个字节长度的空缓冲区
StringBuffer str3 = new StringBuffer(“www.weixueyuan.net”);

StringBuffer类中的方法主要偏重于对于字符串的操作,例如追加、插入和删除等,这个也是StringBuffer类和String类的主要区别。实际开发中,如果需要对一个字符串进行频繁的修改,建议使用 StringBuffer。

  • append() :append() 方法用于向当前字符串的末尾追加内容,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:
    StringBuffer str = new StringBuffer(“biancheng100”);
    str.append(true);
    则对象str的值将变成”biancheng100true”。注意是str指向的内容变了,不是str的指向变了。
    字符串的”+“操作实际上也是先创建一个StringBuffer对象,然后调用append()方法将字符串片段拼接起来,最后调用toString()方法转换为字符串。
    这样看来,String的连接操作就比StringBuffer多出了一些附加操作,效率上必然会打折扣。
    但是,对于长度较小的字符串,”+“操作更加直观,更具可读性,有些时候可以稍微牺牲一下效率。

  • deleteCharAt():deleteCharAt() 方法用来删除指定位置的字符,并将剩余的字符形成新的字符串。例如:
    StringBuffer str = new StringBuffer(“abcdef”);
    str. deleteCharAt(3);
    该代码将会删除索引值为3的字符,即”d“字符。
    你也可以通过delete()方法一次性删除多个字符,例如:
    StringBuffer str = new StringBuffer(“abcdef”);
    str.delete(1, 4);
    该代码会删除索引值为1~4之间的字符,包括索引值1,但不包括4。

  • insert():insert() 用来在指定位置插入字符串,可以认为是append()的升级版。例如:
    StringBuffer str = new StringBuffer(“abcdef”);
    str.insert(3, “xyz”);
    最后str所指向的字符串为 abcdxyzef。

  • setCharAt() :setCharAt() 方法用来修改指定位置的字符。例如:

str.setCharAt(3, 'z');```该代码将把索引值为3的字符修改为 z,最后str所指向的字符串为 abczef。
### 效率对比

StringBuffer的执行效率比String快上千倍,这个差异随着叠加次数的增加越来越明显,当叠加次数达到30000次的时候,运行结果为:
String: 35923ms
StringBuffer: 8ms

所以,强烈建议在涉及大量字符串操作时使用StringBuffer。

## StringBuilder
StringBuilder类和StringBuffer类功能基本相似,方法也差不多,主要区别在于StringBuffer类的方法是多线程安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。
速度:
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。

**使用环境:**
操作少量的数据使用 String;
单线程操作大量数据使用 StringBuilder;
多线程操作大量数据使用 StringBuffer。