集合框架
各种数据结构封装类
数据结构的类型:
1.连续存储
2.链式(非连续)
java集合框架有两大类:
1.Collection(一个元素只存储一个对象)list接口继承Collection接口
Set接口继承Collection接口2.Map(一个元素存储key-value两个对象)
HashMap直接实现Map接口
TreeMap直接实现Map接口
List接口
List接口的两个实现类分别是ArrayList
和LinkedList
。
ArrayList
以动态数组的形式存储数据。
声明:ArrayList<E> arraylist = new ArrayList<E>();
其中E是一种泛型,表示某一种类型。可以是String,也可以是自定类型,看其中存储的数据类型,【但是不能为int和char,只能是它们的包装类:Integer和Character】
ArrayList和Array的存储形式一致,因为ArrayList的底层实现就是使用Arrays.copyof().
这样的存储形式,保证了数据的有序性。便于查找,但是不便于添加,删除等操作。
而ArrayList和Array不同的是,它有自己的方法。用于操作数组。
ArrayList的常用方法
1:ArrayList.add(E e)
返回boolean类型,添加一个元素在列表末尾。
2: ArrayList.add(int index, E e);
返回void类型,在指定索引位置添加元素
3:ArrayList.addAll(Collection<? extends E> c);
返回boolen类型,将指定集合追加到列表的末尾
4:ArrayList.clear();
返回void类型,清除列表中的所有元素
5:ArrayList.get(int index);
返回E类型,通过指定索引返回指定索引元素。
6:ArrayList.isEmpty()
返回Boolean类型。判断列表中是否存在元素,Ture为不存在
7:ArrayList.remove(int index);
返回E类型,通过索引删除指定索引的元素。
8:ArrayList.remove(Object o)
返回boolean类型。通过匹配元素,删除匹配到的第一个元素。
9:ArrayList.set(int index, E element)
返回E类型。用指定元素替换指定索引位置的元素
10:ArrayList.size()
返回int类型,返回列表的元素个数。
LinkedList
以链表的形式存储数据
声明:LinkedList<E> linkedlist = new LinkedList<E>();
如上图所示,LinkedList是以链表的形式来存储数据的,和ArrayList不同的是:LinkedList方便添加、删除等操作,但是不便于遍历和查找。
从LinkedList的源码中可以看出它的成员变量有
Node<E> first
和Node<E> last
表示LinkedList的底层实现,是通过Node[节点]。
而通过节点来保存数据的话,只需要知道上一个节点和下一个节点。
故LinkedList方便于添加和删除,只需要改变上节点和下节点,不需要和ArrayList一样,要把每一个元素后移或前移。
Set接口
Set接口的两个实现类分别是HashSet
和treeSet
。
Set和List的区别在于,Set是无序无重复的。
HashSet
使用HashSet存储数据和List一致,只是不会存储重复数据。
News news1 = new News(1,"news1");
News news2 = new News(2,"news1");
News news3 = new News(3,"news1");
News news4 = new News(4,"news1");
Set<News> list = new HashSet<News>();
list.add(news1);
list.add(news3);
list.add(news2);
list.add(null);
list.add(news4);
System.out.println(list);
当用HashSet添加数据后,在输出列表,会发现数据是无序的。【】
TreeSet
TreeSet和HashSet的区别:TreeSet会按照自然规律或者重写的compare()方法排序
TreeSet<String> list = new TreeSet<String>();
list.add("1111");
list.add("2222");
list.add("4444");
list.add("7777");
list.add("6666");
list.add("9999");
list.add("3333");
list.add("8888");
System.out.println(list);
运行后,会发现输出列表的顺序都是排列好的。
当存储的数据类型为自定义类型时。需要实现比较器的接口,重写compare()方法。
方法1:自己新建一个类实现Comparator接口。然后实例化。传给TreeSet。
public class NewsComparator implements Comparator<News> {
@Override
public int compare(News o1, News o2) {
return o1.getId() - o2.getId();
}
}
News news1 = new News(1,"news1");
News news2 = new News(2,"news2");
News news3 = new News(3,"news3");
News news4 = new News(4,"news4");
NewsComparator nc = new NewsComparator();
TreeSet<News> list = new TreeSet<News>(nc);
list.add(news1);
list.add(news3);
list.add(news4);
list.add(news2);
方法2:直接在TreeSet中写匿名内部类
News news1 = new News(1,"news1");
News news2 = new News(2,"news2");
News news3 = new News(3,"news3");
News news4 = new News(4,"news4");
TreeSet<News> list = new TreeSet<News>(
new Comparator<News>() {
@Override
public int compare(News o1, News o2) {
return o1.getId() - o2.getId();
}
});
list.add(news1);
list.add(news3);
list.add(news4);
list.add(news2);
方法3:用lambda表达式写匿名内部类
News news1 = new News(1,"news1");
News news2 = new News(2,"news2");
News news3 = new News(3,"news3");
News news4 = new News(4,"news4");
TreeSet<News> list = new TreeSet<News>((o1,o2)->o2.getId() - o1.getId());
list.add(news1);
list.add(news3);
list.add(news4);
list.add(news2);
Map
使用key-value【键值对】的方式存储数据的结构
Map的两个实现类:
1.HashMap
2.TreeMap
Map的存储结构图
采用键值对的形式,每一个key对应一个value,因为map中的key是以Set集合存储的,故Map的存储也是无序的。
Map的声明:
1.Map<Integer,String> map = new HashMap<Integer, String>();
2.Map<Integer,String> map = new TreeMap<Integer, String>();
Map中的常用方法:
1.map.clear(); //清除map中的所有映射【即所有元素】
2.map.containsKey(key); //判断map中是否存在该key
3.map.containsValue(value) //判断map中是否存在该value
4.map.forEach(); //遍历map
5.map.get(key); //获取该key的value
6.map.isEmpty(); //判断map是否包含数据
7.map.keySet(); //返回key的Set集合
8.map.remove(key) //移除某个key和所对应的value
9.map.replace(key,value) //替换key所对应的value
10.map.size() //返回map的键值对数目
11.map.put(key,value) //在map中添加一个键值对,如果key重复,将替换之前的value
12.map.putAll(Map) //将另一个Map添加到map中,如果key重复,将替换。
HashMap和TreeMap的区别:
TreeMap和TreeSet的一样,都可以通过实现比较器接口来排序的。