Java基础笔记总结(9)-集合(1)集合与数组转换 迭代器 List ArrayList Linked List Vector的区别 泛型以及通配符

集合框架(对象数组的概述和使用)

结合类能存储任意对象,长度是可以改变的,随着元素的增加而增加,元素的减少而减少

数组和集合的区别

1、数组既可以存储基本数据类型,也可以存储引用数据类型,但集合中只能存储引用数据类型,如要存储基本数据类型,在存储过程中会自动装箱变成对象。

2、数组元素的固定的,不能自动增长,而集合长度是可变的,可以根据元素的增加而增长

                              Collection

      List                                            Set

(有序,存取数据有序,索引,可重复)  (无序,存取顺序不一致,无索引,不可以存储重复数据)

ArrayList  LinkedList Vector(数组)    HashSet(哈希表)  TreeSet(二叉树)

--------------------------------------------------------------------------Collection(Util)

Collection collection = new ArrayList();

boolean flg = collection.add(Object o);

c.clear()

c.size()

c.contain(对象);

集合转数组遍历

Object[] arr = coll.toArray();//要对Object进行强制类型转换

boolean flg = c.addAll(collection c1); 把c1中的每一个元素添加到c中

boolean flg = c.removeAll(collection c1); 删除的是由交集的部分

boolean flg = c.containsAll(collection c1);判断调用的集合是否包含传入的数据

boolean flg = c.returnAll(collection c1);去交集,如果调用的集合改变,返回true,如果调用集合不变就返回false

--------------------------------------------------------------------------

集合的迭代器遍历

Iterator it = collection.iterator();

while(it.hasNext()){

Object o = it.next();//调用一次,指针向后移动一次

}

为什么要将方法抽取到接口中new

迭代器对集合遍历,每一个集合内部的存储结构不同,每个集合存取都不同,如果每个都写在其中,过于臃肿

好处1、声明了规则,只能使用hasNext()和next()

2、代码底层内部实现,使用者无需关系如何实现

--------------------------------------------------------------------------

List集合的特有功能概述和测试

List<T> list = new ArrayList<T>();

Object obj = list.remove(key);//按照序列号返回

删除的时候不能自动装箱,只能当做key来使用

Object obj = list.get(key);

list.set(key,value);

--------------------------------------------------------------------------

并发修改异常产生的原因以及解决方案(迭代器运行过程中,不能够修改)

ConcurrentModificationException并发修改异常

1、采用迭代器修改元素的特有功能 采用ListIterator lit = list.listIterator(); 就可以使用add()方法了

2、采用遍历元素的方法

ListIterator方法

next()  hasNext()

preivous() hasPrevious()//直接反向遍历 必须让迭代器指针放置在最后一个元素

--------------------------------------------------------------------------

Vector类的特有功能

Vector v = new Vector()

Enumeration e =v.elements();

while(en.hasMoreElement()){}

--------------------------------------------------------------------------

数组 查询、修改快,增删慢(ArrayList)线程不安全,效率高

数组 查询、修改快,增删慢(Vector)线程安全,效率低

Vector相对于ArrayList查询慢(线程安全)

Vector相对于LinkedList增删慢(数组结构)

链表 查询、修改慢,增删快(LinkedList)线程不安全 效率高

Vector和ArrayList区别

Vector是线程安全的,效率低

ArrayList是线程不安全的,效率高

其中,他们的底层结构都是数组

ArrayList和LinkedList都是线程不安全的

查询多用ArrayList

增删多用 LinkedList

都多使用ArrayList

--------------------------------------------------------------------------

去除ArrayList中重复值

思路是创建新的集合方式

public static ArrayList getSingle(ArrayList list){

ArrayList newList = new ArrayList<>();

Iterator it = list.iterator();

  while(it.hasNext()){

Object obj = it.next();

      if(newList.contains(obj)){

}else{

        newList.add(obj);

      } 

  }

return newList;

}

------------------------------------------------------

如果要去除自定义对象

remove方法和contains方法底层都是用的equals方法,所以对于自定义对象要使用重写equals方法实现该效果

-----------------------------------------------------------------

LinkedList的特有功能

addFirst(E e)  addLast(E e)

getFirst()  getLast()

removeFirst() removeLast()

get(int index) 这里的index和数组一致

-------------------------------------------------

栈和队列的区别

栈是先进后出,队列是先进先出

利用LinkedList模拟栈

public class Stack{

private LinkedList list = new LinkedList();

//模拟进栈方法

public void in(Object obj){

  list.addLast(obj);

}

public Object out(Object obj){

  //模拟出栈

  return list.removeLast();

}

public boolean isEmpty(){

return list.isEmpty();

}

}

--------------------------------------------------

泛型的优势:<必须存储引用数据类型,并且保证前后数据类型一致>

如果不使用泛型,当强转至某一个对象时,会出现ClassCastException

优势:提高了安全性,省去强转的麻烦,最好不要用Obejct

1 自定义类加泛型

  public class A<E>{}  可以指定方法中某些必须调用的类型

2 自定义泛型方法的概述

  public void method(E e){}在创建对象使用中,自动使用泛型的类型,方法泛型要和类的泛型一致  如方法自带自己的泛型 public<T> void show(T t){}则可以使用自定义的对象

3 自定义静态方法无法使用类泛型,因为在静态方法中,加载过程中可能还没有对象

  静态方法只能使用自己的泛型

public static<W> void show(W w);

自定义泛型接口

interface Inter<T>{

public void show(T t);

}

class Demo implements Inter<String 直接指定类>{}

class Demo<T> implements Inter<T>{}

------------------------------------------------------------------

泛型高级之通配符

泛型通配符<?> 可以替代任意的类型,替代Object不会报错

? extends E 向下限定 E极其子类 使用E类型或者E的子类型

? super E 向上限定 E极其父类

-----------------------------------------------------------------

ArrayList存储字符串字符串并遍历泛型

ArrayList<String> arrayList = new ArrayList<String>();

list.add("");

Iterator<String> it = arrayList.iterator();

while(it.hasNext()){

it.next();//只能调用一次,否则会出现指针后移一位

}

-------------------------------------------------------------------

三种迭代能否删除

1、普通for循环 可以删除,但是索引要-- list.remove(i--)

2、迭代器,可以删除,但是必须使用自身的remove()方法,否则会出现并发异常

3、增强for循环不能删除

------------------------------------------------------------------

JDK1.5 静态导入 导入类中的静态方法

import static 包名,类名,方法 但是会和本类的静态方法出现冲突

JDK1.5 int...arr = int[] arr 并且其可以自动将参数变成数组,该参数必须放在参数列表的最后一个位置(int x,int...x)

-------------------------------------------------------------------

Arrays.asList(T...a) 返回一个受指定数组支持的固定大小的List(这个List不支持增加,删除,其他都可以)

但是使用基本数据类型的数据,放置在list中打印出地是地址

因为list中只能存放引用数据类型,所以默认将基本数据类型的数组当做引用,并打印地址

修改方法就是将基本数据类型改成引用数据类型

集合转数组使用泛型

Integer[] array = list.toArray(new Interger[size]);

当集合转换数组时,数组的长度如果是小于等于集合size()时,转换后的数组长度等于集合的length,如果数组的长度大于size,则分配的数组长度和指定的长度一致

-------------------------------------------------------------------

ArrayList 用增强for遍历,简化遍历,依赖的是迭代器

for(Person person :list){

}

ArrayList嵌套ArrayList

ArrayList<ArrayList<Object>> lists  = new ArrayList<ArrayList<Objext>>();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容