〇、Java 基本类型。
今天一个同学问我,Java 基本类型 int 类型是 4 个字节 ? char 呢 ?
Java 有两大基本类型:基本数据类型和引用数据类型
- 基本数据类型(8 种,四整两浮一符一布):默认的整型是 int ,默认的浮点型是 double。
对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。
- 引用数据类型(除去上述基本类型的包装类以外,还有由类的构造函数创建,可以使用它们访问所引用的对象。):对象、数组都是引用数据类型,引用数据类型的默认值都是 null 。
需要注意缓存。
- Boolean(全部缓存)
- Byte(全部缓存)
- Integer(-128 — 127 缓存)
- Short(-128 — 127 缓存)
- Long(-128 — 127 缓存)
- Character(<= 127缓存)
- Float(没有缓存)
- Doulbe(没有缓存)
一、Java 数组
Java 语言中提供的数组是用来存储固定大小的同类型元素。
Java语言使用new操作符来创建数组,语法如下:(详细内容请查看菜鸟教程)
arrayRefVar = new dataType[arraySize];
上面语句做了两件事:1、使用 dataType[arraySize] 创建了一个数组。
2、把新创建的数组的引用赋值给变量 arrayRefVar。
- 创建和声明同时 :
dataType[] arrayRefVar = new dataType[arraySize];
- 声明时,直接填充内容:
dataType[] arrayRefVar = {value0, value1, ..., valuek};
数组转集合( Arrays.asList(array) ),集合转数组( list.toArray() )。
- 数组转集合使用 Arrays 的 asList 方法,它将数组转化成一个List,可以用这个 List 构造Set。Set set = new HashSet(Arrays.asList(array));
- 集合转数组使用 toArray 方法,可以通过强转来得到目标数组。
array2 = (String[]) set.toArray(new String[set.size()]);( 将 list 中的内容放入参数数组中,当参数数组的长度小于 list 的元素个数时,会自动扩充数组的长度以适应 list 的长度,这条语句直接使用了集合的长度 )
需要注意的问题。
asList() 原始类型不能作为 Arrays.asList 方法的参数,否则会被当做一个参数。
查看源码:T 作为泛型的参数,而基本类型是不能够作为泛型参数的。
int[] list = {1,2,3,4};
List list = Arrays.asList(list);
System.out.println(list.size()); // 编辑器把 int[] 数组当做了一个引用的参数对象,输出值 1
- Arrays.asList(list) 返回的 ArrayList 是 Arrays 的静态内部私有类实现,继承了 AbstractList ,属于不可变结构,不是常用的那个 ArrayList ,只实现了size 、toArray、get、set、contains几个方法,具体请看源码【Ctrl + 点击方法名】。
下图中,不可变结构的 Arrays 的 ArrayList 通过构造放入真正的 ArrayList,就可以正常使用了。
- 集合的相等只在乎元素数据的比较,其中 equals 方法都是 AbstractList 中实现的,比较的依据是通过迭代器遍历元素挨个 equals 比较。
二、Java 集合
集合按照存储结构可以分为,单列集合 Collection 和 双列集合 Map 。
Collection :单列集合类的根接口,用于存储一系列符合某种规则的元素。
重要的两个子类 List 和 Set 。List 是有序可重复,接口主要实现类 ArrayList 和 LinkedList 。Set 是无序不能重复,接口主要实现类有 HashSet 和 TreeSet 。Map :双列集合类的根接口,用于存储具有键值(Key-Value)映射关系的元素。
可以通过指定的 Key 找到对应的 Value 。Map 的主要实现类有 HashMap 和 TreeMap 。
①、List 是有序可重复,接口主要实现类 ArrayList 和 LinkedList
ArrayList 集合
- Array 与 ArrayList 的区别。
①、Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。
②、Array 的大小是固定的,ArrayList 的大小是动态变化的,ArrayList 提供了更多的方法和特性,addAll()、removeAll()、iterator() 等方法。
LinkedList 集合
集合内部维护了一个双向循环链表,链表元素都使用引用的方式来记住它的前一个元素和后一个元素,从而将所有元素连接起来。
- 最基本的使用。
ArrayList 和 LinkedList 的区别。
主要区别:
- ArrayList 是实现了基于动态数组的数据结构,ArrayList 集合在查询元素的时候速度很快,但在增删元素时效率较低。因为 LinkedList 要移动指针。
- LinkedList 基于链表的数据结构,对于新增和删除操作 add 和 remove,LinedList 比较占优势,因为 ArrayList 要移动数据,而 linkedList 只需要改变引用的前后关系。
Iterator 接口(迭代器)
Iterator 主要用于迭代访问(即遍历)Collection 中的元素。
- Collection 集合遍历
- Map 集合遍历
②、Set 是无序不能重复,接口主要实现类有 HashSet 和 TreeSet
HashSet 集合
为保证 HashSet 正常操作,要求在存入对象时,重写 Object 类中的 hashCode() 和 equals() 方法。
add("Json") ,会先调用对象的 hashCode() 方法获取哈希值,通过哈希值确定存储地址,地址没对象直接存入,地址有对象则进行 equals() 方法进行判断,相等则舍弃,不等则覆盖。
在使用自定义对象的时候,一定要注意重写 hashCode() 与 equals() .
TreeSet 集合
③、Map 的实现类有 HashTable、HashMap 和 TreeMap
HashTable 集合
HashMap 集合
- 遍历集合的两种方式。
// 第一种:先遍历 Map 集合中的所有键,再根据键获取相应的值
Set keys = map.keySet(); // 获取键的集合
Iterator it = keys.iterators(); // 迭代键值
it.hasNext(); // 判断下一个元素是否有内容
it.next(); // 获取值
map.get(key); // 通过 key 获取 values 。
// 第二种:通过 values() 方法直接获取 Map 集合的所有值的 Collection 集合。
Collection values = map.values(); // 获取 map 存储的所有值。
TreeMap 集合
- TreeMap 的红黑树。
红黑树就是节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树二叉树而言我们必须增加如下规则:
1、每个节点都只能是红色或者黑色
2、根节点是黑色
3、每个叶节点(NIL节点,空节点)是黑色的。
4、如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
5、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
Properties 集合
- Java 读取 Properties 文件(注意文件路径)。
叁、Collections 集合工具类。
Collections 则是集合类的一个工具类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
- 对集合进行排序。
Collections.sort(Collection);
- 进行随机排序。
Collections.shuffle(Collection);
- 返回所查找元素的索引。
Collections.binarySearch(Collection,Object);
这里我采用了两种情况进行测试,已知存在和不存在的部分,但是出现如图所示的问题,查找存在和不存在的字符串都是 负数(表示不存在的意思。)
原因:Collections 的 binarySearch 方法的查找功能,但是要是用二分查找的 List 必须是有序的,也就是使用 Collections 中的 sort 方法进行自然排序。
补充内容:-1 不是判断不存在的唯一标准,Java 编程技巧 2019.05.19 第5条
- 替换批定元素为某元素,若要替换的值存在刚返回true,反之返回false。
Collections.replaceAll(List list,Object old,Object new);
- 反转集合中元素的顺序。
Collections.reverse() ;
- 集合中的元素向后移m个位置,在后面被遮盖的元素循环到前面来。
Collections.rotate(List list,int m)
- 集合 n 中的元素全部复制到 m 中,并且覆盖相应索引的元素。
Collections.copy(List m,List n);
- 交换集合中指定元素索引的位置。
Collections.swap(List list,int i,int j);
- 用对象 o
替换
集合 list 中的所有元素
。Collections.fill(List list,Object o);
- 返回大小为 n 的 List,List 不可改变,其中的所有引用都指向 o。
Collections.nCopies(int n,Object o);
- 返回集合中的最大最小值。
max();、min();