当前位置: 首页 > news >正文

域名哪个网站好wordpress template_include

域名哪个网站好,wordpress template_include,企业网站策划书,基于mysql的网站用什么做集合 可以动态保存任意多个对象#xff0c;使用比较方便 提供了一系列方便的操作对象的方法: add、remove、set、get 等#xff0c;添加/删除新元素简洁了 Java 的集合类很多#xff0c;主要分为两大类 Collection 和 Map Collection 接口有两个重要的子接口List Set , 他…集合 可以动态保存任意多个对象使用比较方便 提供了一系列方便的操作对象的方法: add、remove、set、get 等添加/删除新元素简洁了 Java 的集合类很多主要分为两大类 Collection 和 Map Collection 接口有两个重要的子接口List Set , 他们的实现子类都是单列集合 单列数据 Map 接口的实现子类是双列集合存放的K-V 双列数据 Collection public interface Collection E extends lterable Ecollection实现子类可以存放多个元素每个元素可以是ObjectCollection接口没有直接的实现子类是通过它的子接口 Set 和 List 来实现的 Collection方法 由于Collection没有直接子类List是 Collection的子接口实现因此这里用List展示Collection类方法 import java.util.ArrayList; import java.util.List;public class CollectionMethod {SuppressWarnings({all})public static void main(String[] args) {List list new ArrayList();// add:添加单个元素list.add(jack);list.add(10);//list.add(new Integer(10)) 本质是对象list.add(true);System.out.println(list list);// remove:删除指定元素list.remove(0);//删除第一个元素 返回boolenlist.remove(true);//指定删除某个元素 返回该objSystem.out.println(list list);// contains:查找元素是否存在System.out.println(list.contains(jack));//T// size:获取元素个数System.out.println(list.size());//2// isEmpty:判断是否为空System.out.println(list.isEmpty());//F// clear:清空list.clear();System.out.println(list list);// addAll:添加多个元素ArrayList list2 new ArrayList();list2.add(红楼梦);list2.add(三国演义);list.addAll(list2);System.out.println(list list);// containsAll:查找多个元素是否都存在System.out.println(list.containsAll(list2));//T// removeAll删除多个元素list.add(聊斋);list2.add(时间是金);list.removeAll(list2);System.out.println(list list);//[聊斋]} }Collection遍历 Iterator 迭代器主要用于遍历Collection集合中的元素。 所有实现了Collection接口的集合类都有一个iterator()方法用以返回一个实现了lterator接口的对象,即可以返回一个迭代器。 在调用iterator.next()方法之前必须要调用iterator.hasNext()进行检测。 若不调用且下一条记录无效直接调用iterator.next()会抛出NoSuchElementException 异常。 for 循环增强 增强for循环可以代替iterator迭代器 特点增强for就是简化版的iterator本质一样。只能用于遍历集合或数组。 for(元素类型 元素名:集合名或数组名){ }List List 接口是 Collection接口的子接口 List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复 List集合中的每个元素都有其对应的顺序索引即支持索引 List容器中的元素都对应一个整数型的序号记载其在容器中的位置可以根据序号存取容器中的元素 List 方法 void add(int index, Object ele):在index位置插入ele元素boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来Object get(int index):获取指定index位置的元素int indexOf(Object obj):返回obj在集合中首次出现的位置int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置Object remove(int index):移除指定index位置的元素并返回此元素Object set(int index, Object ele):设置指定index位置的元素为ele , 相当于是替换.List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合。fromIndex subList toIndex 这部分方法是List独有的set用不了 ArrayList ArrayList 可以加入null空值,并且可以是多个 ArrayList是由数组来实现数据存储的 ArrayList基本等同于Vector除了ArrayList是线程不安全(执行效率高)。在多线程情况下不建议使用ArrayList。 ArrayList中维护了一个Object类型的数组elementData 分析 当创建ArrayList对象时如果使用的是无参构造器则初始elementData容量为0第1次添加则扩容elementData为10如需要再次扩容则扩容elementData为1.5倍。 如果使用的是指定大小的构造器则初始elementData容量为指定大小如果需要扩容,则直接扩容elementData为1.5倍。 Vector public class vectorEextends AbstractListE implements ListERandomAccesscloneableSerializable分析 Vector底层也是一个对象数组, protected Object[] elementData; Vector是线程同步的即线程安全, Vector类的操作方法带有 synchronizedpublic synchronized E get(int index){ if (index elementCount)throw new ArraylndexOutOfBoundsException(index); return elementData(index); }比较 底层架构版本线程安全同步效率扩容倍数ArrayList可变数组jdk1.2不安全效率高如果是无参默认10第二次开始按1.5倍扩容。如果指定大小则每次直接按1.5倍扩容Vector可变数组 Object[]jdk1.0安全效率不高如果是无参默认10满后就按2倍扩容。如果指定大小则每次直接按两倍扩容 LinkedList LinkedList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复)包括null 线程不安全没有实现同步 分析 LinkedList中维护了两个属性first和last分别指向首节点和尾节点 每个节点(Node对象)里面又维护了prev、next、item三个属性其中通过prev指向前一个通过next指向后一个节点最终实现双向链表所以LinkedList的元素的添加和删除不是通过数组完成的相对来说效率较高。 比较 底层架构增删的效率改查的效率ArrayList可变数组较低 数组扩容较高LinkedList双向链表较高 链表追加较低 如果我们改查的操作多选择ArrayList如果我们增删的操作多选择LinkedList一般来说在程序中80%-90%都是查询因此大部分情况下会选择ArrayList Set 无序添加和取出的顺序不一致)没有索引不允许重复元素所以最多包含一个null Set 方法 和List 接口一样, Set 接口也是Collection 的子接口因此常用方法和Collection 接口一样. Set遍历 同Collection的遍历方式一样因为Set接口是Collection接口的子接口。 可以使用迭代器或增强for不能使用索引的方式来获取 HashSet HashSet实际上是HashMap public Hashset() {map new HashMap(); }可以存放null值但是只能有一个null HashSet不保证元素是有序的,取决于hash后再确定索引的结果。(即不保证存放元素的顺序和取出顺序一致) 分析 添加一个元素时先得到hash值-会转成-索引值 找到存储数据表table看这个索引位置是否已经存放的有元素如果没有直接加入 如果有调用equals比较如果相同就放弃添加如果不相同则添加到最后 在Java8中,如果一条链表的元素个数到达 TREEIFY_THRESHOLD(默认是8)并且table的大小MIN TREEIFY CAPACITY(默认64),就会进行树化(红黑树)否则仍然会采用数组扩容机制。 HashSet底层是HashMap第一次添加时table数组扩容到16临界值(threshold)是16* 加载因子 (loadFactor)是0.75 12 如果table数组使用到了临界值12就会扩容到16* 232新的临界值就是32*0.75 24。依次类推 package com.hspedu.set_;import java.util.HashSet;SuppressWarnings({all}) public class HashSetSource {public static void main(String[] args) {HashSet hashSet new HashSet();hashSet.add(java);//到此位置第1次add分析完毕.hashSet.add(php);//到此位置第2次add分析完毕hashSet.add(java);System.out.println(set hashSet);/*对HashSet 的源码解读1. 执行 HashSet()public HashSet() {map new HashMap();}2. 执行 add()public boolean add(E e) {//e javareturn map.put(e, PRESENT)null;// (static) PRESENT new Object();}3.执行 put() , 该方法会执行 hash(key) 得到key对应的hash值 算法h key.hashCode()) ^ (h 16) 可见这个hash的值并不是hashcode而是做了一定的处理 16.public V put(K key, V value) {//key java value PRESENT 共享return putVal(hash(key), key, value, false, true);}4.执行 putVal !!!!!!!!!!!!!!!!!final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {NodeK,V[] tab; NodeK,V p; int n, i; //定义了辅助变量//table 就是 HashMap 的一个数组类型是 Node[] 前面我们也模拟过//if 语句表示如果当前table 是null, 或者 大小0//就是第一次扩容到16个空间.if ((tab table) null || (n tab.length) 0)n (tab resize()).length;//(1)根据key得到hash 去计算该key应该存放到table表的哪个索引位置并把这个位置的对象赋给 p//(2)判断 p 是否为null//(2.1) 如果 p 为null, 表示还没有存放元素, 就创建一个 Node (keyjava,valuePRESENT)//(2.2) 就放在该位置 tab[i] newNode(hash, key, value, null)if ((p tab[i (n - 1) hash]) null)tab[i] newNode(hash, key, value, null); // 这个null类似与模拟节点的null其后面还没有挂载节点else {//一个开发技巧提示 在需要局部变量(辅助变量)时候在创建NodeK,V e; K k; ////如果当前索引位置对应的链表的第一个元素和准备添加的key的hash值一样//并且满足 下面两个条件之一:// (1) 准备加入的key 和 p 指向的Node 结点的 key 是同一个对象// (2) p 指向的Node 结点的 key 的equals() 和准备加入的key比较后相同//就不能加入if (p.hash hash ((k p.key) key || (key ! null key.equals(k))))e p;//再判断 p 是不是一颗红黑树,//如果是一颗红黑树就调用 putTreeVal , 来进行添加else if (p instanceof TreeNode)e ((TreeNodeK,V)p).putTreeVal(this, tab, hash, key, value);else {//如果table对应索引位置已经是一个链表, 就使用for循环比较//(1) 依次和该链表的每一个元素比较后都不相同, 则加入到该链表的最后// 注意在把元素添加到链表后立即判断 该链表是否已经达到8个结点// , 就调用 treeifyBin() 对当前这个链表进行树化(转成红黑树)// 注意在转成红黑树时要进行判断, 判断条件// if (tab null || (n tab.length) MIN_TREEIFY_CAPACITY(64))// resize();// 如果上面条件成立先table扩容.// 只有上面条件不成立时才进行转成红黑树//(2) 依次和该链表的每一个元素比较过程中如果有相同情况,就直接breakfor (int binCount 0; ; binCount) {if ((e p.next) null) {p.next newNode(hash, key, value, null);if (binCount TREEIFY_THRESHOLD(8) - 1) // -1 for 1sttreeifyBin(tab, hash);break;}if (e.hash hash ((k e.key) key || (key ! null key.equals(k))))break;p e;}}if (e ! null) { // existing mapping for keyV oldValue e.value;if (!onlyIfAbsent || oldValue null)e.value value;afterNodeAccess(e);return oldValue;}}modCount;//size 就是我们每加入一个结点Node(k,v,h,next), sizeif (size threshold)resize();//扩容afterNodeInsertion(evict);return null;}*/} }LinkedHashSet LinkedHashSet 是 HashSet的子类 LinkedHashSet 底层是一个 LinkedHashMap底层维护了一个数组双向链表 LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序(图),这使得元素看起来是以插入顺序保存 LinkedHashSet不允许添重复元素 分析 在LinkedHastSet中维护了一个hash表和双向链表( LinkedHashSet有 head和tail) 每一个节点有before和after属性,这样可以形成双向链表 在添加一个元素时先求hash值在求索引,确定该元素在table的位置,然后将添加的元素加入到双向链表(如果已经存在不添加[原则和hashset一样]) 这样的话我们遍历LinkedHashSet 也能确保插入顺序和遍历顺序一致 Map Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value Map接口的常用实现类:HashMap、Hashtable和Properties Map中的key不允许重复原因和HashSet一样value可以重复 Map 的key可以为null, value也可以为null注意key为null只能有一个value为null ,可以多个 常用String类作为Map的key key 和 value之间存在单向一对一关系即通过指定的 key总能找到对应的value Map 中的key和value可以是任何引用类型的数据会封装到HashMap$Node对象中又因为Node实现了Entry 接口有些书上也说一对 k-v 就是一个Entry 但是本质上Entry还是指向HashMap$Node中的元素并不是复制版存储。 Map方法 import java.util.HashMap; import java.util.Map;SuppressWarnings({all}) public class MapMethod {public static void main(String[] args) {//演示map接口常用方法Map map new HashMap();map.put(fh, new Book(, 100));//OKmap.put(fh, bnd);//替换- 一会分析源码map.put(fgd, mr);//OKmap.put(sgfh, mr);//OKmap.put(vcbhhd, null);//OKmap.put(null, dfhdfg);//OKmap.put(lh, gct);//OKmap.put(hsp, hspd);System.out.println(map map);// remove:根据键删除映射关系map.remove(null);System.out.println(map map); // get根据键获取值Object val map.get(lh);System.out.println(val val); // size:获取元素个数System.out.println(k-v map.size()); // isEmpty:判断个数是否为0System.out.println(map.isEmpty());//F // clear:清除k-v//map.clear();System.out.println(map map); // containsKey:查找键是否存在System.out.println(结果 map.containsKey(hsp));//T} }class Book {private String name;private int num;public Book(String name, int num) {this.name name;this.num num;} }Map遍历 containsKey 查找键是否存在keySet 获取所有的键entrySet 获取所有关系k-vvalues 获取所有的值 HashMap HashMap是 Map 接口使用频率最高的实现类。 HashMap 是以key-val对的方式来存储数据(HashMap$Node类型) key不能重复但是值可以重复,允许使用null键和null值 如果添加相同的key则会覆盖原来的key-val等同于修改(key不会替换val会替换) 与HashSet一样不保证映射的顺序因为底层是以hash表的方式来存储的. (jdk8的hashMap底层数组链表红黑树) HashMap没有实现同步因此是线程不安全的,方法没有做同步互斥的操作没有synchronized 分析 HashMap 底层维护了Node类型的数组table默认为null 当创建对象时将加载因子(Ioadfactor)初始化为0.75. 当添加key-val时通过key的哈希值得到在table的索引。然后判断该索引处是否有元素,如果没有元素直接添加。 如果该索引处有元素继续判断该元素的key和准备加入的key是否相等如果相等则直接替换val 如果不相等需要判断是树结构还是链表结构做出相应处理。如果添加时发现容量不够则需要扩容。 第1次添加则需要扩容table容量为16临界值(threshold)为12 (16*0.75) 以后再扩容则需要扩容table容量为原来的2倍(32)临界值为原来的2倍,即24依次类推. 在Java8中,如果一条链表的元素个数超过 TREEIFY_THRESHOLD(默认是8)并且table的大小 MIN TREEIFY CAPACITY(默认64)就会进行树化(红黑树) package com.hspedu.map_;import java.util.HashMap;SuppressWarnings({all}) public class HashMapSource1 {public static void main(String[] args) {HashMap map new HashMap();map.put(java, 10);//okmap.put(php, 10);//okmap.put(java, 20);//替换valueSystem.out.println(map map);///*解读HashMap的源码图解1. 执行构造器 new HashMap()初始化加载因子 loadfactor 0.75HashMap$Node[] table null2. 执行put 调用 hash方法计算 key的 hash值 (h key.hashCode()) ^ (h 16)public V put(K key, V value) {//K java value 10return putVal(hash(key), key, value, false, true);}3. 执行 putValfinal V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {NodeK,V[] tab; NodeK,V p; int n, i;//辅助变量//如果底层的table 数组为null, 或者 length 0 , 就扩容到16if ((tab table) null || (n tab.length) 0)n (tab resize()).length;//取出hash值对应的table的索引位置的Node, 如果为null, 就直接把加入的k-v//, 创建成一个 Node ,加入该位置即可if ((p tab[i (n - 1) hash]) null)tab[i] newNode(hash, key, value, null);else {NodeK,V e; K k;//辅助变量// 如果table的索引位置的key的hash相同和新的key的hash值相同// 并 满足(table现有的结点的key和准备添加的key是同一个对象 || equals返回真)// 就认为不能加入新的k-vif (p.hash hash ((k p.key) key || (key ! null key.equals(k))))e p;else if (p instanceof TreeNode)//如果当前的table的已有的Node 是红黑树就按照红黑树的方式处理e ((TreeNodeK,V)p).putTreeVal(this, tab, hash, key, value);else {//如果找到的结点后面是链表就循环比较for (int binCount 0; ; binCount) {//死循环if ((e p.next) null) {//如果整个链表没有和他相同,就加到该链表的最后p.next newNode(hash, key, value, null);//加入后判断当前链表的个数是否已经到8个到8个后//就调用 treeifyBin 方法进行红黑树的转换if (binCount TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);break;}if (e.hash hash //如果在循环比较过程中发现有相同,就break,就只是替换value((k e.key) key || (key ! null key.equals(k))))break;p e;}}if (e ! null) { // existing mapping for keyV oldValue e.value;if (!onlyIfAbsent || oldValue null)e.value value; //替换key对应valueafterNodeAccess(e);return oldValue;}}modCount;//每增加一个Node ,就sizeif (size threshold[12-24-48])//如size 临界值就扩容resize();afterNodeInsertion(evict);return null;}5. 关于树化(转成红黑树)//如果table 为null ,或者大小还没有到 64暂时不树化而是进行扩容.//否则才会真正的树化 - 剪枝final void treeifyBin(NodeK,V[] tab, int hash) {int n, index; NodeK,V e;if (tab null || (n tab.length) MIN_TREEIFY_CAPACITY)resize();}*/} }HashTable 存放的元素是键值对:即K-V hashtable的键和值都不能为null否则会抛出NullPointerException hashTable使用方法基本上和HashMap一样 hashTable是线程安全的(synchronized), hashMap是线程不安全的 比较 版本线程安全同步效率允许null键null值Hashmap1.2不安全高可以Hashtable1.0安全较低不可以 Properties Properties类继承自 Hashtable 类并且实现了Map接口也是使用一种键值对的形式来保存数据。 使用特点和Hashtable类似。 Properties还可以用于从xxx.properties文件中加载数据到Properties类对象, 并进行读取和修改。 xxx.properties文件通常作为配置文件 TreeSet package com.hspedu.set_;import java.util.Comparator; import java.util.TreeSet; SuppressWarnings({all}) public class TreeSet_ {public static void main(String[] args) {//1. 当我们使用无参构造器创建TreeSet时仍然是无序的//2. 希望添加的元素按照字符串大小来排序//3. 使用TreeSet 提供的一个构造器可以传入一个比较器(匿名内部类)并指定排序规则//4. 简单看看源码/*1. 构造器把传入的比较器对象赋给了 TreeSet的底层的 TreeMap 的属性 this.comparatorpublic TreeMap(Comparator? super K comparator) {this.comparator comparator;}2. 在 调用 treeSet.add(tom), 在底层会执行到if (cpr ! null) {//cpr 就是我们的匿名内部类(对象)do {parent t;//动态绑定到我们的匿名内部类(对象)comparecmp cpr.compare(key, t.key);if (cmp 0)t t.left;else if (cmp 0)t t.right;else //如果相等即返回0,这个Key就没有加入return t.setValue(value);} while (t ! null);}*/// TreeSet treeSet new TreeSet();TreeSet treeSet new TreeSet(new Comparator() {Overridepublic int compare(Object o1, Object o2) {//下面 调用String的 compareTo方法进行字符串大小比较//return ((String) o2).compareTo((String) o1);//如果要求加入的元素按照长度大小排序return ((String) o1).length() - ((String) o2).length();}});//添加数据.treeSet.add(jack);treeSet.add(tom);// 3treeSet.add(sp);treeSet.add(a);treeSet.add(abc);// 长度为3加不进去System.out.println(treeSet treeSet);} }TreeMap package com.hspedu.map_;import java.util.Comparator; import java.util.TreeMap;SuppressWarnings({all}) public class TreeMap_ {public static void main(String[] args) {//使用默认的构造器创建TreeMap, 是无序的(也没有排序)/*要求按照传入的 k(String) 的大小进行排序*/ // TreeMap treeMap new TreeMap();TreeMap treeMap new TreeMap(new Comparator() {Overridepublic int compare(Object o1, Object o2) {//按照传入的 k(String) 的大小进行排序//按照K(String) 的长度大小排序//return ((String) o2).compareTo((String) o1);return ((String) o2).length() - ((String) o1).length();}});treeMap.put(jack, 杰克);treeMap.put(tom, 汤姆);treeMap.put(kristina, 克瑞斯提诺);treeMap.put(smith, 斯密斯);treeMap.put(hsp, 韩顺平);//加入不了System.out.println(treemap treeMap);/*解读源码1. 构造器. 把传入的实现了 Comparator接口的匿名内部类(对象)传给给TreeMap的comparatorpublic TreeMap(Comparator? super K comparator) {this.comparator comparator;}2. 调用put方法2.1 第一次添加, 把k-v 封装到 Entry对象放入rootEntryK,V t root;if (t null) {compare(key, key); // type (and possibly null) checkroot new Entry(key, value, null);size 1;modCount;return null;}2.2 以后添加Comparator? super K cpr comparator;if (cpr ! null) {do { //遍历所有的key , 给当前key找到适当位置parent t;cmp cpr.compare(key, t.key);//动态绑定到我们的匿名内部类的compareif (cmp 0)t t.left;else if (cmp 0)t t.right;else //如果遍历过程中发现准备添加Key 和当前已有的Key 相等就不添加return t.setValue(value);} while (t ! null);}*/} }Collections 工具类 Collections是一个操作 Set、List 和 Map等集合的工具类。 Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作。 排序操作均为static 方法) reverse(List) 反转List中元素的顺序 shuffle(List) 对List集合元素进行随机排序 sort(List) 根据元素的自然顺序对指定List集合元素按升序排序 sort(List,Comparator) 根据指定的Comparator产生的顺序对List 集合元素进行排序 swap(Listintint) 将指定 list集合中的i处元素和j处元素进行交换 查找、替换 Object max(Collection) 根据元素的自然顺序,返回给定集合中的最大元素 Object max(Collection,Comparator) 根据Comparator指定的顺序返回给定集合中的最大元素 Object min(Collection) 根据元素的自然顺序,返回给定集合中的最小元素 Object min(Collection,Comparator) 根据Comparator指定的顺序返回给定集合中的最小元素 int frequency(Collection,Object 返回指定集合中指定元素的出现次数 void copy(List dest,List src) 将src中的内容复制到dest中 boolean replaceAll(List list,Object oldVal,Object newVal) 使用新值替换List 对象的所有旧值
http://www.zqtcl.cn/news/441096/

