目录
集合是升级版的数组(这么理解应该是没有问题吧)
Arrays类
Arrays是一个工具类。Arrays类中提供了一些对数组进行操作的方法(比如:查找和排序)
public static int binarySearch(int[] array,int key)
对数组的元素进行二分查找
public static void sort(int[] array)
对数组进行排序。
public static String toString(int[] array)
把数组转换为字符串 格式:"[元素1,元素2,元素3]"
递归
方法自己调用自己,这种方式叫做递归。
这里也是代码思维的开始
Collection接口
Collection集合体系的根接口,该接口中定义了集合的通用方法。
迭代器遍历
在Java中所有的集合都可以使用迭代器(Iterator)进行遍历。
注意问题:
当使用迭代器进行遍历集合的时候,集合自己不能去操作集合中的元素。
Java不允许迭代器和集合自己并发的修改集合
否则java.util.ConcurrentModificationException(并发修改异常)解决方案:
使用迭代器自己的删除方法 it.remove()
Collection<String> coll=new ArrayList<>();
//添加元素
coll.add("土豆1");
coll.add("土豆2");
coll.add("土豆3");
//获取迭代器对象 (筷子)
Iterator<String> it = coll.iterator();
//判断是否有下一个元素
while (it.hasNext()){
//获取元素
String e = it.next();
System.out.println(e);
}
增强for遍历
增强for其实就是为了简化迭代器的代码书写,原理和迭代器一模一样。
Collection<String> coll=new ArrayList<>();
//添加元素
coll.add("土豆1");
coll.add("土豆2");
coll.add("土豆3");
//增强for
for(String s : coll){
System.out.println(s);
}
数据结构
数据的组织方式就叫做数据结构,不同的组织方式就形式不同的数据结构,每一种数据结构的特点不一样。
栈结构:先进后出 (子弹夹)
队列结构:先进先出 (排队、安检机)
数组:查询快,增删慢链表:查询慢,增删快(每一个元素记录下一个元素的地址
LinkedList类特有方法
由于 LinkedList底层是链表,新增了一些针对头和尾进行操作的方法。
public void addFirst(E e) 添加元素到集合开头 public void addLast(E e) 添加元素到集合末尾 public E removeFirst() 移除开头的元素 public E removeLast() 移除结尾的元素 public E getFirst() 获取开头的元素 public E getLast() 获取结尾的元素
---------------------------------------------------------------------------------------------------------
泛型
Java中如果在写代码的时候,不知道数据类是什么类型,那么就可以使用泛型。泛型其实就是任意的数据类型。
泛型可以使用在哪些地方?
泛型类: 在类名后面<T>, 它表示在类中有一个不确定的数据类型。
泛型方法: 在方法的返回值前面<T>,它表示在方法中有一个不确定的数据类型
泛型接口:在接口名后面<T>,它表示在接口中有一个不确定的数据类型
泛型的总结
1、类上的泛型<T>: 创建该类对象时,确定<T>的数据类型。
2.方法上的泛型<T>:调用方法的时候,确定<T>的数据类型。
3.接口上的泛型<T>:
1)在实现类上确定<T>的数据类型
2)把泛型<T>沿用到实现类上,在创建实现类对象来确定<T>的数据类型
泛型限定
<?> 表示可以接收任意的类型
<? extends Number> 表示可以接收Number或者Number的子类
<? super Number> 表示可以接收Number或者Number的父类
通配符
--------------------------------------------------------------------------------------------------------
Set集合
Set集合的特点:没有索引,元素不能重复
--HashSet:元素是没有顺序
--TreeSet:它可以对集合中的元素进行排序
TreeSet类
TreeSet集合可以对元素进行排序。有两种排序方式。
自然排序:让元素的类实现Comparable接口,复写compareTo方法
public class Student implements Comparable<Student>{
private String name;
private int age;
private int score;
//省略构造方法,自己加上即可
//实现Comparable接口重写方法来告诉TreeSet排序的规则
@Override
public int compareTo(Student o) {
//先按照成绩排序,
int num=this.score-o.score;
//如果成绩相同,再按照年龄排序
if(num==0){
num=this.age-o.age;
}
return num;
}
}
比较器排序Comparator,让集合具备比较规则。
//创建TreeSet集合,同时指定排序规则 需要一个Comparator对象。
TreeSet<Teacher> ts=new TreeSet<>(new Comparator<Teacher>() {
@Override
public int compare(Teacher o1, Teacher o2) {
//o1和o2 表示集合中已有的两个元素
//按照年龄升序排列
int num=o1.getAge()- o2.getAge();
//如果年龄相同,就按照姓名进行比较
if(num==0){
num=o1.getName().compareTo(o2.getName());
if(num==0){
//...
}
}
return num;
}
});
ts.add(new Teacher("zhagnasn",20));
ts.add(new Teacher("lisi",21));
ts.add(new Teacher("wangwu",22));
ts.add(new Teacher("aaaa",22));
ts.add(new Teacher("zhaoliu",24));
ts.add(new Teacher("zhaoliu",24));
for (Teacher t : ts) {
System.out.println(t);
}
-------------------------------------------------------------------------------------------
二叉树 (很难理解)
二叉树: 每一个节点,它最多有两个子节点
二叉查找树(二叉排序树、二叉搜索树):对于任意的一个节点,左边的子节点都比这个数小,右子节点都比这个数大。
二叉平衡树:每一个节点,左右两个子树的高度差不超过1
如果一个二叉树不平衡,如何达到平衡?
左旋:如果右子树比左子树的高度差大于1,就需要左旋
右旋:如果左子树比右子树的高度差大于1,就需要右旋
破坏平衡二叉树的几种情况,如何再次达到平衡
左左:在左子树的左边添加元素,直接右旋即可
左右:在左子树的右边添加元素,先左旋再右旋
右右:在右子树的右边添加元素,直接左旋即可
右左:在右子树的左边添加元素,先右旋再左旋
红黑树(很难理解)
红黑树的规则:
1.每一个节点都是红色或者黑色
2.如果一个节点没有子节点或者父节点,该节点的子节点(Nil),叶子节点都是黑色
3.根节点是黑色
4.对于一个红色节点,它的子节点都是黑色
5.对任意的节点,到其叶子节点的简单路径,包含相同的黑色节点数目。
红黑树添加元素:元素默认的颜色是红色
Map集合
Map表示的是双列集合,集合中的元素是成对出现的,一对元素包括【键和值】
Map集合中键是不能重复的,但是值是可以重复的。
Map接口
HashMap类
TreeMap类
Map集合的基本使用
//键和值都是String类
Map<String,String> map=new HashMap<>();//添加元素
map.put("猪八戒","高老庄");
map.put("孙悟空","花果山");
map.put("沙和尚","流沙河");
Map集合的常见方法
public V put(K key, V value)
把键和值添加到Map集合中; 如果键重复,新的值会替换旧的值。
把被修改的值返回。
public V get(Object key)
根据键或者值;如果找不到就返回null
public V remove(Object key)
根据键删除【键值对】
返回被删除的值。
public void clear()
清空集合的所有【键值对】public int size()
获取Map集合中有多少个【键值对】
public boolean containsKey(Object key)
判断是否包含键
public boolean containsValue(Object value)
判断是否包含值
Map集合的遍历
通过键获取值的方式遍历Map集合
HashMap<String,String> map=new HashMap<>();
map.put("李晨","范冰冰");
map.put("贾乃亮","李小璐");
map.put("王宝强","马蓉");//获取所有的键组成的Set集合
Set<String> keys = map.keySet();
for (String key : keys) {
//通过键获取值
String value = map.get(key);
System.out.println(key+"...."+value);
}
通过获取【键值对】的方式遍历Map集合
public Set<Map.Entry<K,V>> entrySet()
获取Map集合中所有的Entry对象,一个Entry对象表示一个【键值对】.//获取Entry对象的集合,Entry对象表示【键值对】
Set<Map.Entry<String, String>> entrys = map.entrySet();//遍历Set集合
for (Map.Entry<String, String> entry : entrys) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"...."+value);
}
HashMap集合的底层原理
通过查看源代码发现,HashSet集合底层其实就是HashMap集合,所以HashSet的底层原理和HashMap的底层原理是一模一样的。
HashMap集合的特点
1.键不能重复
2.保证键的唯一性通过复写键的hashCode和equals方法
TreeMap集合的底层原理
通过查看源代码发现, TreeSet集合底层其实就是TreeMap集合,所以TreeSet的底层原理和HashMap的底层原理是一模一样的。
TreeMap集合的特点
1.可以对键进行排序
2.键的排序方式,可以使用自然排序Comparable和比较器排序Comparator