数组
基础数组
- 声明和创建 ``` //声明 int[] arr; int arr[];
//创建 new int[10];
// 声明和创建 int[] arr = new int[10]; String[] names = new String[10];
//不使用new关键字也可以创建数组 初始化数组 int[] a = {1,2,3,4,5}; String[] names = {“John”,”kobe”,”James”};
2. 迭代数组
// array.length 循环 for(int i=0;i<arr.length;i++){ System.out.println(arr[i]) }
// for-each 循环 for (int i : arr) { System.out.println(i); }
## java.util.Arrays类
Arrays工具类,提供了操作数组的一系列静态方法,下表显示了它的一些方法。<br />![EBhBcj](https://cdn.jsdelivr.net/gh/Flionay/pic_bed@master/Upic/202106/EBhBcj.png)
# 集合框架
集合是集中存放其他对象的一个对象,集合也称为容器,它提供存储,检索和操作其元素的方法。位于`java`的`util`包中。<br />**为什么使用集合框架?**数组缺乏快速开发应用程序所需的灵活性,例如数组不能改变大小,而且数组除了下标无法键值对查询数据。<br />`Java`集合框架的体系结构:<br />![集合框架](https://cdn.jsdelivr.net/gh/Flionay/pic_bed@master/Upic/202106/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6.png)<br />浅绿色表示接口,蓝色为具体实现类。<br />区分`Collection`和`Collections`,它们是完全不同的东西。`Collection`是一个接口,而`Collections`是`Java`提供的一个操作 `Set`、`List` 和 `Map` 等集合的工具类。`Collections` 类提供了许多操作集合的静态方法,借助这些静态方法可以实现集合元素的排序、查找替换和复制等操作。<br />`Collection` 接口存储一组不唯一,无序的对象。<br />`List`存储不唯一,有序。`Set`唯一,无序。`Map`存储一组键值对,提供`key`到`value`的映射。
## ArrayList
arraylist实现了可变长度的数组。在内存中分配连续的空间,**遍历**元素和**随机访问**元素的效率比较高。
/ 新闻管理系统 可以存储各类新闻标题(ID,名称,创建者) 可以获取标题数量 可以逐条打印每条新闻的标题 /
public class NewsTitle{ private int id; private String title; private String author;
public NewsTitle(){}
public NewsTitle(int id, String title, String author){
this.id = id;
this.author = author;
this.title = title;
}
public int getId() {
return id;
}
public String getAuthor() {
return author;
}
public String getTitle() {
return title;
}
public void setAuthor(String author) {
this.author = author;
}
public void setId(int id) {
this.id = id;
}
public void setTitle(String title) {
this.title = title;
}
}
```
import java.util.ArrayList;
public class NewsMgr {
public static void main(String[] args) {
NewsTitle title1 = new NewsTitle(1,"北京热门-长城","xx1");
NewsTitle title2 = new NewsTitle(2,"北京热门-故宫","xx1");
NewsTitle title3 = new NewsTitle(3,"北京热门-颐和园","xx1");
NewsTitle title4 = new NewsTitle(4,"北京热门-天安门","xx1");
NewsTitle title5 = new NewsTitle(5,"北京热门-天坛","xx1");
ArrayList list = new ArrayList();
list.add(title1);
list.add(title2);
list.add(title3);
list.add(title4);
list.add(title5);
//获取新闻标题的总数
// ArrayList size() 等同于 数组的length属性
System.out.println("新闻标题共有"+list.size()+"条");
// 逐条打印
for (int i = 0; i < list.size(); i++) {
NewsTitle obj = (NewsTitle) list.get(i); //等同于数组的 [i] 索引
System.out.println(obj.getTitle());
}
System.out.println("=========");
for (Object obj:list){
NewsTitle news = (NewsTitle)obj;
System.out.println(news.getTitle());
}
System.out.println("==========");
list.remove(title2);
System.out.println(list.contains(title2));
// add() size() contains() remove() 是Collection接口的通用方法
//常用的方法还有 clear() isEmpty() iterator() toArray()
System.out.println(list.isEmpty());
list.clear();
System.out.println(list.isEmpty());
}
}
add()
size()
contains()
remove()
是Collection
接口的通用方法
常用的方法还有clear()
isEmpty()
iterator()`` toArray()
等。
LinkedList
LinkedList采用链表(不是下标,指向型)存储方式,插入、删除元素的效率比较高。不是连续存放。
import java.util.LinkedList;
public class NewsMgr {
public static void main(String[] args) {
NewsTitle title1 = new NewsTitle(1,"北京热门-长城","xx1");
NewsTitle title2 = new NewsTitle(2,"北京热门-故宫","xx1");
NewsTitle title3 = new NewsTitle(3,"北京热门-颐和园","xx1");
NewsTitle title4 = new NewsTitle(4,"北京热门-天安门","xx1");
NewsTitle title5 = new NewsTitle(5,"北京热门-天坛","xx1");
LinkedList list = new LinkedList();
list.add(title1);
list.add(title2);
list.add(title3);
list.add(title4);
list.add(title5);
NewsTitle title6 = new NewsTitle(6,"北京热门-国家博物馆","xx1");
list.addFirst(title6);
System.out.println("新闻标题共有"+list.size()+"条");
for (Object obj : list) {
NewsTitle ob = (NewsTitle) obj;
System.out.println(ob.getTitle());
}
// 获取头条和最后的新闻
NewsTitle titleFirst = (NewsTitle) list.getFirst();
System.out.println("第一条新闻: "+titleFirst.getTitle());
NewsTitle titleLast= (NewsTitle) list.getLast();
System.out.println("最后一条新闻: "+titleLast.getTitle());
list.removeLast();
NewsTitle titleLast1= (NewsTitle) list.getLast();
System.out.println("最后一条新闻: "+titleLast1.getTitle());
}
}
Set
import java.util.HashSet;
public class NewsMgr {
public static void main(String[] args) {
NewsTitle title1 = new NewsTitle(1,"北京热门-长城","xx1");
NewsTitle title2 = new NewsTitle(2,"北京热门-故宫","xx1");
NewsTitle title3 = new NewsTitle(3,"北京热门-颐和园","xx1");
NewsTitle title4 = new NewsTitle(4,"北京热门-天安门","xx1");
NewsTitle title5 = new NewsTitle(5,"北京热门-天坛","xx1");
HashSet set = new HashSet();
set.add(title1);
set.add(title2);
set.add(title3);
set.add(title4);
set.add(title5);
System.out.println(set.size());
// 乱序 没有get方法
for (Object obj : set) {
NewsTitle news = (NewsTitle) obj;
System.out.println(news.getTitle());
}
}
}
HashMap
hashmap
和Treemap
属于Map
接口,而map
接口与Collection
接口属于并列关系。
所以HashMap
和TreeMap
与Collection
集合框架接口没有继承关系。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class ContryInfo {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("China","中国");
map.put("USA","美国");
map.put("Japan","日本");
map.put("Italy","意大利");
map.put("Koera","韩国");
System.out.println(map.size());
// 返回是object 需要一个强制类型转换
String contry = (String) map.get("Italy");
System.out.println(contry);
System.out.println(map.keySet());
System.out.println(map.containsKey("Australia"));
if (map.containsKey("USA")) {
map.remove("USA");
}
// 遍历一
Set keyss = map.keySet();
Iterator keys = keyss.iterator();
while(keys.hasNext()){
String value = (String) map.get(keys.next());
System.out.println(value);
}
System.out.println("===================");
//遍历二
for (Object obj : keyss) {
String value = (String) map.get(obj);
System.out.println(value);
}
//遍历三
System.out.println("=================");
Set items = map.entrySet();
for (Object obj : items) {
// item是键值对 它属于Map.entry类型
Map.Entry item = (Map.Entry) obj;
System.out.println("("+item.getKey()+","+item.getValue()+")");
// System.out.println(item.getValue());
}
}
}
泛型
作用:
上面我们学习的collection接口几个实现类HashMap或者ArrayList linkedlist等它们的get方法等获取出来的类型都是object类型,我们需要进行一个强制类型转换。
强制类型转换容易出现一些问题。所以JDK5之后增加了一个非常具有安全性和稳定性的特性——泛型。避免了一些类型转换的问题。
ArrayList<String> strList = new ArrayList<String>();
import java.util.LinkedList;
public class NewsMgr {
public static void main(String[] args) {
NewsTitle title1 = new NewsTitle(1,"北京热门-长城","xx1");
NewsTitle title2 = new NewsTitle(2,"北京热门-故宫","xx1");
NewsTitle title3 = new NewsTitle(3,"北京热门-颐和园","xx1");
NewsTitle title4 = new NewsTitle(4,"北京热门-天安门","xx1");
NewsTitle title5 = new NewsTitle(5,"北京热门-天坛","xx1");
// 泛型
LinkedList<NewsTitle> list = new LinkedList<NewsTitle>();
list.add(title1);
list.add(title2);
list.add(title3);
list.add(title4);
list.add(title5);
NewsTitle title6 = new NewsTitle(6,"北京热门-国家博物馆","xx1");
list.addFirst(title6);
System.out.println("新闻标题共有"+list.size()+"条");
for (NewsTitle obj : list) { //返回类型即为NewsTitle
// NewsTitle ob = (NewsTitle) obj;
System.out.println(obj.getTitle());
}
//泛型 获取头天新闻
String titleFirst = list.getFirst().getTitle();
System.out.println("第一条新闻: "+titleFirst);
// // 获取头条新闻
// NewsTitle titleFirst = (NewsTitle) list.getFirst();
// System.out.println("第一条新闻: "+titleFirst.getTitle());
}
}
Map<String,String> conntry = new HashMap<String,String>();
type argument cannot be of primitive type,类型参数不能是原始数据类型,List会报错,该使用封装类型的地方使用了原始数据类型
但可以改成List list = new ArrayList();
调用时list[0]显示Integer类型,但list.get(0)就是int类型
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。比如:Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类,常见的原始与对应的封装类如下:
| 原始类型 | 封装类 | | —- | —- |
| boolean | Boolean |
| char | Character |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
Collections类
作用和常用方法:提供了一些算法实现的工具类,常用静态方法如排序,查找,最大最小值,反转元素顺序等。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a1");
list.add("a2");
List<Integer>list2 = new ArrayList<Integer>();
list2.add(2);
list2.add(3);
list2.add(15);
list2.add(10);
System.out.println("====================");
// 遍历
for (Integer i : list2) {
System.out.println(i);
}
//排序
Collections.sort(list2);
Collections.reverse(list2);
System.out.println("====================");
for (Integer i : list2) {
System.out.println(i);
}
System.out.println("====================");
// 最大最小
System.out.println(Collections.max(list2));
System.out.println(Collections.min(list2));
System.out.println("====================");
// 指定元素
System.out.println(Collections.binarySearch(list2,3));
}
}
Collections 对自定义类排序
直接用Collections的sort方法肯定是不行的,因为它不知道用什么规则进行排序。
这时需要我们在类中自定义排序规则,首先需要实现Comparable
接口,然后重写compareTo()
方法。以上文所用的NewsTitle
为例:
package com.collection.arraylist;
public class NewsTitle implements Comparable{
private int id;
private String title;
private String author;
public NewsTitle(){}
public NewsTitle(int id, String title, String author){
this.id = id;
this.author = author;
this.title = title;
}
// get - set 方法省略
// 重写方法,定义新闻类的比较规则,根据id进行比较
// 比较对象,当前新闻对象 和 object比
@Override
public int compareTo(Object o) {
NewsTitle news = (NewsTitle) o;
if(this.id==news.id){
return 0;
}else if(this.id>news.id){
return 1;
}else{
return -1;
}
}
}
package com.collection.collections;
import com.collection.arraylist.NewsTitle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test02 {
public static void main(String[] args) {
List<NewsTitle> list = new ArrayList<NewsTitle>();
NewsTitle new1 = new NewsTitle(1,"天安门1","author");
NewsTitle new2 = new NewsTitle(7,"天安门7","author");
NewsTitle new3 = new NewsTitle(3,"天安门3","author");
NewsTitle new4 = new NewsTitle(5,"天安门5","author");
list.add(new1);
list.add(new2);
list.add(new4);
list.add(new3);
// 遍历
for (NewsTitle newsTitle : list) {
System.out.println(newsTitle.getTitle());
}
System.out.println("===============");
// 要想对自定义类进行排序,需要重写类的比较规则 compareable
Collections.sort(list);
for (NewsTitle newsTitle : list) {
System.out.println(newsTitle.getTitle());
}
}
}
天安门1
天安门7
天安门5
天安门3
===============
天安门1
天安门3
天安门5
天安门7
Process finished with exit code 0