数组

基础数组

  1. 声明和创建 ``` //声明 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”};

  1. 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); }

  1. ## java.util.Arrays类
  2. Arrays工具类,提供了操作数组的一系列静态方法,下表显示了它的一些方法。<br />![EBhBcj](https://cdn.jsdelivr.net/gh/Flionay/pic_bed@master/Upic/202106/EBhBcj.png)
  3. # 集合框架
  4. 集合是集中存放其他对象的一个对象,集合也称为容器,它提供存储,检索和操作其元素的方法。位于`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`的映射。
  5. ## ArrayList
  6. arraylist实现了可变长度的数组。在内存中分配连续的空间,**遍历**元素和**随机访问**元素的效率比较高。

/ 新闻管理系统 可以存储各类新闻标题(ID,名称,创建者) 可以获取标题数量 可以逐条打印每条新闻的标题 /

public class NewsTitle{ private int id; private String title; private String author;

  1. public NewsTitle(){}
  2. public NewsTitle(int id, String title, String author){
  3. this.id = id;
  4. this.author = author;
  5. this.title = title;
  6. }
  7. public int getId() {
  8. return id;
  9. }
  10. public String getAuthor() {
  11. return author;
  12. }
  13. public String getTitle() {
  14. return title;
  15. }
  16. public void setAuthor(String author) {
  17. this.author = author;
  18. }
  19. public void setId(int id) {
  20. this.id = id;
  21. }
  22. public void setTitle(String title) {
  23. this.title = title;
  24. }

}

  1. ```
  2. import java.util.ArrayList;
  3. public class NewsMgr {
  4. public static void main(String[] args) {
  5. NewsTitle title1 = new NewsTitle(1,"北京热门-长城","xx1");
  6. NewsTitle title2 = new NewsTitle(2,"北京热门-故宫","xx1");
  7. NewsTitle title3 = new NewsTitle(3,"北京热门-颐和园","xx1");
  8. NewsTitle title4 = new NewsTitle(4,"北京热门-天安门","xx1");
  9. NewsTitle title5 = new NewsTitle(5,"北京热门-天坛","xx1");
  10. ArrayList list = new ArrayList();
  11. list.add(title1);
  12. list.add(title2);
  13. list.add(title3);
  14. list.add(title4);
  15. list.add(title5);
  16. //获取新闻标题的总数
  17. // ArrayList size() 等同于 数组的length属性
  18. System.out.println("新闻标题共有"+list.size()+"条");
  19. // 逐条打印
  20. for (int i = 0; i < list.size(); i++) {
  21. NewsTitle obj = (NewsTitle) list.get(i); //等同于数组的 [i] 索引
  22. System.out.println(obj.getTitle());
  23. }
  24. System.out.println("=========");
  25. for (Object obj:list){
  26. NewsTitle news = (NewsTitle)obj;
  27. System.out.println(news.getTitle());
  28. }
  29. System.out.println("==========");
  30. list.remove(title2);
  31. System.out.println(list.contains(title2));
  32. // add() size() contains() remove() 是Collection接口的通用方法
  33. //常用的方法还有 clear() isEmpty() iterator() toArray()
  34. System.out.println(list.isEmpty());
  35. list.clear();
  36. System.out.println(list.isEmpty());
  37. }
  38. }

add() size() contains() remove()Collection接口的通用方法
常用的方法还有clear() isEmpty() iterator()`` toArray()等。

LinkedList

LinkedList采用链表(不是下标,指向型)存储方式,插入删除元素的效率比较高。不是连续存放。
image-20210627172812423

  1. import java.util.LinkedList;
  2. public class NewsMgr {
  3. public static void main(String[] args) {
  4. NewsTitle title1 = new NewsTitle(1,"北京热门-长城","xx1");
  5. NewsTitle title2 = new NewsTitle(2,"北京热门-故宫","xx1");
  6. NewsTitle title3 = new NewsTitle(3,"北京热门-颐和园","xx1");
  7. NewsTitle title4 = new NewsTitle(4,"北京热门-天安门","xx1");
  8. NewsTitle title5 = new NewsTitle(5,"北京热门-天坛","xx1");
  9. LinkedList list = new LinkedList();
  10. list.add(title1);
  11. list.add(title2);
  12. list.add(title3);
  13. list.add(title4);
  14. list.add(title5);
  15. NewsTitle title6 = new NewsTitle(6,"北京热门-国家博物馆","xx1");
  16. list.addFirst(title6);
  17. System.out.println("新闻标题共有"+list.size()+"条");
  18. for (Object obj : list) {
  19. NewsTitle ob = (NewsTitle) obj;
  20. System.out.println(ob.getTitle());
  21. }
  22. // 获取头条和最后的新闻
  23. NewsTitle titleFirst = (NewsTitle) list.getFirst();
  24. System.out.println("第一条新闻: "+titleFirst.getTitle());
  25. NewsTitle titleLast= (NewsTitle) list.getLast();
  26. System.out.println("最后一条新闻: "+titleLast.getTitle());
  27. list.removeLast();
  28. NewsTitle titleLast1= (NewsTitle) list.getLast();
  29. System.out.println("最后一条新闻: "+titleLast1.getTitle());
  30. }
  31. }

