一、容器(Collection):数组是一种容器,集合也是一种容器

  java编程中,装其他各种各样的对象(引用类型)的一种东西,叫容器

  注意:

    1、数组的长度是固定的

    2、集合:长度不固定, 可以随时添加和删除,只要不超出内存, 随便往里添加

二、集合接口(六大接口)

1、Collection(包括List接口和Set接口)
  List---(有顺序, 可以重复-->可以互相equals(引用类型))---下标(重复的标准就是相互equals)
      LinkedList(链表)---(改快,查慢)
      *ArrayList(数组)---(改慢,查快)
    Set---(没有顺序, 不可以重复)
      *HashSet(hash码表)(必须重写hashCode()方法)
      TreeSet(二叉树---数据结构)
2、Map(键值对,每次往里放的时候都是一对一对的)(键不能重复,既不能相互equals)
      *HashMap
      TreeMap

3、Comparable(一个方法(comparaTo))

4、Iterator(循环遍历, 3个方法)
    boolean hasNext()
    Object next()
    remove()
  用法:
    while(hasNext()) {
      next()
    }

三、Collection接口的方法

1、Collection接口的使用
  Collection c = new ArrayList();

2、c.add(参数类型必须是Object)

3、c.remove方法: 通过判断两个对象是否互相的equals来确定是不是该删除该对象, 自定义的类, 需要自己重写父类的equals方法
重写equals方法, 也应该重写hashCode方法

4、hashCode通常用来做索引, 一个对象通过它的hashCode的值可以找到它在内存中的地址, 所以两个对象如果equals了, 而且又要作为索引的情况下, hashCode的值必须相等

举例说明:

package util;

import java.util.ArrayList;
import java.util.Collection; public class TextCollection {
public static void main(String[] args) {
//接口Collection不能直接new,必须由它的实现类来new,因为接口是抽象类,没有方法体,没法直接用
Collection c = new ArrayList(); //父类的引用指向子类的对象
c.add(1);
c.add("nihao");
c.add(new Person()); System.out.println(c); //输出结果为:[1, nihao, Person [哈哈]] c.remove(1);
c.remove("nihao");
c.remove(new Person());//new在内存中的指向不一样,必须equals System.out.println(c.size()); //输出结果为:1
System.out.println(c); //输出结果为:[Person [哈哈]]
}
} class Person{ @Override
public String toString() {
return "Person [哈哈]";
}
}

四、List接口

  ArrayList(API中说初始容量为10的, 注意这个问题), LinkedList
  有顺序, 可以重复添加
  set(有一个返回值要注意 !)

  retainAll(Collection)----返回一个boolean值, 当list的内容被改变的时候返回true, 否则返回false;仅保留此列表中包含在指定集合中的元素(可选操作)。

package util;

import java.util.ArrayList;
import java.util.List; public class TextCollection1 {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List list1 = new ArrayList();
List list2 = new ArrayList();
List list3 = new ArrayList();
for (int i = 0; i < 5; i++) {
list1.add("String" + i);
if(i%2==0){
list2.add("String" + i);
list3.add("String" + i*10+1);
}
}
System.out.println(list1); //输出结果为:[String0, String1, String2, String3, String4]
System.out.println(list1.get(3)); //输出结果为:String3
System.out.println(list1.set(2, "哈哈")); //输出结果为:String2,有返回值
System.out.println(list1); //输出结果为:[String0, String1, 哈哈, String3, String4]
System.out.println(list1.remove(4)); //输出结果为:String4,有返回值
System.out.println(list1); //输出结果为:[String0, String1, 哈哈, String3]
System.out.println(list1.indexOf("String3")); //输出结果为:3
System.out.println(list1.lastIndexOf("String3")); //输出结果为:3
//list1.retainAll(list2);//取两个集合中的交集,然后把交集的内容赋值给list1,如果list1中内容改变了,返回true,如果没改变(即两个集合没有交集),返回false
System.out.println(list1.retainAll(list2)); //输出结果为:true
System.out.println(list1); //输出结果为:[String0]
//list1.retainAll(list3);
System.out.println(list1.retainAll(list3)); //输出结果为:false
System.out.println(list1); //输出结果为:[]
}
}

五、Map接口

Map接口

put:有个返回值
remove:有个返回值

 

例子:

package util1;

import java.util.HashMap;
import java.util.Map; public class TextCollection2 {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Map map = new HashMap();
for (int i = 0; i < 5; i++) {
map.put(i, new Person("name" + i));
}
System.out.println(map); //输出值为:{0=Person [name0], 1=Person [name1], 2=Person [name2],
// 3=Person [name3], 4=Person [name4]} map.put(5, new Person("新人"));
System.out.println(map); //输出值为:{0=Person [name0], 1=Person [name1], 2=Person [name2],
// 3=Person [name3], 4=Person [name4], 5=Person [新人]} map.put(1, new Person("又来个新人"));
System.out.println(map); //输出值为:{0=Person [name0], 1=Person [又来个新人], 2=Person [name2],
// 3=Person [name3], 4=Person [name4], 5=Person [新人]} System.out.println(map.get(1)); //输出值为:Person [又来个新人] System.out.println(map.remove(1)); //输出值为:Person [又来个新人]
System.out.println(map); //输出值为:{0=Person [name0], 2=Person [name2], 3=Person [name3],
//4=Person [name4], 5=Person [新人]} System.out.println(map.remove(0, new Person("name" + 0))); //输出值为:true
System.out.println(map); //输出值为:2=Person [name2], 3=Person [name3], 4=Person [name4],
//5=Person [新人]} System.out.println(map.containsKey(4));//输出值为:true
System.out.println(map.containsValue(new Person("name" + 0)));//输出值为:false,在上一步已经删除 System.out.println(map.size());//输出值为:4
System.out.println(map.isEmpty());//输出值为:false
map.clear();
System.out.println(map);//输出值为:{} Map map2 = new HashMap();
for (int i = 0; i < 5; i++) {
map2.put("a"+i, new Person("====a" + i));
}
map.putAll(map2);
System.out.println(map);//输出值为:{a1=Person [====a1], a2=Person [====a2], a3=Person [====a3],
//a4=Person [====a4], a0=Person [====a0]} }
} class Person{
String name;
public Person(String name){
this.name = name;
}
@Override
public String toString() {
return "Person [" + name + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} }

