List接口
List接口中常用方法
1、List集合存储元素特点:有序可重复
有序:List集合中的元素有下标。
从0开始,以1递增。
可重复:存储一个1,还可以再存储1.
2、List既然是Collection接口的子接口,那么肯定List接口有自己“特色”的方法:
以下只列出List接口特有的常用的方法:
void add(int index, Object element)
Object set(int index, Object element)
Object get(int index)
int indexOf(Object o)
int lastIndexOf(Object o)
Object remove(int index)
3、迭代器迭代元素的过程中不能使用集合对象的remove方法删除元素,
要使用迭代器Iterator的remove方法来删除元素,防止出现异常:
ConcurrentModificationException
以上几个方法不需要死记硬背,可以自己编写代码测试一下,理解一下,
以后开发的时候,还是要翻阅帮助文档。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List;
public class ListTest01 { public static void main(String[] args) { List myList = new ArrayList();
myList.add("A"); myList.add("B"); myList.add("C"); myList.add("C"); myList.add("D");
myList.add(1, "KING");
Iterator it = myList.iterator(); while(it.hasNext()){ Object elt = it.next(); System.out.println(elt); }
Object firstObj = myList.get(0); System.out.println(firstObj);
for(int i = 0; i < myList.size(); i++){ Object obj = myList.get(i); System.out.println(obj); }
System.out.println(myList.indexOf("C"));
System.out.println(myList.lastIndexOf("C"));
myList.remove(0); System.out.println(myList.size());
System.out.println("====================================");
myList.set(2, "Soft");
for(int i = 0; i < myList.size(); i++){ Object obj = myList.get(i); System.out.println(obj); } } }
|
ArrayList集合
1、默认初始化容量10(底层先创建了一个长度为0的数组,当添加第一个元素的时候,初始化容量10。)
2、集合底层是一个Object[]数组。
3、构造方法:
new ArrayList();
new ArrayList(20);
4、ArrayList集合的扩容:
增长到原容量的1.5倍。
ArrayList集合底层是数组,怎么优化?
尽可能少的扩容。因为数组扩容效率比较低,建议在使用ArrayList集合的时候预估计元素的个数,给定一个初始化容量。
5、数组优点:
检索效率比较高。(每个元素占用空间大小相同,内存地址是连续的,知道首元素内存地址,然后知道下标,通过数学表达式计算出元素的内存地址,所以检索效率最高。)
6、数组缺点:
随机增删元素效率比较低。
另外数组无法存储大数据量。(很难找到一块非常巨大的连续的内存空间。)
7、向数组末尾添加元素,效率很高,不受影响。
8、面试官经常问的一个问题?
这么多的集合中,你用哪个集合最多?
答:ArrayList集合。
因为往数组末尾添加元素,效率不受影响。
另外,我们检索/查找某个元素的操作比较多。
9、ArrayList集合是非线程安全的。(不是线程安全的集合。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| import java.util.ArrayList; import java.util.List;
public class ArrayListTest01 { public static void main(String[] args) {
List list1 = new ArrayList(); System.out.println(list1.size());
List list2 = new ArrayList(20); System.out.println(list2.size());
list1.add(1); list1.add(2); list1.add(3); list1.add(4); list1.add(5); list1.add(6); list1.add(7); list1.add(8); list1.add(9); list1.add(10);
System.out.println(list1.size());
list1.add(11); System.out.println(list1.size());
} }
|
集合ArrayList的构造方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List;
public class ArrayListTest02 { public static void main(String[] args) {
List myList1 = new ArrayList();
List myList2 = new ArrayList(100);
Collection c = new HashSet(); c.add(100); c.add(200); c.add(900); c.add(50);
List myList3 = new ArrayList(c); for(int i = 0; i < myList3.size(); i++){ System.out.println(myList3.get(i)); } } }
|
二进制位运算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
public class BinaryTest { public static void main(String[] args) {
System.out.println(10 >> 1);
System.out.println(10 << 1); } }
|
单向链表
Link.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| public class Link<E> { public static void main(String[] args) { Link<String> link = new Link<>(); link.add("abc");
}
Node header;
int size = 0;
public int size(){ return size; }
public void add(E data){ if(header == null){ header = new Node(data, null); }else { Node currentLastNode = findLast(header); currentLastNode.next = new Node(data, null); } size++; }
private Node findLast(Node node) { if(node.next == null) { return node; } return findLast(node.next); }
public void remove(Object obj){
}
public void modify(Object newObj){
}
public int find(Object obj){ return 1; } }
|
Node.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class Node {
Object data;
Node next;
public Node(){
}
public Node(Object data, Node next){ this.data = data; this.next = next; } }
|
Test.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Test { public static void main(String[] args) { Link link = new Link();
link.add("abc"); link.add("def"); link.add("xyz");
System.out.println(link.size());
} }
|
理解数据结构
优缺点是重点!
链表的优点:
由于链表上的元素在空间存储上内存地址不连续。
所以随机增删元素的时候不会有大量元素位移,因此随机增删效率较高。
在以后的开发中,如果遇到随机增删集合中元素的业务比较多时,建议使用LinkedList。
链表的缺点:
不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头节点开始遍历,直到找到为止。所以LinkedList集合检索/查找的效率较低。
ArrayList:把检索发挥到极致。(末尾添加元素效率还是很高的。)
LinkedList:把随机增删发挥到极致。
加元素都是往末尾添加,所以ArrayList用的比LinkedList多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import java.util.ArrayList; import java.util.LinkedList; import java.util.List;
public class LinkedListTest01 { public static void main(String[] args) { List list = new LinkedList(); list.add("a"); list.add("b"); list.add("c");
for(int i = 0; i <list.size(); i++){ Object obj = list.get(i); System.out.println(obj); }
List list2 = new LinkedList();
list2.add("123"); list2.add("456"); list2.add("789");
for(int i = 0; i < list2.size(); i++){ System.out.println(list2.get(i)); }
} }
|
Vector
1、底层也是一个数组。
2、初始化容量:10
3、怎么扩容的?
扩容之后是原容量的2倍。
10–> 20 –> 40 –> 80
4、ArrayList集合扩容特点:
ArrayList集合扩容是原容量1.5倍。
5、Vector中所有的方法都是线程同步的,都带有synchronized关键字,
是线程安全的。效率比较低,使用较少了。
6、怎么将一个线程不安全的ArrayList集合转换成线程安全的呢?
使用集合工具类:
java.util.Collections;
java.util.Collection 是集合接口。
java.util.Collections 是集合工具类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| import java.util.*;
public class VectorTest { public static void main(String[] args) { List vector = new Vector();
vector.add(1); vector.add(2); vector.add(3); vector.add(4); vector.add(5); vector.add(6); vector.add(7); vector.add(8); vector.add(9); vector.add(10);
vector.add(11);
Iterator it = vector.iterator(); while(it.hasNext()){ Object obj = it.next(); System.out.println(obj); }
List myList = new ArrayList();
Collections.synchronizedList(myList);
myList.add("111"); myList.add("222"); myList.add("333"); } }
|
泛型
1、JDK5.0之后推出的新特性:泛型
2、泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的。(运行阶段泛型没用!)
3、使用了泛型好处是什么?
第一:集合中存储的元素类型统一了。
第二:从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”!
4、泛型的缺点是什么?
导致集合中存储的元素缺乏多样性!
大多数业务中,集合中元素的类型还是统一的。所以这种泛型特性被大家所认可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| import java.util.ArrayList; import java.util.Iterator; import java.util.List;
public class GenericTest01 { public static void main(String[] args) {
List<Animal> myList = new ArrayList<Animal>();
Cat c = new Cat(); Bird b = new Bird();
myList.add(c); myList.add(b);
Iterator<Animal> it = myList.iterator(); while(it.hasNext()){
Animal a = it.next(); if(a instanceof Cat) { Cat x = (Cat)a; x.catchMouse(); } if(a instanceof Bird) { Bird y = (Bird)a; y.fly(); } } } }
class Animal { public void move(){ System.out.println("动物在移动!"); } }
class Cat extends Animal { public void catchMouse(){ System.out.println("猫抓老鼠!"); } }
class Bird extends Animal { public void fly(){ System.out.println("鸟儿在飞翔!"); } }
|
自动类型推断机制(又称为钻石表达式):
List list = new ArrayList<>();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| import java.util.ArrayList; import java.util.Iterator; import java.util.List;
public class GenericTest02 { public static void main(String[] args) {
List<Animal> myList = new ArrayList<>();
myList.add(new Animal()); myList.add(new Cat()); myList.add(new Bird());
Iterator<Animal> it = myList.iterator(); while(it.hasNext()){ Animal a = it.next(); a.move(); }
List<String> strList = new ArrayList<>();
strList.add("http://www.126.com"); strList.add("http://www.baidu.com"); strList.add("http://www.bjpowernode.com");
Iterator<String> it2 = strList.iterator(); while(it2.hasNext()){
String s = it2.next(); String newString = s.substring(7); System.out.println(newString); } } }
|
自定义泛型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
public class GenericTest03<标识符随便写> {
public void doSome(标识符随便写 o){ System.out.println(o); }
public static void main(String[] args) {
GenericTest03<String> gt = new GenericTest03<>();
gt.doSome("abc");
GenericTest03<Integer> gt2 = new GenericTest03<>(); gt2.doSome(100);
MyIterator<String> mi = new MyIterator<>(); String s1 = mi.get();
MyIterator<Animal> mi2 = new MyIterator<>(); Animal a = mi2.get();
} }
class MyIterator<T> { public T get(){ return null; } }
|
foreach
对数组怎么遍历?
for(int i : arr){
System.out.println(i);
}
对集合怎么遍历?
for(String s : list){
System.out.println(s);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
public class ForEachTest01 { public static void main(String[] args) {
int[] arr = {432,4,65,46,54,76,54};
for(int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }
System.out.println("======================================"); for(int data : arr) { System.out.println(data); } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| import java.util.ArrayList; import java.util.Iterator; import java.util.List;
public class ForEachTest02 { public static void main(String[] args) { List<String> strList = new ArrayList<>();
strList.add("hello"); strList.add("world!"); strList.add("kitty!");
Iterator<String> it = strList.iterator(); while(it.hasNext()){ String s = it.next(); System.out.println(s); }
for(int i = 0; i < strList.size(); i++){ System.out.println(strList.get(i)); }
for(String s : strList){ System.out.println(s); }
List<Integer> list = new ArrayList<>(); list.add(100); list.add(200); list.add(300); for(Integer i : list){ System.out.println(i); } } }
|