java 数据结构详解,数组,集合,HashMap

数组的特性:

 

数组在内存中是一块连续的存储单元存储起来的,声明数组的时候我们必须声明其长度,这样才会为我们声明一个连续的存储区域。

这种存储方式造成我们想要往数组中存储一个数据时那么其后面各个元素都要往后移动,同样的,删除数据后面的数据都要往前移动。

但是同样也带来好处,我们要想获取数组中第i个元素,直接通过角标获取即可,同理修改也是。

数组获取某一数据很简单通过角标i直接获取即可,但是增删比较低效,在内存中用一块连续的存储区域来存储,查找数组中是否包含某一元素比较低效。

 

数据结构之链表

与数组不同,链表不用非要一块连续的存储区域,链表是一种离散存储结构,数据之间通过指针链接,每个数据元素包含数据域指针域,数据域存储对应数据即可,而指针域则指向下一个数据元素(对于单项链表来说),针对指针域还可以分为单向链表,双向链表,循环链表。

链表增删效率高,查找效率低。每一个数据项与数组相比更耗内存。不需要整块内存块,不会造成碎片化。

 

数据结构之哈希表

哈希表就是一种以键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。

 

LinkedList的队列与栈性质

这里简单提一下。

队列:一种数据结构,最明显的特性是只允许队头删除,队尾插入。

:同样是一种数据结构,特性是插入删除都在栈的顶部。

 

存储时key类型是不确定的,可能是int,可能是String,也可能是其他任意对象。Hash函数的作用就是把这些对象通过合理的方式转为int类型,从而完成数据的存储。

1、数组

数组声明方式有两种

(1)

String [] arrays = {"ab","ac","cc","66","+++"};

arrays[3]="99";//更改值

(2)

String [] arrays =new  String[5];

arrays[3]="99";//赋值

1、2删除元素方法。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

       public static String[] delete(int index, String array[]) {
            //数组的删除其实就是覆盖前一位
           String[] arrNew = new String[array.length - 1];
            for (int i = index; i < array.length - 1; i++) {
                array[i] = array[i + 1];
            }
//            System.arraycopy(array, 0, arrNew, 0, arrNew.length);
            return arrNew;
        }
       
       public static String[] delete2(int index, String array[]) {
            //数组的删除其实就是覆盖前一位
           String[] arrNew = new String[array.length - 1];
            for (int i = 0; i < array.length - 1; i++) {
                if (i < index) {
                    array[i] = array[i];
                } else {
                    array[i] = array[i + 1];
                }
            }
        
            return arrNew;
        }

1、3调用删除。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

     delete2(1,arrays);//调用delete方法
             
             for(int i=0;i<arrays.length;i++){
                    System.out.print("    de==="+arrays[i]);
                }

结果:  de===ab    de===cc    de===66    de===+++    de===+++

1、4数组排序。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

  int[] a={1,4,-1,5,0};
                Arrays.sort(a);

     for(int i=0;i<a.length;i++){
                    System.out.print("    de==="+a[i]);
                }

结果:    de===-1    de===0    de===1    de===4    de===5

1、5数组倒序。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

      int[] a={1,4,-1,5,0};
                Arrays.sort(a);
                
                int [] daoxu =new int[a.length];
             
             for(int i=0;i<a.length;i++){
                 daoxu[a.length-i-1] = a[i];
//                    System.out.print("    de==="+a[i]);
                }
             for(int i=0;i<daoxu.length;i++){
                    System.out.print("    daoxu==="+daoxu[i]);
                }

结果: daoxu===5    daoxu===4    daoxu===1    daoxu===0    daoxu===-1

2、集合

list集合声明

//    static List<String> list2=new ArrayList<>();
//    static List<String> list2=new LinkedList<>();
    static List<String> list2=new Vector<>();

set集合说明

Set<Integer> test = new HashSet<>();

可以 test.add(null);

 Set<Integer> test = new TreeSet();

不可以  test.add(null);

说明:

List中的元素有存放顺序,并且可以存放重复元素,检索效率高,插入删除效率低

LinkedList中元素位置是任意的,所以执行插入删除操作效率较高,查询效率较低

Vector多个线程同时访问不会发生不确定的结果,但是它的效率会比较低,如果要考虑线程安全的话可以用它。

 

Set没有存放顺序,而且不可以存放重复元素,后来的元素会把前面重复的元素替换掉,检索效率低,插入删除效率高

Set存储位置是由它的HashCode码决定的,所以它存储的对象必须有equals()方法,而且Set遍历只能用迭代,因为它没有下标

HashSet是使用Hash表实现的,集合里面的元素是无序得,可以有null值,但是不能有重复元素。

TreeSet是用二叉树结构实现的集合,集合中的元素是有顺序得,不允许放入null,同样不能放入重复元素。

 

2、2集合操作

