浅入浅出Java集合之List

笔者思维导图,阐述顺序以此为基准,详细其原理和结构。
一、数据结构之数组

    数组,即数据对象,属于线性结构(数据元素间存在一对一的关系),是有序的数据元素系列,元素类型(基本数据类型、引用数据类型)和长度固定。数组中元素的有序,是指元素存储在一个连续性的内存块,由于内存的连续,因此具有通过索引快速访问元素的特性。在数组长度范围内添加或删除数据元素时,其时间复杂度取决于添加的位置,时间复杂度越高,效率越低,可忽略空间复杂度。


二、数据结构之链表

    链表,属于线性结构(数据元素间存在一对一的关系),元素类型固定和长度不固定(动态增减),逻辑上的有序,是物理存储单元上非连续、非顺序的存储结构,通过链表中的指针链接次序实现。同时,它是由一系列结点(数据元素)组成,每个结点根据其指针寻址下一个结点,结点可以在运行时动态生成。由于链表的指针寻址和结点动态生成,因此增加和删除数据元素时,不会造成结点间的移动,空间复杂度和时间复杂度优,但是在查询元素时,需要通过按照结点间指针的顺序依次访问,其时间复杂度取决于该元素与链头的距离。


三、线程知识之开启线程

    1.实体类方式:线程【new Thread(){public void run(){}}】,也可使用其它类(TempThread)继承Thread类【new Thread(new TempThread())】,调用start方法

public class ThreadDemo{
   public static void main(String[] args){
      Thread thread=new Thread(){
           @Override
           public void run(){
          System.out.print("Thread方式一");
        }
   };
    thread.start();
 }
}

    2.接口类方式:线程【new Thread(){new Runable(){public void run(){}}】,也可使用其它类(TempThread)实现Runable接口【new Thread(new TempThread())】,调用start方法。

public class ThreaDemo{
 public static void main(String[] args){
    Thread thread=new Thread(new Runable(){
    @Override
    public void run(){
      System.out.print("Thread方式二");
     }
   });
   thread.start();
  }
}

    3.接口类返回值方式:线程【new Thread(new FutureTask<String>(new Callable<String>(){public String call()throws Exception{}}))】,调用start方法。

public class ThreadDemo{
    public static void main(String[] args){
     FutureTask<String> ft = new FutureTask<String>(new Callable<String>(){
      @Override
      public String call(){
        return "Thread方式三";
      }
    });
   Thread thread = new Thread(ft);
   thread.start(); 
  }
}
四、线程知识之线程安全

     线程安全是多线程编程时的计算机程序代码中的一个概念。在共享数据或内存中多条并行执行的程序,在同步机制下保证各个线程的正常且正确的执行,不会出现数据污染等意外情况。线程安全的三个核心概念:

       1.原子性

        银行经典例子:A和B同时向C转账10万元,A向C转账时,读取了C的余额为20万,计算得出30万,还未及将30万写回C的账户,此时B的转账请求过来,读取C的余额为20万,将其加10万并写回,然后A的转账操作继续——将30万写回C的账户,情况下的结果为C的余额最终是30万,而非40万。

扫描二维码关注公众号,回复: 4511736 查看本文章

        2.可见性

        当多个线程并发访问共享数据时,一个线程对共享数据区进行修改操作,其他线程能够立即看到,Java提供了volatile关键字来保证线程间的可见性。

        3.顺序性

        在多线程环境下,程序执行的顺序按照代码的先后顺序执行,Java提供了sychronized和锁用来保证目标代码段执行的顺序性。

    多线程共享数据代码案例:           

public class ThreadDemo{
  public static void main(String[] args){
     User user =new User();//堆内存
     Thread thread1=new Thread(){
       @Override
       public void run(){
        user.setName("程序员");
    }
   };
     Thread thread2=new Thread(){
       @Override
       public void run(){
        user.setName("程序猿");
    }
   };
   thread1.start();
   thread2.start();
  }
}
五、List集合特性

   List集合,典型的线性结构,数据元素按照索引位置排序,不计重复,可根据数据元素在集合中的索引位置检索对象(此特点通过查看List API文档中特有方法,可知晓)。

六、List集合特有方法

   List集合除了具有Collection的方法外,还具有自己的特有方法,有一个共性特点就是都可以操作角标。

  • void add ( int index , E element) : 在集合指定位置插入指定元素
  • void add ( int index , Collection collection ) : 将指定collection中所有元素添加到集合中指定位置
  • Object remove ( int index ) : 移除集合中指定位置的元素
  • Object set ( int index , E element ) : 修改指定位置的元素,并返回以前指定位置的元素
  • Object get ( int index ) : 获取指定位置的元素
  • int indexOf ( Object obj ) : 返回集合中第一次出现指定元素的索引,如果不包含此元素返回-1
  • int lastIndexOf ( Object obj ) : 返回集合中最后出现指定元素的索引,如果不包含此元素返回-1
  • List subList ( int fromIndex , int toIndex ) : 返回集合中指定索引区间的子集合
七、集合迭代之传统for循环(案例:根据指定元素,移除集合内相同元素)
String[] temp={"temp","temp1","temp","temp2"};
List<String> temps=Arrays.asList(temp);
for(int i=0;i<=temps.size();i++){
   if("temp".equals(temps.get(i))){
      temps.remove(i);
      --i;//移除元素后,集合长度变化
   }
}
八、集合迭代之Iterator(案例:根据指定元素,移除集合内相同元素) 
String[] temp={"temp","temp1","temp","temp2"};
List<String> temps=Arrays.asList(temp);
Iterator<String> iterator=temps.iterator();
while(iterator.hasNext()){
  String data=iterator.next();
  if("temp".equals(data)){
      iterator.remove();
  }
} 
九、集合迭代之foreach

    foreach能工作是因为集合类都实现Iterable接口,其通过Iterable接口在序列中移动,只支持顺序查询集合序列,无操作集合相关的方法。

String[] temp={"temp","temp1","temp","temp2"};
for(String data : temp){
   //迭代数组
   if("temp".equals(data)){
       data="tempMsg";
  }
}

猜你喜欢

转载自blog.csdn.net/qq_34289679/article/details/80631401