集合的由来

  • 数组的长度是固定的,当添加的元素超过了数组的长度,就需要对数组重新定义
  • java内部给我们提供的集合类,能存储任意对象,长度是可以改变的。随着元素的增加而增加,随着元素的减少而减少

数组和集合的区别

  • 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
  • 集合只能存储引用数据类型(对象Object),集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象  eg:int==>Integer
  • 数组长度是固定的,不能自动增长
  • 集合的长度是可变的,可以根据元素的增加而增长

如果元素的个数是固定的,我们使用数组

如果元素的个数不固定,我们使用集合

集合Collection类:

  • list:有序集合,有索引。存与取的顺序一样,可以重复

    • ArrayList(数组实现)
    • LinkedList(链表实现)
    • Vector(数组实现)
  • Set:无序集合,无索引。存与取的顺序不一样,不可以重复
    • HashSet (哈希算法)
    • TreeSet(二叉树算法)

ArrayList集合中部分数组实现的原理

  eg:有个容量为10的初始化数组,当它不够用的时候,就会自动生成一个1.5倍大的数组,将值重新赋值后,把以前的那个小的数组垃圾回收了

Collection的几个基本方法

  • boolean add(E e)  添加一个元素
  • boolean remove(object o)   移除某一个元素
  • void clear()  清空这个集合
  • boolean contains(Object o)
  • boolean isEmpty()   判断这个集合是否为空
  • int size()   大小
  • toArray()   将集合转化为数组
  • boolean addAll(Collection c1)  将c1添加进来
  • boolean removeAll(Collection c1)  移除this中还有的c1中的所有元素
  • boolean containsAll(Collection c1)  判断this是否包含有c1中的所有元素
  • boolean retainAll(Collection c1)   求并集

遍历一个集合,我们使用迭代器

迭代器是用来遍历集合中的每一个元素的

方法:hasNext()和next()

package lesson3;

//这是一个小例子

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class null03 { public static void main(String[] args) {
Collection c1 = new ArrayList();//这不就是多态?
c1.add("A");
c1.add("B");
c1.add("C"); Iterator iterator = c1.iterator();
while(iterator.hasNext()){
Object o = iterator.next();
System.out.println(o);
} } }

List集合

  • void add(int index,E element)
  • E remove(int index)
  • E get(int index)
  • E set(int index,E element)

List可以通过size()和get()方法结合来遍历List集合

package day19_null;

import java.util.ArrayList;
import java.util.List; public class null01List { public static void main(String[] args) {
List li = new ArrayList();
li.add("A");
li.add("B");
li.add("C");
li.add("D");
li.add(0,"E");
for(int i=0;i<li.size();i++){
System.out.println(li.get(i));
} } }

结果:

E
A
B
C
D

这里我们提出一道问题

有一个集合,判断里面有没有“B”这个元素,如果有,就添加一个“b”元素。

当我们使用iterator来遍历的时候,是不能一边遍历一遍添加值的

package day19_null;
//错误的写法
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class null01List { public static void main(String[] args) {
List li = new ArrayList();
li.add("A");
li.add("B");
li.add("C");
li.add("D");
li.add(0,"E");
Iterator iterator = li.iterator();
while(iterator.hasNext()){
//System.out.println(iterator.next());
Object o = iterator.next();
String o_str = (String)o;
if(o_str.equals("B")){
li.add("b");
}
} } }

错误的写法

所以呢,我们就要使用ListIterator这个了

  • boolean hasNext()   是否有下一个
  • boolean hasPrevious()     是否有前一个
  • Object next()   下一个元素
  • Object previous()   上一个元素

对比一下:

package day19_null;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator; public class null01List { public static void main(String[] args) {
List li = new ArrayList();
li.add("A");
li.add("B");
li.add("C");
li.add("D");
li.add(0,"E");
ListIterator iterator = li.listIterator();
while(iterator.hasNext()){
Object o = iterator.next();
String o_str = (String)o;
if(o_str=="B"){
iterator.add("b");
}
}
while(iterator.hasPrevious()){
System.out.println(iterator.previous());
} } }

Vector的使用

vector在JDK1.0版本就已经有了,从v1.2开始,此类改进为可以实现List接口,使他成为Java Collections Framework成员

Vector是同步的,也就是线程是有锁的,是安全的,当然也是效率低的

Vector的特有功能:

  • public void addElement(E obj)
  • public E elementAt(int index)
  • public Enumeration elements()0
package day19_null;

import java.util.Enumeration;
import java.util.Vector; public class null02_vector { public static void main(String[] args) {
//创建一个vector对象
Vector vec = new Vector();
vec.addElement("A");
vec.addElement("B");
vec.addElement("C");
vec.addElement("D");
vec.addElement("E");
System.out.println(vec.elementAt(0)); Enumeration enumeration = vec.elements();
while(enumeration.hasMoreElements()){
System.out.println(enumeration.nextElement());
}
} }

List的三个子类的特点

ArrayList:

  • 底层数据结构是数组,查询比较块,增删比较慢
  • 线程不安全,所以块

