迭代器的细节注意点:
1.报错NoSuchElementException
2.迭代器遍历完毕,指针不会复位
3.循环中只能用一次next方法
4.迭代器遍历时,不能用集合的方法进行增加或者删除
1.迭代器在遍历集合的时候是不依赖索引的2.迭代器需要掌握三个方法:
Iterator it = list.iterator( );while( it.hasNext()){
string str = it.next( );system.out.println(str);
}
3.迭代器的四个细节:
如果当前位置没有元素,还要强行获取,会报NoSuchElementException
迭代器遍历完毕,指针不会复位
循环中只能用一次next方法
增强for遍历
增强for的底层就是迭代器,为了简化迭代器的代码书写的。
它是JDK5之后出现的,其内部原理就是一个lterator迭代器
所有的单列集合和数组才能用增强for进行遍历。
//1.创建集合并添加元素
collection<String> coll = new ArrayList<>();
coll.add("zhangsan");
coll.add("lisi");
coll.add("wangwu");
//2.利用增强for进行遍历//注意点:
//s其实就是一个第三方变量,在循环的过程中依次表示集合中的每一个数据
for(String s : coll){
System.out.println(s);
}
增强for格式:
for(数据类型变量名:集合/数组){
}
快速生成方式:
集合的名字+ for 回车
增强for的细节
修改增强for中的变量,不会改变集合中原本的数据。
//1.创建集合并添加元素
collection<string> coll = new ArrayList<>();
coll.add( "zhangsan");
coll.add( "1isi");
coll.add( "wangwu" );
//2.利用匿名内部类的形式
//底层原理:
//其实也会自己遍历集合,依次得到每一个元素
//把得到的每一个元素,传递给下面的accept方法
//s依次表示集合中的每一个数据
coll.forEach( new Consumer<String>( ) {
@Override
public void accept( String s) {
system.out.println( s );
}
});
// lambda表达式
coll.forEach(s -> system.out.println(s)) ;
List系列集合独有的方法:
void add(int index,E element)
在此集合中的指定位置插入指定的元素
E remove(int index)
删除指定索引处的元素,返回被删除的元素
E set(int index,E element)
修改指定索引处的元素,返回被修改的元素
E get(int index)
返回指定索引处的元素
//1.迭代器
Iterator<String> it = list.iterator( );
while(it.hasNext( )){
string str = it.next( );
system.out.println(str);
}
//2.增强for
//下面的变量s,其实就是一个第三方的变量而已。//在循环的过程中,依次表示集合中的每一个元素
for (string s : list) {
system.out.println( s ) ;
}
// 3.Lambda表达式
//forEach方法的底层其实就是一个循环遍历,依次得到集合中的每一个元素//并把每一个元素传递给下面的accept方法
//accept方法的形参s,依次表示集合中的每一个元素
list.forEach(s->system.out.println(s) );
//4.普通for循环
//size方法跟get方法还有循环结合的方式,利用索引获取到集合中的每一个元素
for (int i = o; i < list.size(); i++) {
//i:依次表示集合中的每一个索引
string s = list.get(i);
system.out.println(s);
}
常见的数据结构
LinkedList集合
底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的。
泛型深入
**泛型:**是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
泛型的格式:<数据类型>
**注意:**泛型只能支持引用数据类型。
这个就是泛型
//1.创建集合的对象
ArrayList<String> list = new ArrayList<>();
//2.添加数据
//list.add( 123);
list.add( "aaa");
// list.add(new Student( "zhangsan",123));
//3.遍历集合获取里面的每一个元素
Iterator<String> it = list.iterator();
while(it.hasNext()){
string str = it.next();
//多态的弊端是不能访问子类的特有功能
//obj.length( );
//str.length( );
system.out.println(str);
}
泛型的好处
统一数据类型。
把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。
泛型不具备继承性,但是数据具备继承性
此时我们就可以使用泛型的通配符:
?也表示不确定的类型
他可以进行类型的限定
? extehds E:表示可以传递E或者E所有的子类类型
? super E:表示可以传递E或者E所有的父类类型
应用场景:
1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。
2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符
泛型的通配符:
关键点:可以限定类型的范围。
4.哪里定义泛型?
数据结构(二叉树)遍历方式
数据结构(平衡二叉树)旋转机制
规则1:左旋
规则2:右旋
触发时机:当添加一个节点之后,该树不再是一颗平衡二叉树
set系列集合
//1.创建一个Set集合的对象
set<String> s = new Hashset<>();
//2,添加元素
//如果当前元素是第一次添加,那么可以添加成功,返回true
//如果当前元素是第二次添加,那么添加失败,返回false
HashSet集合底层采取哈希表存储数据
哈希表是一种对于增删改查数据性能都较好的结构
哈希表组成
JDK8之前:数组+链表
JDK8开始:数组+链表+红黑树
哈希值
对象的哈希值特点
TreeSet集合默认的规则
对于数值类型:Integer , Double,默认按照从小到大的顺序进行排序。
对于字符、字符串类型;按照字符在ASCII码表中的数字升序进行排序。
//1.创建Map集合的对象
Map<String, string> m = new HashMap<>();
//2.添加元素
// put方法的细节:
//添加/覆盖
//在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中
//在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。
m.put("郭靖","黄蓉");
m.put("韦小宝","沐剑屏");
m.put("尹志平","小龙女");
string value = m.put("韦小宝","双儿");
system.out.println(value);
//3.打印集合
system.out.println(m); //???
//Map集合的第一种遍历方式
//1.创建Map集合的对象
Map<String,string> map = new HashMap<>();
//2.添加元素
map.put("尹志平","小龙女");
map.put("郭靖","穆念慈");
map.put("欧阳克","黄蓉");
//3.通过键找值
//3.1获取所有的键,把这些键放到一个单列集合当中
set<String> keys = map.keySet();
//3.2遍历单列集合,得到每一个键
for ( string key : keys) {
//system.out.println( key ) ;
//3.3利用map集合中的键获取对应的值
getstring value = map.get(key);
system.out.print1n(key + " =" + value);
}
public class A03_MapDemo3 {
public static void main(String[ ] args) {
//Map集合的第二种遍历方式
//1.创建Map集合的对象
Map<String,string> map = new HashMap<>();
//2.添加元素
//键:人物的外号//值:人物的名宁
map.put("标枪选手","马超");
map.put("人物挂件","明世隐");
map.put("御龙骑士","尹志平");
//3.Map集合的第二种遍历方式/通过键值对对象进行遍历
//3.1通过一个方法获取所有的键值对对象,返回一个Set集合
Set<Map.Entry<string,string>> entries = map.entrySet();
//3.2遍历entries这个集合,去得到里面的每一个键值对对象
for (Map.Entry<String,String> entry : entries) {//entry ---’“人物挂件" ,"明世稳"
//3.3 利用entry调用get方法获取键和值
string key = entry.getKey( );
string value = entry.getvalue();
system.out.print1n(key + "=" + value);