Java SE 修炼手册之数据类型和集合
这篇博文来聊聊 Java 基础中数据类型和集合的那些事。
在虚拟的网络世界中,流传着这么一句话: 程序= 数据结构+ 算法 。
1. 数据结构和集合
作为初学者的我们也许会好奇到底什么是数据结构呢?
提起数据结构,学过数学的都知道,一个集合由许多个元素组成。
如果一个集合中由多个数字组成,那么在我们的脑海中潜意识可能会出现这样的图:
为了用计算机语言描述这样的集合(数据结构),在java中是这样描述的:
int[] a={0,1,2,3,4,5,6,7,8,9};
再比如,一个集合中由A,B,C,D,E,F,G多个字符串元素组成,那么在我们的脑海中潜意识可能会出现这样的图:
String[] myStringArray={"A","B","C","D","E","F","G"};
综上可以发现,一个集合中的元素可能由不同的数据类型组成。
为了更好地使用和描述这些集合,Java将具有不同类型元素和集合(数据结构是集合的表现形式)都封装成了各种各样的对象。
2. Java中的基本数据类型和包装类型
Java中有8种基本数据类型,如下表所示:
类型名称 | 默认值 | 大小 | 包装类 | 缓存区间 |
---|---|---|---|---|
boolean | false | 1B | Boolean | 无 |
byte | (byte)0 | 1B | Byte | -128~127 |
char | ‘\u0000’ | 2B | Char | (char)0~(char)127 |
short | (short)0 | 2B | Short | -128~127 |
int | 0 | 4B | Integer | -128~127 |
long | 0L | 8B | Long | -128~127 |
float | 0.0f | 4B | Float | 无 |
double | 0.0d | 8B | Double | 无 |
- 集合中不同类型的元素使用不同的基本类型来表示
- 各种不同的数据类型代表不同的数据结构。
3. Java中的数组
关于Array(数组)我们需要知道的几点:
- 数组是一种顺序表
- 数组的下标从0开始
- 数组的容量大小是固定的
如果需要动态大小的数组,则可以使用Java提供的 Vector 和ArrayList
集合类。
Vector 是线程安全的,但是性能较差,基本弃用。
3.1 数组的静态初始化
代码示例如下:
public class MainTest {
public static void main(String[] args) {
String[] myStringArray={"A","B","C","D","E","F","G"};
}
}
3.2 数组的动态初始化
代码示例如下:
public class MainTest {
public static void main(String[] args) {
String[] myStringArray=new String[7];
myStringArray[0]="A";
myStringArray[1]="B";
myStringArray[2]="C";
myStringArray[3]="D";
myStringArray[4]="E";
myStringArray[5]="F";
myStringArray[6]="G";
}
}
3.3 数组的遍历
3.3.1 for i 循环遍历
如果需要使用数组下标可以使用for (int i = 0; i < myStringArray.length; i++) 的方式
代码示例如下:
public class MainTest {
public static void main(String[] args) {
String[] myStringArray={"A","B","C","D","E","F","G"};
for (int i = 0; i < myStringArray.length; i++) {
System.out.println(myStringArray[i]);
}
}
}
注意数组中
length
是数组对象的一个属性而不是方法。
输出内容如下:
A
B
C
D
E
F
G
3.3.2 foreach循环遍历
数组的遍历优先推荐JDK5引进的foreach方式,即,for(元素:数组名)的方式,可以在 不使用游标的情况下遍历数组。
代码示例如下:
public class MainTest {
public static void main(String[] args) {
String[] myStringArray={"A","B","C","D","E","F","G"};
for (String s:myStringArray
) {
System.out.println(s);
}
}
}
输出内容如下:
A
B
C
D
E
F
G
3.3.3 JDK 8 函数式接口 forEach 循环遍历
代码示例如下:
public class MainTest {
public static void main(String[] args) {
String[] myStringArray={"A","B","C","D","E","F","G"};
Arrays.stream(myStringArray).forEach(System.out::println);
}
}
输出内容如下:
A
B
C
D
E
F
G
3.3.4 JDK 8 函数式接口 forEachOrdered 循环遍历
代码示例如下:
public class MainTest {
public static void main(String[] args) {
String[] myStringArray={"A","B","C","D","E","F","G"};
Arrays.stream(myStringArray).forEachOrdered(System.out::println);
}
}
输出内容如下:
A
B
C
D
E
F
G
3.4 数组工具类 Arrays
Arrays
是Java JDK 提供的一个针对数组对象进行操作的工具类,包括数组的排序,查找,对比,拷贝等操作。
尤其是排序,JDK版本演进中,排序性能得到了很大的提高,早期的归并排序算法优化成了Timsort排序算法。
另外,我们也可以通过这个工具类将数组转换成集合。
3.4.1 数组转集合
数组转集合,代码示例如下:
import java.util.Arrays;
import java.util.List;
/**
* @author 星云
*/
public class MainTest {
public static void main(String[] args) {
String[] myStringArray={"A","B","C","D","E","F","G"};
List<String> stringList= Arrays.asList(myStringArray);
}
}
Arrays.asList 体现的是适配器模式,后台数据仍是原有数组
3.4.2 集合转数组
代码示例如下:
import java.util.ArrayList;
import java.util.List;
/**
* @author 星云
*/
public class MainTest {
public static void main(String[] args) {
List<String> myStringList=new ArrayList<>(7);
myStringList.add("A");
myStringList.add("B");
myStringList.add("C");
myStringList.add("D");
myStringList.add("E");
myStringList.add("F");
myStringList.add("G");
String[] myStringArray=myStringList.toArray(new String[myStringList.size()]);
}
}
3.4.3 数组的复制
数组之间进行复制,使用方法示例如下:
import java.util.Arrays;
/**
* @author 星云
*/
public class MainTest {
public static void main(String[] args) {
String[] myStringArray={"A","B","C","D","E","F","G"};
String[] currentStringArray= Arrays.copyOf(myStringArray,myStringArray.length);
}
}
4. Java中的集合
数组和集合都是用来存储对象的容器。
如果需要动态大小的数组,则可以使用Java提供的 Vector 和ArrayList集合类。
Vector 是线程安全的,但是性能较差,基本弃用。
Java中集合主要分为如下四大类型:
- List
- ArrayList 插入删除 慢,随机访问快
- LinkedList 插入删除快,随机访问慢
- Map
- HashMap(线程不安全)
- ConcurrentHashMap(线程安全)
- TreeMap (Key有序)
- Set
- HashSet
- TreeSet
- LinkedHashSet
- Queue
- BlockingQueue (阻塞队列)