Vector:

  • 底层数据结构是数组,查询比较块,增删比较慢
  • 线程安全,效率较低(相对于ArrayList)

LinkedList:

  • 底层的数据结构是链表,查询慢,增删快
  • 线程不安全,所以快

例子:去除ArrayList中重复的对象

思路:创建一个新的ArrayList,然后借由新创建的ArrayList来进行判断

package day20_nullnull;

import java.util.ArrayList;
import java.util.List; public class null01_removeSame { public static void main(String[] args) {
// TODO Auto-generated method stub //TheUsualWayToGetRidOfWeight(); TheUsualWayToGetRidOfWeightObject(); } /**
* 如果ArrayList中存在Object
*/
private static void TheUsualWayToGetRidOfWeightObject() {
List li = new ArrayList();
li.add(new Student("null1",1));
li.add(new Student("null2",2));
li.add(new Student("null3",3));
li.add(new Student("null4",4));
li.add(new Student("null1",1));
List li2 = new ArrayList();
for(int i=0;i<li.size();i++){
// System.out.println(li.get(i));
if(!li2.contains(li.get(i))){
li2.add(li.get(i));
}
}
for(int i=0;i<li2.size();i++){
System.out.println(li2.get(i));
}
} /**
* 如果ArrayList中都是String
*/
private static void TheUsualWayToGetRidOfWeight() {
//创建一个数组
List li = new ArrayList();
li.add("A");
li.add("B");
li.add("C");
li.add("D");
li.add("A");
List li2 = new ArrayList();
for(int i=0;i<li.size();i++){
// System.out.println(li.get(i));
if(!li2.contains(li.get(i))){
li2.add(li.get(i));
}
}
for(int i=0;i<li2.size();i++){
System.out.println(li2.get(i));
}
} } class Student{
String name;
int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}

注意:我们会很神奇的发现,当ArrayList中存在Object的时候,居然不行?!!

补充:

  我们是使用contains来进行判断新的列表是否存在的。但是在contains的内部调用的其实还是equals方法。

  在String中因为重写了equals方法,所以他是根据String的内容进行判断的

  但是,在Object判断的却是内存地址。

  所以,我们要重写class的equals方法。

package day20_nullnull;

import java.util.ArrayList;
import java.util.List; public class null02 { public static void main(String[] args) {
List li1 = new ArrayList();
li1.add(new Student2("null1",1));
li1.add(new Student2("null2",2));
li1.add(new Student2("null3",3));
li1.add(new Student2("null4",4));
li1.add(new Student2("null1",1));
List li2 = new ArrayList();
for(int i=0;i<li1.size();i++){
if(!li2.contains(li1.get(i))){
li2.add(li1.get(i));
}
}
for(int i=0;i<li2.size();i++){
System.out.println(li2.get(i));
} } } class Student2{
String name;
int age;
public Student2() {
super();
}
public Student2(String name, int age) {
super();
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Student2 [name=" + name + ", age=" + age + "]";
}
@Override
public boolean equals(Object obj){
Student2 other = (Student2) obj;
return this.name.equals(other.name)&&this.age==other.age;
} }

OK,没有问题

注意:contains内部调用的还是equals方法

LinkedList的使用

 我们现在学了集合中list的两个ArrayList和Vector两个,这两个的底层都是Array数组

接下来的LinkedList的底层是链表

方法:

  • public void addFirst(E e)以及addLast(E e)
  • public E getFirst()以及getLast()
  • public E reoveFirst()以及removeLast()
  • public E get()

使用LinkedList实现栈和队列

  • 栈:先进后出
  • 队列:先进先出
package lesson2;
//栈的模拟 import java.util.LinkedList; public class null01 { public static void main(String[] args) {
Stack stack = new Stack(); //进栈
stack.in("A");
stack.in("B");
stack.in("C");
stack.in("D");
stack.in("E"); //出栈
Object o = stack.out();
System.out.println(o);
System.out.println(stack.list);
} }
class Stack{
//栈:先进后出
LinkedList list = new LinkedList(); //进栈的方法
public void in(Object o){
list.addFirst(o);
} //出栈的方法
public Object out(){
return list.removeFirst();
}
}

队列的模拟和其类似,只不过是相反而已,队列是先进先出的

当然,其实不用写,在LinkedList的内部就已经实现了栈的一系列方法

package lesson2;

import java.util.LinkedList;

public class null02 {

    public static void main(String[] args) {
//创建一个栈对象
LinkedList stack = new LinkedList(); //进栈的方法
stack.push("A");
stack.push("B");
stack.push("C");
stack.push("D"); //出栈的方法
Object o1 = stack.pop();
System.out.println(o1);
Object o2 = stack.pop();
System.out.println(o2);
Object o3 = stack.pop();
System.out.println(o3);
Object o4 = stack.pop();
System.out.println(o4);
stack.pop(); //没有了还要弹,就报错了
/** Exception in thread "main" java.util.NoSuchElementException
at java.util.LinkedList.removeFirst(Unknown Source)
at java.util.LinkedList.pop(Unknown Source)
at lesson2.null02.main(null02.java:26)*/
} }

泛性的概述和简单使用