Sr.No.Method & Description
1

add( )         向集合中添加元素

2

clear( )        去掉集合中所有的元素

3

contains( )    判断集合中是否包含某一个元素

4

isEmpty( )    判断集合是否为空

5

iterator( )    主要用于递归集合,返回一个Iterator()对象

6

remove( )    从集合中去掉特定的对象

7

size( )        返回集合的大小

        list2.add("aaa");    
            list2.add("bbb");   
            list2.add("ccc");   
            list2.add("111");   
            list2.add("111");  

            list2.remove(2);//删除元素
            list2.add(2, "插入icom");//插入元素。先删除再插入就是替换元素
    
    
             for(int i=0;i<list2.size();i++){
                 System.out.print("    ==="+list2.get(i));
                 }

结果是:    ===aaa   ===bbb   ===插入icom   ===111   ===111

Set遍历:使用迭代方法

         Set<Integer> test = new HashSet<>();

             int c = 3;
             int d = 9;
             int e = 2;
              
               test.add(c);
             test.add(d);
             test.add(e);
             test.add(null);

         Iterator<Integer> value = test.iterator();
             while (value.hasNext()) {
//                 int s = value.next();
                 System.out.print(value.next()+" ");
             } 

结果:null 2 3 9  ——默认排序了

数组转集合:https://blog.csdn.net/meixi_android/article/details/82221089

3、HashMap

存储键值对我们首先想到HashMap,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞,它是线程不安全的

HashMap允许空键值,并且它是非线程安全的,所以插入、删除和定位元素会比较快。

           Map map=new HashMap();                
                map.put(3, "sss");    
                map.put(2, 6666);    
                map.put("c", null);    
                map.put(null, "ddd");    
                
                System.out.println(map.get(3));
                
                //遍历
                Iterator iterator = map.keySet().iterator();                
                while (iterator.hasNext()) {    
                 Object key = iterator.next();    
                 System.out.println("map.get(key) is :"+map.get(key));    
                }   

结果:sss
map.get(key) is :ddd
map.get(key) is :6666
map.get(key) is :sss
map.get(key) is :null

TreeMap不允许空键值,TreeMap是基于红黑树实现的,适用于按自然顺序火兹定于顺序遍历key。(键需同类型)。如果你需要得到一个有序的结果你就应该使用TreeMap

 

           Map map=new TreeMap();                
               map.put(2, "aaa");    
                map.put(1, "cccc");    
                map.put(4, "bbbbbb");    
                map.put(5, "ddd");      
                
                //遍历
                Iterator iterator = map.keySet().iterator();                
                while (iterator.hasNext()) {    
                 Object key = iterator.next();    
                 System.out.println("map.get(key) is :"+map.get(key));    
                }  

结果:

map.get(key) is :cccc
map.get(key) is :aaa
map.get(key) is :bbbbbb
map.get(key) is :ddd

 

HashTable是基于HashCode实现的,但它是线程安全的,所以会比HashMap效率低,而且不允许null值。

        Hashtable tab=new Hashtable();                
                tab.put("a", "aaa");    
                tab.put("b", "bbb");    
                tab.put("c", "ccc");    
                tab.put("d", "ddd");  
                
                Iterator iterator_1 = tab.keySet().iterator();    
                while (iterator_1.hasNext()) {    
                 Object key = iterator_1.next();    
                 System.out.println("tab.get(key) is :"+tab.get(key));    
                }  

结果:

tab.get(key) is :bbb
tab.get(key) is :aaa
tab.get(key) is :ddd
tab.get(key) is :ccc
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作218:页面样式调整

<div class"table-list-page"><div class"query-area"><!--样式控制全部 已经退回 待审核GY--><el-row><el-radio-group v-model"query.status" change"list"><el-radio-button label""&g…

前端学习(2681):重读vue电商网站1之后台启动

后台数据接口启动文件 node -app.js 需要mysql数据库

Promise初步详解(resolve,reject,catch)

一:何为Promise&#xff1f; 为了直观一点&#xff0c;首先我们采用console.dir(Promise)看一下它的结构组成。 从上面的图片中我们可以到&#xff0c;Promise其实是一个构造函数&#xff0c;它有resolve&#xff0c;reject&#xff0c;race等静态方法;它的原型&#xff08;pro…

session 的 源码

session 的 源码 1.session 和 cookie 的 区别&#xff1a; 答&#xff1a; cookie 它是保存在浏览器的键值对。 session 它是保存在服务端的键值对。 它 依赖cookie 存在。 流程&#xff1a; 一个服务端&#xff0c; 一个客户端第一次来 服务端 去 客户端 发来的请求里的…

前端学习(2682):重读vue电商网站3之登录页面总结el-form 组件问题

