《黑马程序员》java笔记->关于list列表

时间:2023-02-18 22:41:04

------- android培训java培训、期待与您交流! ----------



Collection

|--List:列表。
特点:
1,有序(存储元素的顺序和取出元素的顺序一致)
2,该集合中的元素都有索引,所以可以通过索引(角标)来访问元素。 
3,它可以存储重复元素。 

常见子类对象:记住:具体的子类对象,我们要学习应该是该对象的特有的数据结构,以及相关的特点。
|--Vector:jdk1.0就存在了。底层是数组结构的。可变长度数组,
原理:一旦原数组长度不够,会创建新数组,将原数组的元素复制到新数组中,并将新元素添加到新数组中。
Vector是同步的。
|--ArrayList:底层是数组结构,也是支持长度可变数组的。是不同步的。替代了Vector.因为效率高。 查询效率很高。 但是增删的效率很低。
|--LinkedList:底层是链接列表结构,简称链表结构。是不同步的。这个中结构的好处:对元素的增删非常效率很高。 查询的效率很低。

|--Set:集:中的方法和Collection一致,只要重点注意它的子类对象即可。取出元素只能使用迭代器。
特点:
1,不包含重复元素。(最大的特点)
2,这个集合存入元素的顺序和取出元素的顺序不一定一致。(具体的容器对象数据结构不同,顺序也有不同)
|--HashSet:底层数据结构是哈希表,不保证顺序,是不同步的。
哈希表:提供数组的查询效率而出现的。
将要存储的元素先通过哈希算法算出一个哈希值来标识存储的位置,代表着元素。
要找元素时,先将该元素通过哈希算法算出哈希值,在通过哈希值到哈希表中去查找。
特点:
1,不关系元素的顺序。
2,提高了查询效率。
3,不可能出现重复元素,因为哈希值都不同。即使相同,会再次判断两个元素的equals,内容是否相同。
如果内容也相同,不存,如果内容不同,存储。
所以哈希表要保证元素的唯一性,必须要依赖于两个方法。
1,hashCode
2,equals

|--TreeSet:可以给Set集合中的元素进行指定顺序的排序。
默认情况下,是通过元素的自然顺序排的序。

它保证元素唯一性的依据是看比较方法的返回结果是否是0.是0.就视为元素相同。不存。

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


关于List : vector

public static void main(String[] args) {



Vector v = new Vector();

v.addElement("abc1");
v.addElement("abc2");
v.addElement("abc3");
v.addElement("abc4");

// Iterator it = v.iterator();
// while(it.hasNext()){
// System.out.println(it.next());
// }

/*
* 枚举接口也是用来取出集合中的元素,但是枚举接口只能取出Vector集合中的元素
* 枚举最后被迭代器取代。 
*/
Enumeration en = v.elements();

while(en.hasMoreElements()){
System.out.println(en.nextElement());
}
}

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

关于:演示链表的特有方法

public static void main(String[] args) {



/*
* 演示链表的特有方法。

* 头尾操作方法。 

* addFirst();
* addLast();

* getFirst():从头部获取元素,但不删除。如果没有元素,会抛出NoSuchElementException
* getLast();

* removeFirst():从头部获取元素,但删除。如果没有元素,会抛出NoSuchElementException
* removeLast();
*/


LinkedList link = new LinkedList();

// 添加元素。
link.addFirst("abc1");
link.addFirst("abc2");
link.addFirst("abc3");
link.addFirst("abc4");

// System.out.println(link.getFirst());
// System.out.println(link.getFirst());

// System.out.println(link.removeFirst());
// System.out.println(link.removeFirst());

while(!link.isEmpty()){
System.out.println(link.removeFirst());
}


// Iterator it = link.iterator();
// while(it.hasNext()){
// System.out.println(it.next());
// }
}

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

演示:List子接口中的特有方法


