数组,即数据对象,属于线性结构(数据元素间存在一对一的关系),是有序的数据元素系列,元素类型(基本数据类型、引用数据类型)和长度固定。数组中元素的有序,是指元素存储在一个连续性的内存块,由于内存的连续,因此具有通过索引快速访问元素的特性。在数组长度范围内添加或删除数据元素时,其时间复杂度取决于添加的位置,时间复杂度越高,效率越低,可忽略空间复杂度。
链表,属于线性结构(数据元素间存在一对一的关系),元素类型固定和长度不固定(动态增减),逻辑上的有序,是物理存储单元上非连续、非顺序的存储结构,通过链表中的指针链接次序实现。同时,它是由一系列结点(数据元素)组成,每个结点根据其指针寻址下一个结点,结点可以在运行时动态生成。由于链表的指针寻址和结点动态生成,因此增加和删除数据元素时,不会造成结点间的移动,空间复杂度和时间复杂度优,但是在查询元素时,需要通过按照结点间指针的顺序依次访问,其时间复杂度取决于该元素与链头的距离。
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万。
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 API文档中特有方法,可知晓)。
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 ) : 返回集合中第一次出现指定元素的索引,如果不包含此元素返回-1int lastIndexOf ( Object obj ) : 返回集合中最后出现指定元素的索引,如果不包含此元素返回-1List subList ( int fromIndex , int toIndex ) : 返回集合中指定索引区间的子集合foreach能工作是因为集合类都实现Iterable接口,其通过Iterable接口在序列中移动,只支持顺序查询集合序列,无操作集合相关的方法。
String[] temp={"temp","temp1","temp","temp2"}; for(String data : temp){ //迭代数组 if("temp".equals(data)){ data="tempMsg"; } }