el-form 组件默认是 content-box&#xff0c;我们设置其如下属性时&#xff0c;就会出现长度比我们想象中长一点的情况。 .login_form {position: absolute;bottom: 60px;width: 100%;padding: 0 20px; //多加一行box-sizing: border-box; } 运行结果

Android 统一View样式,textview样式

xmlns:tools"http://schemas.android.com/tools" android:text"提示" 1、在values文件夹下的styles文件里面创建textview样式——android:style/Widget.TextView可以替换为其他view,如&#xff1a;button,CheckBox。。。。。 <style name"mytextst…

前端学习(2683):重读vue电商网站4之登录页面总结使用 iconfont 给输入框添加图标

在 main.js 中导入字体图标 然后在 el-input 组件中通过 prefix-icon 进行相关图标引用 最终效果图如下&#xff1a;

Highcharts隐藏网格线

原始效果 加上代码 yAxis: {gridLineWidth: 0,minorGridLineWidth: 0}

前端学习(2684):重读vue电商网站5之登录页面总结如何进行表单验证

Form 组件提供了表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;并将 Form-Item 的 prop 属性设置为需校验的字段名即可。 通过 rules 属性传入约定的验证规则 将Form-Item 的 prop 属性设置为需校验的字段名

Android 贴纸样式标签

demo链接&#xff1a;https://download.csdn.net/download/meixi_android/10802704 样式效果 实现方法&#xff1a; 1、自定义标签类 public class LabelImageView extends ImageView {LabelViewHelper utils;public LabelImageView(Context context) {this(context, null);…

Java研发工程师面试题(1)

Java研发工程师面试题(1) 基础题 一、String,StringBuffer, StringBuilder 的区别是什么&#xff1f;String为什么是不可变的&#xff1f;1. String是字符串常量&#xff0c;StringBuffer和StringBuilder是字符串变量。StringBuffer是线程安全的&#xff0c;StringBuilder是非线…

前端学习(2685):重读vue电商网站6之如何重置表单

element-ui 对表单提供了如下方法 resetFields&#xff0c;我们只需要获取表单对象数据即可重置我们的表单。 获取表单对象方式如下&#xff1a; 直接在表单处添加 ref属性&#xff0c;如下 loginFormRef&#xff0c;此引用即为我们表单实例。 然后&#xff0c;在我们重置按钮…

android Camera 设置焦距

1、添加Camera权限 2、判断是否支持变焦 public boolean isSupportZoom(){boolean isSuppport true;if (mCamera.getParameters().isSmoothZoomSupported()){isSuppport false;}return isSuppport;} 3、修改焦距 public void setZoom(){if (mIsSupportZoom){try{Parameters …

v-contextmenu的使用(右键菜单)

先来个自己改写的图&#xff1a; 代码&#xff1a; 结构&#xff1a;<div class"wrap" v-contextmenu:contextmenu><v-contextmenu ref"contextmenu"> <v-contextmenu-item ><i class"fa fa-search"></i>上插入&l…

前端学习(2686):重读vue电商网站7之登录预校验

在我们点击登录按钮&#xff0c;不应该直接发起网络请求&#xff0c;而是应该对表单进行预校验&#xff0c;检验成功才会发送请求。 拿到表单引用对象&#xff0c;即可进行对表单的校验。 首先&#xff0c;给登录按钮通过 click 来绑定一个事件 下一步&#xff0c;在 methods …

Android 循环滚动控件ViewFlipper,可实现跑马灯或轮播图效果

ViewFlipper——Android循环滚动控件 1、效果如下&#xff1a; 2、实现方法 &#xff08;1&#xff09;创建进出动画 上下滚动动画 y_in.xml <?xml version"1.0" encoding"utf-8"?> <set xmlns:android"http://schemas.android.com/a…

vue js table colspan rowspan

需求&#xff0c;要写一个菜单权限表。需要做到单元格合并&#xff0c;本来用的antd-vue的表格&#xff0c;然后构造customRender,总感觉有点本末倒置&#xff0c;其实自己实现&#xff0c;更快&#xff0c;而且想改哪里&#xff0c;改哪里。下面是写这个功能前的测试demo。 效…

前端学习(2687):重读vue电商网站8之设置弹框提示组件

首先&#xff0c;在 element.js 中导入弹框提示组件&#xff0c;但是它的配置与其它组件不一样&#xff0c;它需要进行全局挂载。 全局导入后&#xff0c;我们就可以在我们的登录组件 login.vue 中通过 this来访问弹框提示组件了。 测试一下&#xff0c;输入 admin 和 123456&a…

table 权限 展示页面

上篇文件介绍了基本的colspan和rowspan&#xff0c;这篇贴上一个学习代码&#xff0c;供以后修改。 效果如下&#xff1a;&#xff08;这个demo v-if 和 v-for 混用了&#xff0c;这个不好&#xff09; <template><div class"rbac-table"><div clas…