怎么自己做整人网站150m网站空间流量大吗
2026/6/20 1:52:53 网站建设 项目流程
怎么自己做整人网站,150m网站空间流量大吗,it运维系统详细设计,产品推广找哪家公司Java进阶06 集合 一、集合及其体系结构 集合是一个长度可变的容器 1、集合的体系结构 1.1 单列集合单列集合使用add()方法添加集合元素#xff0c;一次只能添加一个元素。单列集合均实现了Collection接口#xff0c;该接口还有两个子接口List和Set。List接口 List集合的特点是…Java进阶06 集合一、集合及其体系结构集合是一个长度可变的容器1、集合的体系结构1.1 单列集合单列集合使用add()方法添加集合元素一次只能添加一个元素。单列集合均实现了Collection接口该接口还有两个子接口List和Set。List接口List集合的特点是存取有序、有索引、可以存储重复的包含ArrayList、LinkedList两个集合Set接口Set集合的特点是存取无序、没有索引、不可以存储重复的包含TreeSet、HashSet、LinkedHashSet1.2 双列集合双列集合使用put()方法添加集合元素一次可以添加两个元素。双列集合均实现了Map接口双列集合包括TreeMap、HashMap、LinkedHashMap二、Collection的使用方法名说明public booleanadd(E e)把给定的对象添加到当前集合中返回是否添加成功public voidclear()清空集合中所有的元素public booleanremove(E e)把给定的对象在当前集合中删除返回是否删除成功public booleancontains(Object obj)判断当前集合中是否包含给定的对象public booleanisEmpty()判断当前集合是否为空public intsize()返回集合中元素的个数/集合的长度注意事项remove()、contains()底层都是依赖equals方法clear()是清空集合中所有元素不是销毁集合容器。清空后还是可以继续往集合中添加元素的三、集合遍历方式5种1、普通for循环ArrayListString list new ArrayList(); ? for (int i 0; i list.size(); i) { ? ?String s list.get(i); }2、迭代器遍历2.1 Collection接口的方法方法说明public Iteratoriterator()获取遍历集合的迭代器对象public booleanhasNext()判断集合中是否还有元素public Enext()取出集合中元素并且将指针向后移动一位2.2 迭代器遍历public class CollectionDemo2 { ? ?public static void main(String[] args) { ? ? ? ?//多态创建集合容器左边为接口引用右边为实现类对象 ? ? ? ?CollectionStudent c new ArrayList(); ? ? ? ? ? ? ? ?c.add(new Student(张三, 23)); ? ? ? ?c.add(new Student(李四, 24)); ? ? ? ?c.add(new Student(王五, 25)); ? ? ? ? ? ? ? ?// 1. 获取迭代器 其实这句代码相当于 IteratorStudent it new Itr(); ? ? ? ?IteratorStudent it c.iterator(); ? ? ? ?// 2. 循环的判断, 集合中是否还有元素 ? ? ? ?while (it.hasNext()) { ? ? ? ? ? ?// 3. 通过迭代器取出集合的元素 ? ? ? ? ? ?Student stu it.next(); ? ? ? ? ? ?System.out.println(stu.getName() --- stu.getAge()); ? ? ? ? ? ? ? ? ? ? ? ?//这样调用会出现信息错乱 ? ? ? ? ? ?System.out.println(it.next().getName() --- it.next().getAge()); ? ? ? } ? } }**注意**next()方法每调用一次迭代器指针会后移一位就会把不同集合元素的信息拼接到一起打印为了避免这种信息错乱建议在循环中next()只调用一次2.3 迭代器源码分析private class Itr implements IteratorE { ? ?//定义游标表示指针指向 ? ?int cursor; ? ? ? ?public boolean hasNext() { ? ? ? ?//判断指针值是否等于集合长度 ? ? ? ?return cursor ! size; ? ? ? } ? ? ? ? ?public E next() { ? ? ? ?//定义i变量记录当前指针所指向的元素下标 ? ? ? ?int i cursor; ? ? ? ? ? ? ? ?//指针后移 ? ? ? ?cursor i 1; ? ? ? ? ? ? ? ?//返回i队应下标所记录的元素值 ? ? ? ?return (E) elementData[lastRet i]; ? ? } }3、增强for循环增强for循环是JDK5之后出现的其内部原理就是一个Iterator迭代器它简化迭代器的代码书写是迭代器遍历的语法糖。3.1 格式for(元素的数据类型 变量名 : 数据或者集合){ }快捷键需要迭代的集合.for再回车3.2 Demopublic class CollectionDemo3 { ? ?public static void main(String[] args) { ? ? ? ?CollectionStudent c new ArrayList(); ? ? ? ?c.add(new Student(张三, 23)); ? ? ? ?c.add(new Student(李四, 24)); ? ? ? ?c.add(new Student(王五, 25)); ? ? ? ? ?//增强for循环遍历集合 ? ? ? ?for (Student stu : c) { ? ? ? ? ? ?System.out.println(stu); ? ? ? } ? ? ? ? ?System.out.println(----------------------); ? ? ? ? ?//增强for循环遍历数组 ? ? ? ?int[] nums {11, 22, 33}; ? ? ? ?for (int num : nums) { ? ? ? ? ? ?System.out.println(num); ? ? ? } ? } }注意细节增强for循环遍历数组时循环变量直接代表每一份元素并不是下标。为了避免和出错和fori搞混这个循环变量我们一般不会取名为i4、foreach方法//遍历集合 default void forEach(Consumer? super Iaction)跟进源码后发现该方法需要的参数Consumer是一个接口类型那么我们就要传入该接口的实现类对象可以创建一个并传入。然而源码中验证该接口还是一个函数式接口因此可以传入匿名内部类还可以将其改写成Lambda表达式。public class CollectionDemo4 { ? ?public static void main(String[] args) { ? ? ? ?CollectionStudent c new ArrayList(); ? ? ? ?c.add(new Student(张三,23)); ? ? ? ?c.add(new Student(李四,24)); ? ? ? ?c.add(new Student(王五,25)); ? ? ? ? ?//匿名内部类写法 ? ? ? ?c.forEach(new ConsumerStudent() { ? ? ? ? ? ?Override ? ? ? ? ? ?public void accept(Student student) { ? ? ? ? ? ? ? ?System.out.println(student); ? ? ? ? ? } ? ? ? }); ? ? ? ? ?//Lambda表达式写法 ? ? ? ?c.forEach(s- System.out.println(s)); ? } }5、ListIterator遍历继承了Iterator是List集合派系所特有的迭代器遍历方式与Iterator遍历类似但也有其特殊之处它内部含有hasPrevious()方法和previous()方法可以配合使用进行倒序遍历前提是必须要先正序遍历让指针移至最后否则倒叙遍历没有效果public static void main(String[] args) { ? ? ? ?ListString list new ArrayList(); ? ? ? ? ?list.add(张三); ? ? ? ?list.add(李四); ? ? ? ?list.add(王五); ? ? ? ? ? ?ListIteratorString it list.listIterator(); ? ? ? ? ?//正序遍历 ? ? ? ?while (it.hasNext()) { ? ? ? ? ? ?String s it.next(); ? ? ? ? ? ?System.out.println(s); ? ? ? } ? ? ? ? ?System.out.println(---------------------------------); ? ? ? ? ?//倒序遍历前提必须先正序遍历让指针后移至最后否则没有效果 ? ? ? ?while (it.hasPrevious()) { ? ? ? ? ? ?String s it.previous(); ? ? ? ? ? ?System.out.println(s); ? ? ? } ? }四、List接口list接口因为支持索引所以多了很多索引操作的独特API方法名说明voidadd(int index,E element)在此集合中的指定位置插入指定的元素Eremove(int index)删除指定索引处的元素返回被删除的元素Eset(int index,E element)修改指定索引处的元素返回被修改的元素Eget(int index)返回指定索引处的元素五、数据结构数据结构是计算机底层存储、组织数据的方式是指数据相互之间是以什么方式排列在一起的1、栈和队列栈队列一端开口栈顶一端封闭栈底两端均开口栈顶出入栈队尾入队队头出队后进先出先进先出2、数组和链表数组链表内存连续区域在内存中游离不连续查询速度快通过地址和索引定位查任意数据耗时相同查询速度慢没有索引无论查询哪个数据都要从头遍历增删效率低增删有可能大批量的移动数组中其他元素增删效率相对数组快增删不用移动大量元素只需修改指针即可单链表双链表链表元素在内存中是游离的其中每个结点是独立的对象在内存中不是连续的每个结点有自己的存储地址包含其存储的具体数据值和下一个结点的地址。见名知义单链表即链接方向是单向的对链表的访问要通过顺序读取从头部开始。双链表的链接方向是双向的即每个数据结点中都有两个指针分别指向直接后继和直接前驱。因此双向链表首尾操作极快六、ArrayList类LinkedList类1、ArrayList类ArrayList底层是基于数组实现的所以查询元素快增删相对慢1.1 ArrayList长度可变原理ArrayList底层是数据结构数组默认长度为10当数组添加满了之后会自动扩容为1.5倍扩容时会先将原数组数据拷贝到新数组中再将新元素添加到新数组1.2 ArrayList源码解析①使用空参构造器创建的集合在底层创建一个默认长度为0的数组②添加第一个元素时底层会创建一个新的长度为10的数组③存满时会扩容1.5倍2、LinkedList类LinkedList底层基于双链表实现的查询元素慢增删首尾元素是非常快的特有方法说明public void addFirstE e在该列表开头插入指定的元素public void addLastE e将指定的元素追加到此列表的末尾public E getFirst返回此列表中的第一个元素public E getLast返回此列表中的最后一个元素public E removeFirst从此列表中删除并返回第一个元素public E removeLast从此列表中删除并返回最后一个元素**注意:**LinkedList的get()方法表面看起来是根据索引获取元素实际并非如此。它的原理很简答是通过遍历链表来查找指定索引的元素。具体来说get()方法从链表的表头开始遍历它经过一个节点就将计数器加一。当计数器的值等于要查找的索引时get()方法就返回该节点的元素值否则继续遍历直到表尾。七、泛型JDK5引入泛型可以在编译阶段约束操作的数据类型并进行检查。使用泛型的**好处是统一数据类型将运行期的错误提升到了编译期。**泛型中只能编写引用型数据如果不指定泛型的具体类型则系统默认创建Object对象1、泛型类1.1 使用场景当类中的属性或是方法却无法确定具体类型时可以设计泛型类1.2 确定具体类型在创建对象的时候确定到具体数据类型//泛型类 public class ArrayListE{ ? ?private E e; ? ?public E getE(){ ? ? ? ?return e; ? } ? ?public void setE(E e){ ? ? ? ?this.e e; ? } } ? public static void main(String[] args){ ? ?//创建对象指定类型为Integer ? ?StudentInteger stu new Student; }2、泛型方法2.1 非静态泛型方法泛型是根据类的泛型去匹配的public class ArrayListE{ ? ?public boolean add(E e){ ? } }2.2 静态泛型方法需要声明出自己独立的泛型public staticT void printArray(T[] array){} public class Demo3 { ? ?public static void main(String[] args) { ? ? ? ?Integer[] arr1 {11,22,33}; ? ? ? ?Double[] arr2 {11.1,22.2,33.3}; ? ? ? ?String[] arr3 {张三,李四,王五}; ? ? ? ? ?printArray(arr1); ? ? ? ?printArray(arr2); ? ? ? ?printArray(arr3); ? } ? ? ?//该方法在main函数中调用因此必须是static修饰又想接收各种类型所以自己定义独立的泛型 ? ?private staticT void printArray(T[] arr) { ? ? ? ?System.out.print([); ? ? ? ?for (int i 0; i arr.length-1; i) { ? ? ? ? ? ?System.out.print(arr[i],); ? ? ? } ? ? ? ?System.out.println(arr[arr.length-1]]); ? } }3、泛型接口3.1 使用场景接口中的某个抽象方法确定不了参数的具体类型就可以声明泛型让该方法的泛型去匹配接口的泛型3.2 确定具体数据类型类实现接口时如果接口带有泛型有两种操作方式类实现接口的时候直接确定类型实现类延续接口的泛型等创建对象的时候再确定//泛型接口interface Inter{? ?//抽象方法的参数匹配接口的泛型? ?void show(E e);}?//类实现接口的时候直接指定类型为Stringclass InterAImpl implements Inter{?? ? Override? ? public void show(String s) {?? ? }}?//实现类延用接口泛型则在该实现类创建对象的时候一定要给出具体类型class InterBImpl implements Inter{?? ? Override? ? public void show(E e) {? ? ? ? ?? ? }}4、泛型通配符书写位置在内有以下三种用法任意类型extends E只能接收E或者E的子类super E只能接收E或者E的父类

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询