文章中所列的都是一些常用的方法,具体更多的方法请见API
集合
(1)List:存储数据value;有序可重复
public static void main(String[] args) {
//实例化一个ArrayList对象
ArrayList dogs=new ArrayList();
//创建三只狗狗对象
Dog dog1=new Dog("二傻","哈士奇");
Dog dog2=new Dog("小短腿","柯基");
Dog dog3=new Dog("三傻","阿拉斯加");
//将狗狗对象存入ArrayList中
dogs.add(dog1);
dogs.add(dog2);
dogs.add(dog3);
//获取ArrayList长度
System.out.println("删除之前共有"+dogs.size()+"条狗狗");
//获取ArrayList.get()
//必须轻质转换成相应的数据类型
// Dog a=(Dog) dogs.get(0);
// System.out.println(a.getName()+":"+a.getType());
//删除元素
dogs.remove(0);
System.out.println("删除之前共有"+dogs.size()+"条狗狗");
System.out.println("分别是:");
for (Object x : dogs) {
System.out.println(((Dog) x).getName()+":"+((Dog) x).getType());
}
if(dogs.contains(dog2)) {
System.out.println("集合中包含"+dog2.getName()+"的信息");
}
System.out.println("*************************************************************");
System.out.println("使用Iterator遍历,所有狗狗昵称和品种是:");
Iterator it= dogs.iterator();
while(it.hasNext()) {
Dog dog = (Dog) it.next();
System.out.println(dog.getName()+"\t"+dog.getType());
}
}
public static void main(String[] args) {
LinkedList arr=new LinkedList();
Dog dog1=new Dog("大聪明","金毛");
Dog dog2=new Dog("二傻","哈士奇");
Dog dog3=new Dog("小短腿","柯基");
Dog dog4=new Dog("三傻","阿拉斯加");
arr.add(dog1);
arr.add(dog2);
arr.add(dog3);
arr.add(dog4);
//返回列表中的第一个元素
System.out.println("第一条狗的昵称是"+((Dog) arr.getFirst()).getName());
//返回列表中的最后一个元素
System.out.println("最后一条狗的昵称是"+((Dog) arr.getLast()).getName());
//删除元素
arr.remove(0);
arr.remove(dog4);
System.out.println("删除部分狗狗还剩"+arr.size()+"条");
System.out.println("分别是");
for (Object x : arr) {
Dog d=(Dog)x;
System.out.println("Dog ["+"name="+d.getName()+","+"type"+d.getType()+"]");
}
System.out.println("*************************************************************");
System.out.println("使用Iterator遍历,所有狗狗昵称和品种是:");
Iterator it= arr.iterator();
while(it.hasNext()) {
Dog dog = (Dog) it.next();
System.out.println(dog.getName()+"\t"+dog.getType());
}
}
Vector
ArrayList和Vector作为List的两个实现类,功能完全相同,可以相互替代。Vector是一个线程安全的类,而ArrayList是线程不安全的类。
什么时候都不推荐使用Vector。可以通过Collections工具类把ArrayList转换为线程安全的类。
-》java.util包
-》ArrayList早期版本 StringBuffer StringBuilder
-》Vector类似动态数据的形式存储数据,但是Vector扩容是以2倍的方式
-》构造方法:
-》无参构造方法
-》指定存储数据类型的构造方法
-》Vector线程是同步的,安全性高,效率
-》常用方法:增删改查
add()
remove()
set()
get()
size()
…
Stack 栈
-》java.utils包
-》数据存储特点:先进后出,后进先出
-》构造方法:通常是用无参构造方法
-》Stack特殊方法:
empty() 检测栈中元素是否为空
push() 将元素压入栈中
pop() 将栈顶的元素删除
peek() 查看栈顶的元素但是不删除
search() 查找元素在栈中的位置,查找出的索引从1开始
Queue 队列(接口)
-》java.utils包
-》是一个接口,实现数据的先进先出,后进后出的数据结构
-》常用的实现类:LinkedList、ArrayDeque
-》常用的方法对比
List接口中
add()
remove()
element()–>get()
Queue特有的方法
offer() 添加元素,相当于add
peek() 查看队列中第一个元素
poll() 删除队列底端的第一个元素
(2)Set
Set集合是无序的,不能存储重复元素,如果试图将两个相同的元素存储进set集合这个操作将失败。一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。
HashSet
HashSet是set接口的典型实现,HashSet是按照Hash算法来存存储集合中的数据,所以具有很好的存储和查询的性能。
HashSet具有以下特点:
1.它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变
2.HashSet不是同步的(不是线程安全的),如果多个线程同时访问一个HashSet,必须通过其他方式保证其同步。
3.集合中元素的值可以为null,但是只能有一个为null
public class Person {
private int id;
private String name;
private int age;
private String addr;
public Person() {
super();
}
public Person(int id, String name, int age, String addr) {
super();
this.id = id;
this.name = name;
this.age = age;
this.addr = addr;
}
// 如果Person对象的id和name相同则认为是同一个对象
@Override
public int hashCode() {
// 包装id和name的hashcode相同即可
return id + name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj != null && obj.getClass() == Person.class) {
Person otherPerson = (Person) obj;
// 下方的equals的调用String方法中的equals
if (otherPerson.getId() == this.getId() && otherPerson.getName().equals(this.getName())) {
return true;
}
}
return false;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + ", addr=" + addr + "]";
}
}
import java.util.HashSet;
import java.util.Set;
public class HashSetTest2 {
public static void main(String[] args) {
Set set = new HashSet();
//如果Person对象的id和name相同则认为是同一个对象
Person p1 = new Person(1, "张三", 33, "杭州西湖");
Person p2 = new Person(1, "张三", 34, "北京三里屯");
set.add(p1);
set.add(p2);
// 迭代set集合 有几个对象?
set.forEach(System.out::println);
}
}
public class User implements Comparable {
private int id;
private String name;
private int age;
public User() {
super();
}
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
// 如果要对一个对象实现比较 必须实现Comparable接口 然后重写compareTo方法 在这里方法里指定排序规则
@Override
public int compareTo(Object o) {
// 根据年龄排序
User u = (User) o;
// 则分别返回负整数、零或正整数。
return this.getAge() > u.getAge() ? 1 : this.getAge() < u.getAge() ? -1 : 0;
}
}
2.自定义排序
自定义排序是根据TreeSet的构造函数进行制定,TreeSet的构造函数可以接受一个comparator的函数式接口,所有可以使用Lambda表达式进行相关的排序操作。
import java.util.TreeSet;
public class TreeSetTest3 {
public static void main(String[] args) {
TreeSet set = new TreeSet((o1, o2) -> {
int a1 = (Integer) o1;
int a2 = (Integer) o2;
int temp = a2 - a1;
return temp == 0 ? 0 : temp;
});
set.add(12);
set.add(23);
set.add(3);
set.add(35);
set.add(8);
System.out.println(set);
}
}
Map用于保存具有映射关系的数据,所以map集合里保存的是一组数值,Map里以key-value的形式保存数据,其中key和value都可以是引用类型。其中Map里的key不允许出现重复。
HashMap
分析HashMap底层源码的实现
HashMap和Hashtable都是map集合的子类 并且他们之间的关系和ArrayList和Vector之间的关系是相同的,两种功能基本类似,并且在没有并发的情况下可以相关替代。 区别如下:
1.Hashtable是一个线程安全的类,HashMap是线程不安全的类,所以HashMap性能比Hashtable要好一些,但是如果有多个线程访问Map使用Hashtable类会更好一些。
2.Hastable不允许使用Null作为key和value。而HashMap允许使用null作为key和value值。HashMap中也只能有一个key值为null,而value不限制
TreeMap
是根据key值进行对map集合排序
import java.util.TreeMap;
public class TreeMapTest {
public static void main(String[] args) {
//TreeMap是根据key值的自然顺序完成排序
TreeMap map =new TreeMap();
Map map =new HashMap();
map.put(3, "Linux入门基础");
map.put(2, "Redis入门基础");
map.put(6, "Oracle入门基础");
map.put(8, "SpringMVC入门基础");
map.put(22, "SpringBoot入门基础");
map.forEach((key,value)->System.out.println(key+"---"+value));
System.out.println("----------------------------");
//取出排序完成的集合第一个和最后一个元素
System.out.println(map.firstEntry());
System.out.println(map.firstKey());
System.out.println(map.lastKey());
System.out.println(map.lastEntry());
System.out.println("-----------------------");
//比指定数据 小的和大的那个数据
System.out.println(map.higherKey(7));
System.out.println(map.lowerKey(7));
//截取集合中的部分数据
System.out.println(map.subMap(5, 20));
}
}