Java学习笔记-4
一、List接口
有序,存取顺序一致有索引值允许元素重复
含索引值的方法
add(int index, E element) 将元素添加至索引值对应位置,后面的元素后移get(int index) 返回相应位置元素remove(int index) 移除指定位置元素并返回该元素set(int index, E element) 用元素替换相应位置元素,返回被替换的元素
1.ArrayList
底层为数组,查询快,增删慢
2.LinkedList
底层为双向链表,增删快,查找慢 有多个对首尾元素进行操作的方法
1.addFirst,addLast方法将元素插入首/尾 2.push方法将元素推入堆栈(等效于addFirst) 3.removeFirst,removeLast方法将首/尾元素移除并返回 4.pop方法从堆栈中弹出元素(等效于removeFirst) 5.getFirst/getLast获取首尾元素
3.Vector
与ArrayList类似,较少使用
二、Set接口
不允许重复无索引值,不能使用for循环遍历
1.HashSet
哈希值为十进制逻辑地址(==比较的是物理地址),通过hashCode方法可获得,String类重写了hashCode方法
add方法会调用hashCode方法,如果出现相同哈希值会调用equals方法,相同则不再存储 底层为哈希表(因此存储的元素必须重写hashCode和equals方法)
重写函数可通过Alt+insert快捷完成
哈希表=数组+链表(同组元素过多时转为红黑树),数组存储各元素哈希值,哈希值相同的元素在一个分组下以链表形式存储,多于8个时转为红黑树存储,查询速度快
存取顺序不一定一致 遍历可以使用迭代器或for each循环
2.LinkedHashSet
将HashSet的链表改为双向链表,是有序的HashSet,仍然不允许重复
三、可变参数方法
修饰符 返回类型 方法名(参数类型
...形参名)
{}
适用于确定参数类型不确定参数数量的方法一个方法的参数列表只能有一个可变参数(可以直接Obj类型)多个参数时可变参数必须放在参数列表末尾
四、Collections集合方法
均为静态方法,直接用Collections类名调用
1.添加多个元素到指定集合中
Collections
.addAll(集合名
,元素
1、元素
2...);
2.打乱集合
Collections
.shuffle(集合名
);
3.按默认规则排序(升序/自然顺序)
被排序的集合元素类型必须重写了Comparable接口下的compareTo方法
方法返回当前数据成员-参数对应数据成员即为升序排序
package day3
;
public class Person implements Comparable<Person> {
private String name
;
private int age
;
public Person(String name
, int age
) {
this.name
= name
;
this.age
= age
;
}
@Override
public String
toString() {
return "Person{" +
"name='" + name
+ '\'' +
", age=" + age
+
'}';
}
public String
getName() {
return name
;
}
public void setName(String name
) {
this.name
= name
;
}
public int getAge() {
return age
;
}
public void setAge(int age
) {
this.age
= age
;
}
@Override
public int compareTo(Person p
) {
return this.getAge() - p
.getAge();
}
}
4)按传入的比较器排序
在主类中重写Comparator(在util包中)下的compare方法(对两个参数对象进行比较,不涉及当前对象)
Collections
.sort(list3
, new Comparator<Person>() {
@Override
public int compare(Person p1
, Person p2
) {
return p2
.getAge() - p1
.getAge();
}
});
package day3
;
import java
.util
.*
;
public class day3 {
public static int add(int...array
)
{
int sum
= 0;
for(int i
:array
)
{
sum
+=i
;
}
return sum
;
}
public static void main(String args
[])
{
List
<String> list
= new ArrayList<>();
list
.add("AAA");
list
.add("CCC");
list
.add("EEE");
list
.add(1,"BBB");
list
.set(3,"DDD");
System
.out
.println(list
);
Iterator
<String> it
=list
.iterator();
while(it
.hasNext())
{
System
.out
.println(it
.next());
}
System
.out
.println();
for(String s
: list
)
{
System
.out
.println(s
);
}
System
.out
.println();
LinkedList
<String> linked
= new LinkedList<>();
linked
.add("B");
linked
.add("C");
linked
.addFirst("A");
System
.out
.println(linked
);
System
.out
.println();
HashSet
<Integer> set
= new HashSet<>();
set
.add(2);
set
.add(4);
set
.add(6);
set
.add(2);
for(Integer i
: set
)
{
System
.out
.println(i
);
}
LinkedHashSet
<String> linkedSet
= new LinkedHashSet<>();
linkedSet
.add("aaa");
linkedSet
.add("ccc");
linkedSet
.add("888");
System
.out
.println(linkedSet
);
System
.out
.println();
System
.out
.println(day3
.add(1,2,3,4,5,6));
ArrayList
<Integer> list2
= new ArrayList<>();
Collections
.addAll(list2
,1,2,3,4,5,6,7);
System
.out
.println(list2
);
Collections
.shuffle(list2
);
System
.out
.println(list2
);
Collections
.sort(list2
);
System
.out
.println(list2
);
ArrayList
<Person> list3
= new ArrayList<>();
Collections
.addAll(list3
,new Person("张三",18),
new Person("李四",20),new Person("王五",17));
System
.out
.println(list3
);
Collections
.sort(list3
);
System
.out
.println(list3
);
Collections
.sort(list3
, new Comparator<Person>() {
@Override
public int compare(Person p1
, Person p2
) {
return p2
.getAge() - p1
.getAge();
}
});
System
.out
.println(list3
);
}
}