电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java源碼解析之接口List

瀏覽:96日期:2022-08-12 13:44:03
目錄前言一、List特有的方法二、超級實現類AbstractList三、SubList、equals和hascode前言

List接口是Collection接口的三大接口之一,其中的數據可以通過位置檢索,用戶可以在指定位置插入數據。List的數據可以為空,可以重復。我們來看看api文檔是怎么說的:

Java源碼解析之接口List

一、List特有的方法

我們這里就只關注和Collection不同的方法,主要有以下這些:

//在指定位置,將指定的集合插入到當前的集合中boolean addAll(int index, Collection<? extends E> c);//這是一個默認實現的方法,會通過Iterator的方式對每個元素進行指定的操作default void replaceAll(UnaryOperator<E> operator) { Objects.requireNonNull(operator); final ListIterator<E> li = this.listIterator(); while (li.hasNext()) {li.set(operator.apply(li.next())); }}//排序,依據指定的規則對當前集合進行排序,可以看到,排序是通過Arrays這個工具類完成的。default void sort(Comparator<? super E> c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator<E> i = this.listIterator(); for (Object e : a) {i.next();i.set((E) e); }}//獲取指定位置的元素E get(int index);//修改指定位置元素的值E set(int index, E element);//將指定元素添加到指定的位置void add(int index, E element);//將指定位置的元素移除E remove(int index);//返回一個元素在集合中首次出現的位置int indexOf(Object o);//返回一個元素在集合中最后一次出現的位置int lastIndexOf(Object o);//ListIterator繼承于Iterator,主要增加了向前遍歷的功能ListIterator<E> listIterator();//從指定位置開始,返回一個ListIteratorListIterator<E> listIterator(int index);//返回一個子集合[fromIndex, toIndex),非結構性的修改返回值會反映到原表,反之亦然。//如果原表進行了結構修改,則返回的子列表可能發生不可預料的事情List<E> subList(int fromIndex, int toIndex);

通過對上面方法的研究,我們不難發現,collection接口主要提供一些通常的方法,而List接口則針對線性表的結構,提供了對位置以及字表的操作。

二、超級實現類AbstractList

我們先看看源文檔是怎么來說AbstractList的,要實現一個不可修改的集合,只需要復寫get和size方法。如果要實現一個可以修改的集合,還需要復寫set方法,如果要動態調整大小,就必須實現add和remove方法。

接下里我們一起來來看看源碼吧!

//在AbstractCollection中,add方法默認會拋出異常,//而在這里是調用了add(int index, E e)方法,但這個方法也是沒有實現的。//這里默認會把元素添加到末尾。public boolean add(E e) { add(size(), e); return true;}//同上,這個只需要進行一次遍歷即可public boolean addAll(int index, Collection<? extends E> c) { //... }

接下里我們在繼續看看其他幾個方法,這幾個是與Iterator和ListIterator息息相關的,在AbstractList中有具體的實現,我們先來看看它是如何把集合轉變成Iterator對象并支持foreach循環的吧。

我們通過源碼發現:在Iterator方法中,是直接返回一個 Itr對象

public Iterator<E> iterator() { return new Itr();}

其實我們很快也就會明白,它是實現了一個內部類,這個內部類實現了Iterator接口,合理的處理hasNext、next、remove方法。這個源碼就不粘貼啦,其中僅僅在remove時考慮了一下多線程問題,有興趣的可以自己去看看。

我們來看看另一個吧?ListIterator吧他也是通過一個內部類是實現的

public ListIterator<E> listIterator() { return listIterator(0);}

public ListIterator<E> listIterator(final int index) { rangeCheckForAdd(index); return new ListItr(index);}

事實證明,和我們想的一樣,AbstractList內部還定義了一個ListItr,實現了ListIterator接口,其實現也很簡單,就不粘貼源碼啦。

接下倆讓我們來看看AbtractList是怎么利用這兩個類來做事情的