Set

image-20210627190546395

  1. import java.util.HashSet;
  2. public class NewsMgr {
  3. public static void main(String[] args) {
  4. NewsTitle title1 = new NewsTitle(1,"北京热门-长城","xx1");
  5. NewsTitle title2 = new NewsTitle(2,"北京热门-故宫","xx1");
  6. NewsTitle title3 = new NewsTitle(3,"北京热门-颐和园","xx1");
  7. NewsTitle title4 = new NewsTitle(4,"北京热门-天安门","xx1");
  8. NewsTitle title5 = new NewsTitle(5,"北京热门-天坛","xx1");
  9. HashSet set = new HashSet();
  10. set.add(title1);
  11. set.add(title2);
  12. set.add(title3);
  13. set.add(title4);
  14. set.add(title5);
  15. System.out.println(set.size());
  16. // 乱序 没有get方法
  17. for (Object obj : set) {
  18. NewsTitle news = (NewsTitle) obj;
  19. System.out.println(news.getTitle());
  20. }
  21. }
  22. }

HashMap

hashmapTreemap属于Map接口,而map接口与Collection接口属于并列关系。
所以HashMapTreeMapCollection集合框架接口没有继承关系。

  1. import java.util.HashMap;
  2. import java.util.Iterator;
  3. import java.util.Map;
  4. import java.util.Set;
  5. public class ContryInfo {
  6. public static void main(String[] args) {
  7. HashMap map = new HashMap();
  8. map.put("China","中国");
  9. map.put("USA","美国");
  10. map.put("Japan","日本");
  11. map.put("Italy","意大利");
  12. map.put("Koera","韩国");
  13. System.out.println(map.size());
  14. // 返回是object 需要一个强制类型转换
  15. String contry = (String) map.get("Italy");
  16. System.out.println(contry);
  17. System.out.println(map.keySet());
  18. System.out.println(map.containsKey("Australia"));
  19. if (map.containsKey("USA")) {
  20. map.remove("USA");
  21. }
  22. // 遍历一
  23. Set keyss = map.keySet();
  24. Iterator keys = keyss.iterator();
  25. while(keys.hasNext()){
  26. String value = (String) map.get(keys.next());
  27. System.out.println(value);
  28. }
  29. System.out.println("===================");
  30. //遍历二
  31. for (Object obj : keyss) {
  32. String value = (String) map.get(obj);
  33. System.out.println(value);
  34. }
  35. //遍历三
  36. System.out.println("=================");
  37. Set items = map.entrySet();
  38. for (Object obj : items) {
  39. // item是键值对 它属于Map.entry类型
  40. Map.Entry item = (Map.Entry) obj;
  41. System.out.println("("+item.getKey()+","+item.getValue()+")");
  42. // System.out.println(item.getValue());
  43. }
  44. }
  45. }

泛型

