Java入门——(6)集合
1 public class Example01 {
2 public static void main(String[] args) {
3 ArrayList list = new ArrayList(); //创建ArrayList集合
4 list.add("stu1");
5 list.add("stu2");
6 list.add("stu3");
7 list.add("stu4");
8 System.out.println("集合的长度:"+list.size());//获得集合中元素的个数
9 System.out.println("集合的第二个元素:"+list.get(1));//取出并打印指定位置的元素
10 }
11 }
运行结果:
集合的长度:4
集合的第二个元素:stu2
1 public class Example02 {
2 public static void main(String[] args) {
3 LinkedList link = new LinkedList();//创建LinkedList集合
4 link.add("stu1");
5 link.add("stu2");
6 link.add("stu3");
7 link.add("stu4");
8 System.out.println(link.toString());//取出元素并打印该集合中的元素
9 link.add(3,"Student"); //向该集合中的指定位置插入元素
10 link.addFirst("First"); //向该集合第一个位置插入元素
11 link.addLast("Last"); //向该集合第一个位置插入元素
12 System.out.println(link);
13 System.out.println(link.getFirst()); //取出该集合第一个元素
14 System.out.println(link.getLast()); //取出该集合最后一个个元素
15 link.remove(3); //移除该集合中指定位置的元素
16 link.removeFirst(); //移除该集合中第一个元素
17 link.removeLast(); //移除该集合中最后一个个元素
18 System.out.println(link);
19 }
20 }
运行结果:
[stu1, stu2, stu3, stu4]
[First, stu1, stu2, stu3, Student, stu4, Last]
First
Last
[stu1, stu2, Student, stu4]
2、Iterator接口
集合的取出方式:
①创建集合对象
②获取容器的迭代器对象,通过iterator方法;
③使用具体的迭代器对象获取集合中的元素;
while (it.hasNext()){
System.out.println(it.next());
}
for(Iterator it = coll.iterator();it.hasNext();){
System.out.println(it.next());
}
该迭代器无法再迭代的过程中修改数组元素,否则会发生并发修改异常(ConcurrentModificationException)。
3、foreach:
其实就是增强for循环,用于遍历Collection和数组通常只能遍历元素,不要在遍历的过程中做对集合元素的操作。
for(元素数据类型 变量 :collection集合or数组()){执行语句}
1 public class Foreach {
2 static String [] strs = {"aaa","bbb","ccc"};
3 public static void main(String[] args) {
4 //foreach循环遍历数组
5 for(Object obj : strs){
6 System.out.println(obj);
7 }
8 System.out.println("______________");
9 //foreach循环遍历数组并修改(修改失败)
10 for (String str : strs){
11 str="ddd";
12 }
13 System.out.println("foreach循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]);
14 //for循环遍历数组
15 for(int i = 0;i<strs.length;i++){
16 strs[i]="ddd";
17 }
18 System.out.println("普通for循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]);
19 }
20 }
运行结果:
1 aaa
2 bbb
3 ccc
4 ______________
5 foreach循环修改后的数组:aaa,bbb,ccc
6 普通for循环修改后的数组:ddd,ddd,ddd
add方法示例:
1 public class AddDemo {
2 public static void main(String[] args) {
3
4 //在最前面添加
5 List<String> list1 = new LinkedList<String>(Arrays.asList(
6 new String[] { "a", "b", "c" }));
7 ListIterator<String> listIterator1 = list1.listIterator();
8 listIterator1.add("D");
9 listIterator1.add("E");
10 System.out.println(list1);//[D, E, a, b, c]
11 //在最后面添加
12 List<String> list2 = new LinkedList<String>(Arrays.asList(
13 new String[] { "a", "b", "c" }));
14 ListIterator<String> listIterator2 = list2.listIterator();
15 while (listIterator2.hasNext()) {
16 listIterator2.next();
17 }
18 listIterator2.add("D");
19 listIterator2.add("E");
20 System.out.println(list2);//[a, b, c, D, E]
21 //在每个元素的前面和后面都添加
22 List<String> list3 = new LinkedList<String>(Arrays.asList(
23 new String[] { "a", "b", "c" }));
24 ListIterator<String> listIterator3 = list3.listIterator();
25 while (listIterator3.hasNext()) {
26 listIterator3.add("前面");
27 listIterator3.next();
28 listIterator3.add("后面");
29 }
30 System.out.println(list3);//[前面, a, 后面, 前面, b, 后面, 前面, c, 后面]
31 //在指定元素的前面和后面添加
32 List<String> list4 = new LinkedList<String>(Arrays.asList(
33 new String[] { "a", "b", "c" }));
34 ListIterator<String> listIterator4 = list4.listIterator();
35 while (listIterator4.hasNext()) {
36 if (listIterator4.next().equals("a")) {//现在指向的是a的后面
37 listIterator4.previous();//先重新指向a的前面,这里不用担心NoSuchElementException
38 listIterator4.add("前面");//在前面添加元素,添加后还是指向的a的前面
39 listIterator4.next();//向后【再】移动一位,现在指向的是a的后面
40 listIterator4.add("后面");//在a的后面添加元素
41 }
42 }
43 System.out.println(list4);//[前面, a, 后面, b, c]
44 }
45 }
remove方法示例:
1 public class RemoveDemo {
2 public static void main(String[] args) {
3
4 // 执行next()或previous()后不能先执行了 add()方法。
5 // 因为add()方法执行以后,迭代器已经移动了,这样所要删除的目标元素指向不明,会报异常。
6 //标准的做法:在next之后才能remove
7 List<String> list2 = new LinkedList<String>(Arrays.asList(
8 new String[] { "b", "a", "b", "c", "b", }));
9 ListIterator<String> listIterator2 = list2.listIterator();
10 while (listIterator2.hasNext()) {
11 if (listIterator2.next().equals("b")) {listIterator2.remove();}
12 }
13 System.out.println(list2);//[a, c]
14
15 //移除指定范围内的所有元素
16 List<String> list3 = new LinkedList<String>(Arrays.asList(
17 new String[] { "a", "开始", "b", "c", "d", "结束", "e" }));
18 ListIterator<String> listIterator3 = list3.listIterator();
19 while (listIterator3.hasNext()) {
20 if (listIterator3.next().equals("开始")) {
21 listIterator3.remove();//注释掉这行代码则不移除"开始"
22 while (listIterator3.hasNext()) {
23 if (!listIterator3.next().equals("结束")) {
24 listIterator3.remove();//remove之后必须再调用next方法后才能再remove
25 } else {
26 listIterator3.remove();//注释掉这行代码则不移除"结束"
27 break;//结束while循环
28 }
29 }
30 }
31 }
32 System.out.println(list3);//[a, e]
33 //替换指定元素
34 List<String> list5 = new LinkedList<String>(Arrays.asList(
35 new String[] { "a", "b", "c" }));
36 ListIterator<String> listIterator5 = list5.listIterator();
37 while (listIterator5.hasNext()) {
38 if (listIterator5.next().equals("b")) {
39 listIterator5.remove();
40 listIterator5.add("替换");
41 }
42 }
43 System.out.println(list5);//[a, 替换, c]
44 }
45 }
1 class Student{
2 private String id;
3 private String name;
4 public Student(String id,String name){
5 this.id = id;
6 this.name = name;
7 }
8 // 重写toString方法
9 public String toString(){
10 return id+":"+name;
11 }
12 // 重写hashCode方法
13 public int hashCode(){
14 return id.hashCode();//返回id属性的哈希值
15 }
16 // 重写equals方法
17 public boolean equals(Object obj){
18 if(this==obj){ //判断是否为同一个对象
19 return true; //如果是,直接返回true
20 }
21 if (!(obj instanceof Student)){ //判断对象是否Student类型
22 return false; //如果对象不是Student类型,返回false
23 }
24 Student stu = (Student)obj; //将对象强转为Student类型
25 boolean b= this.id.equals(stu.id); //判断id值是否相同
26 return b; //返回判断结果
27 }
28 }
29 public class HashSetDemo {
30 public static void main(String[] args) {
31 HashSet set = new HashSet();
32 Student stu1= new Student("1","Jack");
33 Student stu2= new Student("2","Rose");
34 Student stu3= new Student("2","Rose");
35 set.add(stu1);
36 set.add(stu2);
37 set.add(stu3);
38 System.out.println(set);
39 }
40 }
运行结果:
[1:Jack, 2:Rose]
若不重写hashCode()和equals()方法,则输出结果是:
[2:Rose,1:Jack, 2:Rose]
- 元素自身具备自然排序,其实就是实现了Comparable接口重写compareTo方法。如果元素自身不具备自然排序,或具备的自然排序不是所需要的,这时只能用第二种方式。
- 比较器,其实就是在创建TreeSet集合时,在构造函数中指定具体的比较方式。需要定义一个类实现Comparator接口,重写compare方法。
1 class Student implements Comparable{ //定义Student类实现Comparable接口
2 String name;
3 int age;
4 public Student(String name,int age){ //创建构造方法
5 this.name = name;
6 this.age = age;
7 }
8 public String toString(){ //重写Object类toString()方法,返回描述信息
9 return name+":"+age;
10 }
11 public int compareTo(Object obj){ //重写Comparable接口compareTo方法
12 Student s =(Student) obj; //将比较对象强转为Student类型
13 if (this.age -s.age>0){ //定义比较方法
14 return 1;
15 }
16 if (this.age-s.age==0){
17 return this.name.compareTo(s.name);//将比较结果返回
18 }
19 return -1;
20 }
21 }
22 public class TreeSetDemo {
23 public static void main(String[] args) {
24 TreeSet ts = new TreeSet();
25 ts.add(new Student("Jack",19));
26 ts.add(new Student("Rose",18));
27 ts.add(new Student("Tom",19));
28 ts.add(new Student("Rose",18));
29 Iterator it = ts.iterator();
30 while (it.hasNext()){
31 System.out.println(it.next());
32 }
33 }
34 }
运行结果:
Rose:18
Jack:19
Tom:19
到此为止:在往集合中存储对象时,通常该对象都需要覆盖hashCode,equals,同时实现Comparable接口,建立对象的自然排序。通常还有一个方法也会复写toString();
1 public class Example15 {
2 public static void main(String[] args){
3 Map map = new HashMap(); //创建Map对象
4 map.put("1","Jack"); //存储键和值,键相同,值覆盖
5 map.put("2","Rose");
6 map.put("3","Lucy");
7 map.put("3","Mary");
8 System.out.println("1:"+map.get("1"));//根据键获取值
9 System.out.println("2:"+map.get("2"));
10 System.out.println("3:"+map.get("3"));
11 }
12 }
Map集合的两种遍历方式:
1 public class Example16 {
2 public static void main(String[] args){
3 //第一种先遍历Map集合中所有的键,再跟据键获取相应的值。
4 Map map1 = new HashMap(); //创建Map对象
5 map1.put("1","Jack"); //存储键和值
6 map1.put("2","Rose");
7 map1.put("3","Lucy");
8 Set keySet1 = map1.keySet(); //获取键的集合
9 Iterator it1 = keySet1.iterator();
10 while (keySet1.iterator().hasNext()){ // 迭代键的集合
11 Object key = it1.next();
12 Object value = map1.get(key); //获得每个键所对应的值
13 System.out.println(key+":"+value);
14 }
15
16 //第二种先获取集合中的所有映射关系,然后从映射关系中取出键和值
17 Map map2 = new HashMap();
18 map2.put("1","Jack"); //存储键和值
19 map2.put("2","Rose");
20 map2.put("3","Lucy");
21 Set entrySet = map2.entrySet();
22 Iterator it = entrySet.iterator(); //获取Iterator对象
23 while (it.hasNext()){
24 Map.Entry entry = (Map.Entry)(it.next()); //获取集合中键值对映射关系
25 Object key = entry.getKey(); //获取Entry中的键
26 Object value = entry.getValue(); //获取Entry中的值
27 System.out.println(key+":"+value);
28 }
29 }
30 }
运行结果:
1:Jack
2:Rose
3:Lucy
LinkedHashMap:基于链表+哈希表。可以保证map集合有序(存入和取出的顺序一致)。
1 //按学号从大排到小
2 public class Example20 {
3 public static void main(String[] args) {
4 TreeMap tm = new TreeMap(new MyCompartor()); //传入一个自定义比较器
5 tm.put("1","Jack"); //存储键和值
6 tm.put("2","Rose");
7 tm.put("3","Lucy");
8 Set keySet = tm.keySet(); //获取键的集合
9 Iterator it = keySet.iterator(); // 迭代键的集合
10 while (it.hasNext()){
11 Object key = it.next();
12 Object value = tm.get(key); //获得每个键所对应的值
13 System.out.println(key+":"+value);
14 }
15 }
16 }
17 class MyCompartor implements Comparator{ //自定义比较器
18 public int compare(Object o1, Object o2) { //实现比较方法
19 String id1 = (String) o1; //将Object类型的参数强转为String类型
20 String id2 = (String) o2;
21 return id2.compareTo(id1); //将比较结果之后的值返回,按字典相反顺序进行排序
22 }
23 }
运行结果:
3:Lucy
2:Rose
1:Jack
泛型的优点:安全机制;将运行时期的ClassCastExecption转移到了编译时期变成了编译失败。泛型技术,是给编译器使用的技术。避免了强转的麻烦。
1 public class Example23 {
2 public static void main(String[] args) {
3 ArrayList<String> list = new ArrayList<String>();
4 list.add("String");
5 list.add("Collection");
6 for(String str:list){
7 System.out.println(str);
8 }
9 }
10 }
//在创建类时,声明参数类型为T
class 类名<T>{
T temp;
//在创建save()方法时,指定参数类型为T
public void save (T temp){this.temp = temp}
//在创建get()方法时,指定返回值类型为T
public T get(){
return temp;
}
}
示例:
1 class CachePool<T>{
2 T temp;
3 public void save(T temp){
4 this.temp=temp;
5 }
6 public T get() {
7 return temp;
8 }
9 }
10 public class Example26 {
11 public static void main(String[] args) {
12 CachePool<Integer> pool = new CachePool<Integer>();
13 pool.save(new Integer(1));
14 Integer temp = pool.get();
15 System.out.println(temp);
16 }
17 }
五、Collections工具类
- 获取Collection最值。
- 对List集合排序,也可以用二分查找。
- 对排序逆序。
- 可以将非同步的集合转变成同步的集合。如:Xxx synchronizedXxx(Xxx) -------List synchronizedList (List)
//排序操作
1 public class Example27 {
2 public static void main(String[] args) {
3 ArrayList list = new ArrayList();
4 Collections.addAll(list,"c","z","B","K");
5 System.out.println("排序前:"+list);
6 Collections.reverse(list);
7 System.out.println("反转后:"+list);
8 Collections.shuffle(list);
9 System.out.println("按自然顺序排序后:"+list);
10 Collections.sort(list);
11 System.out.println("洗牌后:"+list);
12 }
13 }
运行结果:
排序前:[c, z, B, K]
反转后:[K, B, z, c]
按自然顺序排序后:[c, B, K, z]
洗牌后:[B, K, c, z]
//查找、替换操作
1 public class Example28 {
2 public static void main(String[] args) {
3 ArrayList list = new ArrayList();
4 Collections.addAll(list,-3,2,9,5,8);
5 System.out.println("集合中的元素:"+list);
6 System.out.println("集合中的最大元素:"+Collections.max(list));
7 System.out.println("集合中的最小元素:"+Collections.min(list));
8 Collections.replaceAll(list,8,0); //将集合中的8用0替换掉
9 System.out.println("替换后的集合:"+list);
10 }
11 }
运行结果:
集合中的元素:[-3, 2, 9, 5, 8]
集合中的最大元素:9
集合中的最小元素:-3
替换后的集合:[-3, 2, 9, 5, 0]
- 对数组排序。
- 二分查找。
- 数组复制。
- 对两个数组进行元素的比较,判断两个数组是否相同。
- 将数组转成字符串。
1 //使用Arrays的sort()方法排序
2 public class Example29 {
3 public static void main(String[] args) {
4 int[] arr={9,8,3,5,2};
5 System.out.print("排序前:");
6 printArray(arr);
7 Arrays.sort(arr);
8 System.out.print("排序后:");
9 printArray(arr);
10 }
11 public static void printArray(int[] arr) {
12 System.out.print("[");
13 for (int x=0;x<arr.length;x++){
14 if (x!=arr.length-1){
15 System.out.print(arr[x]+",");
16 }else {
17 System.out.println(arr[x]+"]");
18
19 }
20 }
21 }
22 }
排序前:[9,8,3,5,2]
排序后:[2,3,5,8,9]
1 //使用Arrays的binarySearch(Object[] a,Object key)方法查找元素
2 class Example {
3 public void run() {
4 int[] arr={9,8,3,5,2};
5 Arrays.sort(arr);//调用排序方法,对数组排序
6 int index = Arrays.binarySearch(arr,3);//查找指定元素3
7 System.out.println("数组排序后元素3的索引是:"+index);//输出打印元素所在的索引位置
8 }
9 }
数组排序后元素3的索引是:1
1 //使用Arrays的copyOfRange(int[] original,int from,int to)方法拷贝元素
2 class Example31 {
3 public void run() {
4 int[] arr={9,8,3,5,2};
5 int[] copies=Arrays.copyOfRange(arr,1,7);
6 for (int i =0;i<arr.length;i++){
7 System.out.print(copies[i]+",");
8 }
9 }
10 }
【8,3,5,2,0,0】
1 //使用Arrays的fill(Object[] a,Object val)方法填充元素
2 class Example{
3 public void run() {
4 int[] arr={1,2,3,4};
5 Arrays.fill(arr,8);
6 for (int i =0;i<arr.length;i++){
7 System.out.print(i+":"+arr[i]+“---”);
8 }
9 }
10 }
0:8---1:8---2:8---3:8
1 //使用Arrays的toString(int [] ,arr)方法把数组转换为字符串
2 class Example{
3 public void run() {
4 int[] arr={9,8,3,5,2};
5 String arrString=Arrays.toString(arr); //使用toString()方法将数组转换为字符串
6 System.out.println(arrString);
7 }
8 }
[9, 8, 3, 5, 2]
Java入门——(6)集合的更多相关文章
- Java入门(三)——集合概讲
集合(或者叫容器)是Java的核心知识点,它有着很深的深度.我们这里不会设计多深,仅仅作为了解入门,深入了解请移步各种集合源码文章.好的,下面正是开始介绍... Java集合为何而生 我们知道,Jav ...
- Java入门系列-19-泛型集合
集合 如何存储每天的新闻信息?每天的新闻总数是不固定的,太少浪费空间,太多空间不足. 如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,可以使用Java集合框架. Java 集合框架提 ...
- Java中的集合List - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的集合List - 入门篇>,希望对大家有帮助,谢谢 简介 说实话,Java中的集合有很多种,但是这里作为入门级别,先简单介绍第一种 ...
- Java中的集合Set - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的集合Set - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,映射Map,最后再简单介绍下集合Set,相关类如下 ...
- Java入门系列(七)Java 集合框架(JCF, Java Collections Framework)
Java 集合概述 List.Set.Map可以看做集合的三大类 java集合就像一个容器,可以将多个对象的引用丢进该容器中. Collection和Map是java集合的根接口. List List ...
- Java入门第一章
后天就是十一长假了,亲们准备好了去哪儿玩了吗? 今天有点空,就来聊聊Java吧,当然是一些Java入门知识了,网上有很多,这里我只是列举一些我自己学到的,感谢大家关注喵的博客这么久,也为大家带来点新知 ...
- JAVA入门 面向对象
主要内容 1.类和对象的概念 2.什么是面向对象 3.什么对象的属性方法 4.何谓对象引用 5.实例化 类和对象的概念 万物皆对象,客观存在的事物皆为对象.我们大到名胜古迹,小道生活中的一件物品,例如 ...
- Java入门1
一.eclipse的简单使用 1.新建项目 在package explorer的空白处点击右键,新建一个项目(new->Java Project)或者点击菜单栏的File->JavaPro ...
- Java开发知识之Java入门
Java开发知识之Java入门 一丶了解JAVA的版本 JAVA 有三个版本 JAVA SE: 标准版,开发桌面跟商务应用程序 JAVA SE 包括了Java的核心类库,集合,IO 数据库连接 以及网 ...
- Java入门(一):Hello World !
前言 从今天开始,准备写Java Web开发的系列文章,毕竟自己主攻的还是Java方向,Python只是业余学习的兴趣使然,在第二技能还没有培养成熟前,做好第一技能的巩固和提高是很有必要的.从正式入行 ...
随机推荐
- 微信支付(APP)
折腾了一天,终于搞定了微信支付,总结一下.首先从服务器端获取prepareid,Andorid 端再根据这个prepareid二次签名. 服务器端: 从官网上下载DEMO,Demo中只有JsAPi,M ...
- JS综合练习
练习一.任意数求和(最多输入十位数),输入999终止 运行代码 <!DOCTYPE html><html> <head> <meta charset=&quo ...
- Java算法-------无序数组中的最长连续序列---------leetcode128
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- PeopleCode事件和方法只用于online界面不能用于组件接口(component interface)
在使用CI过程中,哪些方法是不能使用的.以下为PeopleBook解释的内容. 一.搜索框代码不执行:SearchInit, SearchSave, and RowSelect events 意味着使 ...
- Oracle系统表实用操作笔记
1.取得指定用户的所有表名: SQL1: SELECT OWNER AS "对象所有者", OBJECT_NAME AS "表名", OBJECT_ID AS ...
- JavaScript实现淡入淡出
<!DOCTYPE html> <html> <head> <title>css动画</title> </head> <b ...
- 启动Tomcat提示:指定的服务未安装
新下载的Tomcat7.0 解压缩完了运行tomcat7.exe屏幕一闪就没了 运行tomcat7w.exe弹出个筐 指定的服务并未以已安装的服务存在 Unable to open the Servi ...
- 20170713_js闭包/匿名函数/作用域
js:闭包 var getNum; function getCounter() { var n = 1; var inner = function () {return n++; } console. ...
- Go语言学习笔记(五)文件操作
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 文件读取 os.File 封装了文件相关操作 type File File代表一个打开的文件对象. func Cr ...
- 【JQUERY】插件的写法
1. jquery插件怎么写 $.extend $.fn 2. 写的时候注意些什么