相关文章:

  • 网站建设规划设计公司排名无锡网站建设 君通科技
  • 徐州网站开发要多少钱给个人网站做百度百科
  • 法语网站建设免费网站为何收录比较慢
  • 品牌网站推广软件seo内链优化
  • 广东律师事务所东莞网站建设做网站 怎么备案
  • shopnc本地生活o2o网站源码wordpress文章内多页效果
  • 深圳全国网站制作哪个好页面设计有哪几种风格
  • 网页设计作业网站素材和效果图夏天做啥网站致富
  • 利用帝国软件如何做网站网站友链交换平台
  • 简述网站开发技术深圳网站设计合理刻
  • wordpress网站名称寻找销售团队外包
  • 一浪网站建设网页qq邮箱
  • 做网站需要注册公司吗夫唯seo系统培训
  • 沈阳人流哪个医院好安全百度关键词优化怎么做
  • 1688网站怎么做分销高质量的网站内容建设
  • 网站建设公司济宁网站转跳怎么做
  • 镇江网站设计多少钱企业网络部署方案
  • 建网站的公司浩森宇特wordpress登录缓存
  • 便宜建站空间战队头像在线制作免费
  • 做招聘网站赚钱吗厦门网站建设哪里好
  • 新乡网站建设哪家公司好阿里巴巴做国际网站多少钱
  • 怎么在悉尼做网站dede做手机网站
  • 企业网站模板免费下载品牌建设专家库推荐表
  • 辽宁智能网站建设推荐网络营销推广方案创意
  • 安阳做一个网站多少钱东营做网站公司
  • 深圳市罗湖网站建设百度自助建站官网
  • 网站开发安装环境网站建设销售话术
  • 网站权重网站栏目划分的原则
  • 国际网站建设的目的我的百度账号登录
  • 温州网站设计定制博客和网站的区别