作用:
上面我们学习的collection接口几个实现类HashMap或者ArrayList linkedlist等它们的get方法等获取出来的类型都是object类型,我们需要进行一个强制类型转换。
强制类型转换容易出现一些问题。所以JDK5之后增加了一个非常具有安全性和稳定性的特性——泛型。避免了一些类型转换的问题。

  1. ArrayList<String> strList = new ArrayList<String>();
  1. import java.util.LinkedList;
  2. public class NewsMgr {
  3. public static void main(String[] args) {
  4. NewsTitle title1 = new NewsTitle(1,"北京热门-长城","xx1");
  5. NewsTitle title2 = new NewsTitle(2,"北京热门-故宫","xx1");
  6. NewsTitle title3 = new NewsTitle(3,"北京热门-颐和园","xx1");
  7. NewsTitle title4 = new NewsTitle(4,"北京热门-天安门","xx1");
  8. NewsTitle title5 = new NewsTitle(5,"北京热门-天坛","xx1");
  9. // 泛型
  10. LinkedList<NewsTitle> list = new LinkedList<NewsTitle>();
  11. list.add(title1);
  12. list.add(title2);
  13. list.add(title3);
  14. list.add(title4);
  15. list.add(title5);
  16. NewsTitle title6 = new NewsTitle(6,"北京热门-国家博物馆","xx1");
  17. list.addFirst(title6);
  18. System.out.println("新闻标题共有"+list.size()+"条");
  19. for (NewsTitle obj : list) { //返回类型即为NewsTitle
  20. // NewsTitle ob = (NewsTitle) obj;
  21. System.out.println(obj.getTitle());
  22. }
  23. //泛型 获取头天新闻
  24. String titleFirst = list.getFirst().getTitle();
  25. System.out.println("第一条新闻: "+titleFirst);
  26. // // 获取头条新闻
  27. // NewsTitle titleFirst = (NewsTitle) list.getFirst();
  28. // System.out.println("第一条新闻: "+titleFirst.getTitle());
  29. }
  30. }
  1. 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类

作用和常用方法:提供了一些算法实现的工具类,常用静态方法如排序,查找,最大最小值,反转元素顺序等。

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. public class Test01 {
  5. public static void main(String[] args) {
  6. List<String> list = new ArrayList<String>();
  7. list.add("a1");
  8. list.add("a2");
  9. List<Integer>list2 = new ArrayList<Integer>();
  10. list2.add(2);
  11. list2.add(3);
  12. list2.add(15);
  13. list2.add(10);
  14. System.out.println("====================");
  15. // 遍历
  16. for (Integer i : list2) {
  17. System.out.println(i);
  18. }
  19. //排序
  20. Collections.sort(list2);
  21. Collections.reverse(list2);
  22. System.out.println("====================");
  23. for (Integer i : list2) {
  24. System.out.println(i);
  25. }
  26. System.out.println("====================");
  27. // 最大最小
  28. System.out.println(Collections.max(list2));
  29. System.out.println(Collections.min(list2));
  30. System.out.println("====================");
  31. // 指定元素
  32. System.out.println(Collections.binarySearch(list2,3));
  33. }
  34. }

Collections 对自定义类排序

直接用Collections的sort方法肯定是不行的,因为它不知道用什么规则进行排序。
这时需要我们在类中自定义排序规则,首先需要实现Comparable接口,然后重写compareTo()方法。以上文所用的NewsTitle为例:

  1. package com.collection.arraylist;
  2. public class NewsTitle implements Comparable{
  3. private int id;
  4. private String title;
  5. private String author;
  6. public NewsTitle(){}
  7. public NewsTitle(int id, String title, String author){
  8. this.id = id;
  9. this.author = author;
  10. this.title = title;
  11. }
  12. // get - set 方法省略
  13. // 重写方法,定义新闻类的比较规则,根据id进行比较
  14. // 比较对象,当前新闻对象 和 object比
  15. @Override
  16. public int compareTo(Object o) {
  17. NewsTitle news = (NewsTitle) o;
  18. if(this.id==news.id){
  19. return 0;
  20. }else if(this.id>news.id){
  21. return 1;
  22. }else{
  23. return -1;
  24. }
  25. }
  26. }
  1. package com.collection.collections;
  2. import com.collection.arraylist.NewsTitle;
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6. public class Test02 {
  7. public static void main(String[] args) {
  8. List<NewsTitle> list = new ArrayList<NewsTitle>();
  9. NewsTitle new1 = new NewsTitle(1,"天安门1","author");
  10. NewsTitle new2 = new NewsTitle(7,"天安门7","author");
  11. NewsTitle new3 = new NewsTitle(3,"天安门3","author");
  12. NewsTitle new4 = new NewsTitle(5,"天安门5","author");
  13. list.add(new1);
  14. list.add(new2);
  15. list.add(new4);
  16. list.add(new3);
  17. // 遍历
  18. for (NewsTitle newsTitle : list) {
  19. System.out.println(newsTitle.getTitle());
  20. }
  21. System.out.println("===============");
  22. // 要想对自定义类进行排序,需要重写类的比较规则 compareable
  23. Collections.sort(list);
  24. for (NewsTitle newsTitle : list) {
  25. System.out.println(newsTitle.getTitle());
  26. }
  27. }
  28. }
  1. 天安门1
  2. 天安门7
  3. 天安门5
  4. 天安门3
  5. ===============
  6. 天安门1
  7. 天安门3
  8. 天安门5
  9. 天安门7
  10. Process finished with exit code 0