//尋找一個元素首次出現的位置,只需要從前往后遍歷,找到那個元素并返回其位置即可。public int indexOf(Object o) { ListIterator<E> it = listIterator(); if (o==null) {while (it.hasNext()) if (it.next()==null)return it.previousIndex(); } else {while (it.hasNext()) if (o.equals(it.next()))return it.previousIndex(); } return -1;}//同理,尋找一個元素最后一次出現的位置,只需要從列表最后一位向前遍歷即可。//看到listIterator(int index)方法是可以傳遞參數的,這個我想我們都可以照著寫出來了。public int lastIndexOf(Object o) { //...}//這個方法是把從fromIndex到toIndex之間的元素從集合中刪除。//clear()方法也是調用這個實現的(我認為clear實現意義并不大,因為在其上級AbstractCollection中已經有了具體實現)。protected void removeRange(int fromIndex, int toIndex) { ListIterator<E> it = listIterator(fromIndex); for (int i=0, n=toIndex-fromIndex; i<n; i++) {it.next();it.remove(); }}

在接下來讓我們來說一說兩個比較重要的內容一個是關于SubList,另一個是關于equals和hascode的。

三、SubList、equals和hascode

SubList并不是新建了一個list,只是持有當前集合的引用,然后控制了用戶可以操作的范圍,所以在接口定義時就說明了其更改會直接反應到原集合中。SubList是定AbstractList內部,并且是AbstractList的基礎上增加了對可選范圍的控制。

而equals和hascode的實現,也關乎我們的使用。在AbstractList中,這兩個方法不僅與其實例有關,也和其內部包含的元素有關,所以在定義數據元素時,也應該復寫這兩個方法,以保證程序的正確運行。這里看下其源碼加深一下印象吧。

public boolean equals(Object o) { if (o == this)return true; if (!(o instanceof List))return false; ListIterator<E> e1 = listIterator(); ListIterator<?> e2 = ((List<?>) o).listIterator(); while (e1.hasNext() && e2.hasNext()) {E o1 = e1.next();Object o2 = e2.next();//這里用到了數據元素的equals方法if (!(o1==null ? o2==null : o1.equals(o2))) return false; } return !(e1.hasNext() || e2.hasNext());}

public int hashCode() { int hashCode = 1; for (E e : this)//這里用到了數據元素的hashCode方法hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); return hashCode;}

到此這篇關于Java源碼解析之接口List的文章就介紹到這了,更多相關Java接口List內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 重庆波纹管|重庆钢带管|重庆塑钢管|重庆联进管道有限公司 | 陶瓷加热器,履带式加热器-吴江市兴达电热设备厂 | 执业药师报名时间,报考条件,考试时间-首页入口| 合肥触摸一体机_触摸查询机厂家_合肥拼接屏-安徽迅博智能科技 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 瑞典Blueair空气净化器租赁服务中心-专注新装修办公室除醛去异味服务! | 飞行者联盟-飞机模拟机_无人机_低空经济_航空技术交流平台 | 广西教师资格网-广西教师资格证考试网 | 新材料分散-高速均质搅拌机-超声波分散混合-上海化烁智能设备有限公司 | 最新电影-好看的电视剧大全-朝夕电影网 | 耳模扫描仪-定制耳机设计软件-DLP打印机-asiga打印机-fitshape「飞特西普」 | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 上海办公室装修_上海店铺装修公司_厂房装潢设计_办公室装修 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 哔咔漫画网页版在线_下载入口访问指引 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 美甲贴片-指甲贴片-穿戴美甲-假指甲厂家--薇丝黛拉 | 逗网红-抖音网红-快手网红-各大平台网红物品导航 | 鹤壁创新仪器公司-全自动量热仪,定硫仪,煤炭测硫仪,灰熔点测定仪,快速自动测氢仪,工业分析仪,煤质化验仪器 | 振动时效_振动时效仪_超声波冲击设备-济南驰奥机电设备有限公司 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 广州市哲铭油墨涂料有限公司,水性漆生产研发基地 | 阜阳成人高考_阜阳成考报名时间_安徽省成人高考网 | 酒瓶_酒杯_玻璃瓶生产厂家_徐州明政玻璃制品有限公司 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 自动化改造_智虎机器人_灌装机_贴标机-上海圣起包装机械 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 四川职高信息网-初高中、大专、职业技术学校招生信息网 | 山东钢格板|栅格板生产厂家供应商-日照森亿钢格板有限公司 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 质构仪_鱼糜弹性仪-上海腾拔仪器科技有限公司 | 机床主轴维修|刀塔维修|C轴维修-常州翔高精密机械有限公司 | 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 膏剂灌装旋盖机-眼药水灌装生产线-西林瓶粉剂分装机-南通博琅机械科技 | 不锈钢螺丝,不锈钢螺栓,不锈钢标准件-江苏百德特种合金有限公司 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 |