六、问题: 为什么不直接写ArrayList a = new ArrayList();而是Collection c = new ArrayList();?

Collection是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了Collection。
Collection c = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了Collection。此时它是一个Collection对象了,有些ArrayList有但是Collection没有的属性和方法,它就不能再用了。而ArrayList a =new ArrayList();创建一对象则保留了ArrayList的所有属性。 为什么一般都使用 Collecton c = new ArrayList() ,而不用 ArrayList a = new ArrayList()呢?
问题就在于Collection有多个实现类,如 LinkedList或者ArrayList等等,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类呢?,这时你只要改变这一行就行了:Collection c = new LinkedList(); 其它使用了Collection地方的代码根本不需要改动。假设你开始用 ArrayList a = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。如果没有特别需求的话,最好使用
Collection c = new ArrayList(); ,便于程序代码的重构. 这就是面向接口编程的好处。

java基础之容器、集合、集合常用方法的更多相关文章

  1. Java基础-引用数据类型之集合(Collection)

    Java基础-引用数据类型之集合(Collection) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便 ...

  2. Java中的容器(集合)之HashMap源码解析

    1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...

  3. JAVA基础第五章-集合框架Map篇

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  4. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  5. Java中的容器(集合)之ArrayList源码解析

    1.ArrayList源码解析 源码解析: 如下源码来自JDK8(如需查看ArrayList扩容源码解析请跳转至<Java中的容器(集合)>第十条):. package java.util ...

  6. Java基础-字符串(String)常用方法

    Java基础-字符串(String)常用方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.java的API概念 Java的API(API:Application(应用) Pr ...

  7. java基础27 单例集合Collection及其常用方法

    1.集合 集合是存储对象数据的集合容器 1.1.集合比数组的优势 1.集合可以存储任意类型的数据,数组只能存储同一种数据类型的数据    2.集合的长度是变化的,数组的长度是固定的 1.2.数组:存储 ...

  8. Java基础知识(数据类型和集合)

    一.数据类型 包装类型 包装类型是对基本数据类型不足之处的补充. 基本数据类型的传递方式是值传递,而包装类型是引用传递,同时提供了很多数据类型间转换的方法. Java1.5 以后可以自动装箱和拆箱 二 ...

  9. JAVA基础第四章-集合框架Collection篇

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

随机推荐

  1. python核心编程学习(第三版)之网络编程

    套接字 套接字是计算机网络数据结构.在任何类型的通信开始之前,网络应用程序必须创建套接字. 有两种类型的套接字,基于文件和面向网络的. unix套接字是第一个家族,AF_UNIX代表地址家族,缩写AF ...

  2. 2017.2.12 开涛shiro教程-第八章-拦截器机制

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 1.拦截器介绍 下图是shiro拦截器的基础类图: 1.Namea ...

  3. Wireshark网络分析实战笔记(三)基本信息统计工具的使用方法

    Capture File Properties:获取网络中数据包的整体信息 用法:Statistics菜单条下Capture File Properties选项 Protocol Hierarchy: ...

  4. 微信小程序-获取用户信息(getUserInfo)

    当小程序抹杀掉这个接口的时候,多少人心凉了.. 作为一个初级web前端开发,我是更加懵逼,小程序员跑路了... 当时以及现在用的办法就是: 1.增加一个登陆或授权页 2.上线以后自动获取 3.增加一个 ...

  5. vue-cil 和 webpack 中本地静态图片的路径问题解决方案

    1.小于8K的图片将直接以base64的形式内联在代码中,可以减少一次http请求. 2.大于8k的呢?则直接file-loader打包, 这里并没有写明file-loader.但是确实是需要安装,否 ...

  6. ViewPager+Fragment 滑动菜单效果 实现步骤

    1.xml中引用ViewPager     <android.support.v4.view.ViewPager             android:id="@+id/viewPa ...

  7. Linux内存段的分析

        Linux 应用程序的内存分配中,是用 segment(段)进行区别的,使用 size 命令进行查看: size a.out text data bss dec hex filename a. ...

  8. HTML/CSS开发规范指南

    参见文档:https://github.com/doyoe/html-css-guide 1.文档目录结构 |-- 项目名 |-- src 开发环境 |-- html 静态页面模板目录 |-- bgi ...

  9. vscode Python Pylint(代码检测插件)

    暑假刚开始想了解一下Python,使用vscode进行编写,根据vscode 的提示安装了一些不知道干啥的插件,编写过程中提示说  "Linter pylint is not install ...

  10. android IntentService生命周期问题

    假设须要在onHandleIntent之前运行一些操作.比方须要停止当前正在运行的任务.可在onStart做这个操作. 须要注意的是必须在onStart函数的最后(运行完我的操作后)调用super.o ...