数组
基础数组
- 声明和创建 ``` //声明 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 /># 集合框架集合是集中存放其他对象的一个对象,集合也称为容器,它提供存储,检索和操作其元素的方法。位于`java`的`util`包中。<br />**为什么使用集合框架?**数组缺乏快速开发应用程序所需的灵活性,例如数组不能改变大小,而且数组除了下标无法键值对查询数据。<br />`Java`集合框架的体系结构:<br /><br />浅绿色表示接口,蓝色为具体实现类。<br />区分`Collection`和`Collections`,它们是完全不同的东西。`Collection`是一个接口,而`Collections`是`Java`提供的一个操作 `Set`、`List` 和 `Map` 等集合的工具类。`Collections` 类提供了许多操作集合的静态方法,借助这些静态方法可以实现集合元素的排序、查找替换和复制等操作。<br />`Collection` 接口存储一组不唯一,无序的对象。<br />`List`存储不唯一,有序。`Set`唯一,无序。`Map`存储一组键值对,提供`key`到`value`的映射。## ArrayListarraylist实现了可变长度的数组。在内存中分配连续的空间,**遍历**元素和**随机访问**元素的效率比较高。
/ 新闻管理系统 可以存储各类新闻标题(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比@Overridepublic 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("===============");// 要想对自定义类进行排序,需要重写类的比较规则 compareableCollections.sort(list);for (NewsTitle newsTitle : list) {System.out.println(newsTitle.getTitle());}}}
天安门1天安门7天安门5天安门3===============天安门1天安门3天安门5天安门7Process finished with exit code 0