作用:把类型明确的工作推前到创建对象或者调用方法的时候

泛型是一种参数化类型,把类型当做参数一样传递来明确集合的元素类型

好处:

  • 提高安全性
  • 省去了强转的麻烦

基本使用:

  • 声明集合泛型的格式:List<String> list = new ArrayList<String>();
  • <>中放的必须是引用数据类型

Java学习之路(六):集合的更多相关文章

  1. Java学习之路(六)

    1:包及和访问权限 将类放置到一个包当中,需要使用package “包名” 编译时需要使用 -d 参数  该参数的作用是依照包名生成相应的文件夹 一个类的全民应该是  “包名” + “.” + “类名 ...

  2. java学习之路之javaSE基础1

    <h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解)* A:什么是计算机?计算机在生活中的应用 ...

  3. Java学习之路(转)

    Java学习之路(书籍推荐)   一.基础类 1.<Thinking in java>(阅读2遍),入门第一位是建立正确的概念 2.<Core Java>这本书更贴近实践,更多 ...

  4. JAVA学习之路与大家分享

    这是我四年以前总结的JAVA学习之路,希望对初学者或想从事JAVA开发的人有帮助. 本人是软件工程专业出身,先后学过C.C++.JAVA.VB.delphi等等开发语言以及网络相关管理技术.哎,好久不 ...

  5. 新篇章之我的java学习之路下

    昨天写下了人生的第一篇博客,今天接着写我的java学习之路有关开发及框架的学习过程. 想要学好java语言,只学习一些java的基本语法对实际开发中的用处还是不大的,所以我们还要掌握一些有关javaW ...

  6. java学习之路之javaSE基础2

    java学习之路之javaSE基础2 所有的代码都是引用他人写的. 1.逻辑运算符 //&,|,^,! //int x = 10; //5 < x < 15 //x > 5 ...

  7. 201671010140. 2016-2017-2 《Java程序设计》java学习第十六周

    java学习第十六周-并发        本周,学习了Java中线程,并发的知识,在老师的带领下,进行了对知识的理解学习,以及对实验的运行讲解,对这一块内容掌握的还可以,在自主编程中,也能够完成.线, ...

  8. Java 学习之路 -- day00

    Java 学习之路 -- day00 Typora 快捷键操作 标题:#+空格 2. *斜体* 3. **加粗** 4. **斜体加粗*** 5. ~~删除线~~ 6. > 引用 7. ···分 ...

  9. Java学习之路:不走弯路,就是捷径

    1.如何学习程序设计? JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为 ...

随机推荐

  1. LinUX系统ThinkPHP5链接MsSQL数据库的pdo_dblib扩展

    LinUX(centOS6.8)系统ThinkPHP5链接MsSQL数据库的pdo_dblib扩展第一步 下载并安装freetds-current.tar.gz下载地址如下ftp://ftp.free ...

  2. 阿里杨传辉的访问节选(oceanbase)

    皮皮(Q4): OceanBase第一个应用是收藏夹.最近,听说支付宝交易也用到了OceanBase.能否结合阿里的应用谈谈OceanBase的优势. 杨传辉(A4):相比传统的关系数据库,谈及Oce ...

  3. 别做HR最讨厌的求职者

    有些求职者认为自己各方面都与所应聘的职位要求相匹配,因此在被淘汰之后总是特别不解,努力回忆起每个面试环节,却始终找不到原因.是的,也许你真的很优秀,但是你被淘汰了,原因也许并不大,只是你得罪了HR.其 ...

  4. 2、Docker和虚拟机的对比

    2.1 虚拟化技术   虚拟机Virtual Machine与容器化技术(代表Docker)都是虚拟化技术,两者的区别在于虚拟化的程度不同.   Docker为代表的容器化技术并不是虚拟机.   虚拟 ...

  5. nancyfx的安装笔记

    这个安装时很简单的 只要 Install-Package Nancy.Hosting.Aspnet 就行了. 需要注意的是,千万不要用那个模板安装,通过创建nancyfx类型项目的方式安装是有问题的. ...

  6. .NET 匿名方法的BUG,请专家解答

    匿名方法是.NET 3.5之后的一个好东东,很多人使用,但是我在最近的工作当中发现了一个问题. 请专家解答 //list里存放10个数字 List<); ; i < ; i++) { li ...

  7. 深入CSS属性(九):z-index

    如果你不是一名csser新手,想必你对z-index的用法应该有个大致的了解了吧,z-index可以控制定位元素在垂直于显示屏方向(Z 轴)上的堆叠顺序,本文不去讲述基本的API如何使用,而是去更深入 ...

  8. 安装git出现templates not found的问题

    背景 goods.api需要在新机器上部署,该机器上没有安装git,需要安装git,查询git版本为2.4.5-1.el6 ,使用yum 一顿安装后,执行git clone命令告知warning: t ...

  9. 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我

    写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...

  10. Fiddler4无法抓取HttpWebRequest本地请求的解决办法

    网上很多解决案例是如下方代码设置代理,但在我的Fiddler4环境下无效,后寻得官方处理方法证实与代理无关. HttpWebRequest request= WebRequest.Create(&qu ...