public static void main(String[] args) {


/*
* 演示List子接口中的特有方法。
* 因为该接口的特点是 对元素有索引标示。
* 所以它的特有方法应该都是围绕着索引定义的。 

* 1,添加:
* void add(index,element);
*  boolean addAll(index,collection);
*  
* 2,删除:
* object remove(index):获取并删除。记住大家,增加或者删除方法的成功都会改变集合的长度。

* 3,获取:
* 获取元素:
* Object get(index):获取
* 获取元素索引:
* int indexOf(object);
* int lastIndexOf(object);
* 获取子列表:
* List subList(fromIndex,toIndex):获取列表中的一部分,包含fromIndex位置,不包含toIndex位置。

* 4,修改。
* object set(index,element):替换指定位置的元素,并返回被替换掉的元素。

* 我们发现,List接口是可以对元素进行增删改查的操作的。
* 注意:只有这个集合具备着增删改查。具备的原因:因为有索引。 

*/

List list = new ArrayList();
// listMethodDemo(list);
// getAllElements(list);
listIteratorDemo2(list);
}

public static void listIteratorDemo2(List list) {

list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
System.out.println(list);

//获取列表迭代器。
ListIterator it = list.listIterator();

while(it.hasNext()){
Object obj = it.next();
if(obj.equals("abc2")){
// it.add("haha");
// it.remove();
// it.set("xixi");
}
System.out.println("next:"+obj);
}

while(it.hasPrevious()){
System.out.println("previous:"+it.previous());
}

System.out.println(list);
}


/*

*/


public static void listIteratorDemo(List list){

list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
System.out.println(list);

Iterator it = list.iterator();
while(it.hasNext()){

Object obj = it.next();//ConcurrentModificationException并发修改异常。
/*
* 当对集合进行迭代时,在迭代的过程,如果用集合对象对元素进行了修改。
* 而迭代器是不知道的,所以在迭代的过程中就会发生不确定性。
* 为了避免这种情况的发生,在迭代时,不要使用集合对象对迭代中的元素进行操作。

* 但是,我们还想在迭代的过程中对被迭代的元素进行更多的操作。该怎么办呢?
* 可以使用迭代器的方法。但是Iterator的方法很郁闷,只有判断hasNext,获取next,删除,remove三个方法。

* 注意:要想解决这个问题,list接口中提供了一个特有的迭代器。
* 这个迭代器就是ListIterator 列表迭代器。就可以解决这个问题。

* 介绍一下ListIterator。
* 它的父接口是Iterator。
* 一看其方法,add remove set next 它就可以实现在迭代过程中进行元素的增删改查的动作。
* 它还支持逆向遍历。

* 注意:这个列表迭代器只能对List集合使用。

*/
if(obj.equals("abc2")){
list.add("haha");
System.out.println("hahahahh");
}
System.out.println("obj:"+obj);
}

System.out.println(list);
}

/*
* 需求:获取list集合中所有的元素。 

*/
public static void getAllElements(List list){
list.add("abc1");
list.add("abc7");
list.add("abc2");
list.add("abc4");



//迭代器。
// Iterator it = list.iterator();
// while(it.hasNext()){
// System.out.println(it.next());
// }

//遍历。通过索引完成。
for(int x=0; x<list.size(); x++){
System.out.println("get:"+list.get(x));
}
}

/*
* 演示List中的特有方法。
*/
public static void listMethodDemo(List list){

//默认给这个集合添加一些元素。
list.add("abc1");
list.add("abc2");
list.add("abc3");

System.out.println("原集合:"+list);

//1,插入元素。
// list.add(1,"nba");
// System.out.println(list);

//2,删除指定位置的元素。
// System.out.println(list.remove(2));

//3,获取指定位置的元素。
// System.out.println(list.get(1));

//4,修改指定位置上的元素。
// System.out.println(list.set(1, "haha"));

//5,索引元素的位置。
// System.out.println(list.indexOf("abc22"));

//6,获取子列表。
// System.out.println(list.subList(1, 3));

System.out.println(list);

}

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