当前位置:首页 > 生态圈 > 正文内容

编程面试八股文(面试 八股文指的是什么)

abcsky887个月前 (10-28)生态圈102

今天给各位分享

翻出来去年准备面试的时候记的笔记,发现有一部分虽然内容并不深入,但是很适合面试前花半个小时扫一遍帮助自己回忆,所以整合成文章与君共享~注解什么是注解就是代码中的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行对应的处理

编程面试八股文(面试 八股文指的是什么)

什么是元注解元注解是用来修饰注解的,常用的元注解有@Retention(设置注解的生命周期,可取值就是RetentionPolicy的枚举:SOURCE,CLASS,RUNTIME)和@Target(注解可以修饰哪些方法,比如方法,成员变量,包)

怎么使用注解Spring aop + 注解 + 反射泛型什么是泛型允许在创建对象和调用方法时才明确具体类型(泛型网站推广引流平台还有一种较为准确的说法就是为了参数化类型,或者说可以将类型当作参数传递给一个类或者是方法)。

使用泛型有什么好处?与普通的 Object 代替一切类型这样简单粗暴而言,泛型使得数据的类别可以像参数一样由外部传递进来它提供了一种扩展能力它更符合面向抽象开发的软件编程宗旨当具体的类型确定后,泛型又提供了一种类型检测的机制,只有相匹配的数据才能正常的赋值,否则编译器就不通过。

所以说,它是一种类型安全检测机制,一定程度上提高了软件的安全性防止出现低级的失误泛型提高了程序代码的可读性,不必要等到运行的时候才去强制转换,在定义或者实例化阶段,因为 Cache这个类型显化的效果,程序员能够一目了然猜测出代码要网站推广引流平台操作的数据类型。

什么是泛型擦除泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除类型擦除带来的局限性利用类型擦除的原理,用反射的手段就绕过了正常开发中编译器不允许的操作限制。

多线程进程和线程的区别进程是系统资源分配的基本单位,线程是系统资源调度的基本单位为什么要使用多线程?是为了提高系统资源的利用率,现在的cpu大多数是多核的,只用单线程就是只用到了一个核心,其他cup都是空闲的

工作时什么地方会用到多线程?tomcat连接池,数据库连接池,多线程消费队列消息以提高并发.....什么是线程安全?多线程执行某个类,如果这个类始终的表现出正确行为,那网站推广引流平台么这个类就是线程安全的如何实现线程安全?

使用atomic包下的类保证原子性使用volatile关键字保证可见性使用并发包下的集合类保证线程安全使用synchronized关键字或lock什么情况下会导致死锁?当前线程拥有其他线程需要的资源,当前线程等待其他线程持有的资源,都不放弃自己持有的资源

如何避免死锁?固定资源加锁的顺序尽量缩小加锁范围使用可定时释放的锁CAS什么是CAS?CAS的全称是compare and swap,比较并交换,它是一个原子操作,对应cpu指令是cmpxchgCAS有三个操作数,当前值A,内存值V,要修改的新值B,假设当前值A和内存值V相等,就把A改成B,假设当前值A和网站推广引流平台内存值B不相等,要么就重试,要么就放弃更新

为什么要用CAS?CAS相当于没有加锁,多个线程都可以操作共享资源,在实际修改的时候才去判断是否能修改成功,很多情况下会比synchronized锁高效,比如,对一个值进行累加,就没必要使用synchronized锁,用juc包下的Atomic类就可以

CAS有什么问题?假设线程A读到当前值是10,可能线程B修改为100,之后线程C又修改为10,等到线程A又拿到执行权时,因为当前值和内存值是一致的,线程A是可以修改的如何解决?java提供了AtomicStampedReference类,就是加个版本,对比版本值+内存值是否一致

synchronized什么网站推广引流平台是synchronized?synchronized是java中的一个关键字,它能够将代码/方法锁起来,一次只能允许一个线程进入被锁住的代码块如果synchronized锁的是代码块,对应的锁是对象实例

如果synchronized锁的是实例方法,对应的锁是对象实例如果synchronized锁的是静态方法,对应的锁是当前对象的class实例synchronized原理jdk 1.6之前:线程在进入同步方法/代码块时,monitor对象会把当前线程id进行存储,设置mark word的monitor对象地址,并把阻塞线程设置到monitor的等待线程队列中,它的加锁依赖底层操作系统的mutex相网站推广引流平台关指令实现,会有用户态和内核态的切换,性能消耗十分明显

jdk 1.6之后:引入偏向锁和轻量级锁在jvm层面实现加锁逻辑,不依赖底层操作系统,没有切换的性能消耗mark word对锁状态的记录一共有四种:无锁,偏向锁,轻量级锁,重量级锁偏向锁就是jvm认为只有某个线程会执行同步代码,所以在mark word中会直接记录线程id,只要有线程来执行代码,就会对比线程id是否相等,相等则当前线程能直接获取到锁,执行同步代码;如果不相等,则尝试用cas操作修改当前线程id,如果修改成功,就获取到锁,执行同步代码;如果cas操作失败,说明有竞争环境,就撤销偏向锁,升级为轻量级锁

轻量级锁的状态下,线程会在栈网站推广引流平台帧中创建Lock Record,Lock Record中会记录mark word信息,线程执行到同步代码时,则使用cas将mark word中的锁记录指针指向线程栈帧中的Lock Record,cas操作成功,则获得轻量级锁;cas操作失败,则自旋,自旋一定次数后,则升级为重量级锁

锁只有升级,没有降级AQS什么是公平锁和非公平锁?公平锁:竞争环境下,先到临界区的线程一定比后到临界区的线程更快获得锁非公平锁:竞争环境下,先到临界区的线程未必比后到临界区的线程更快获得锁公平锁和非公平锁的区别:线程执行同步块代码时,是否会先尝试获取锁,如果会先尝试获取锁,那就是非公平的;如果不尝试获取锁,直接进入队网站推广引流平台列,再等待唤醒,就是公平的

synchronized是公平锁还是非公平锁?非公平锁什么是AQS?是可以给我们实现锁的一个框架,内部实现的关键就是维护了一个先进先出的队列,和status状态变量(当前锁状态)AQS定义了模板,具体实现由子类完成。

AQS支持两种模式:独占(锁只会被一个线程独占)和共享(多个线程可以同时执行)ReentrantLock(非公平锁)加锁过程:CAS尝试获取锁,获取锁失败,就将线程入队,把前驱节点状态改为SIGNAL状态,并将自己挂起

解锁过程:把status置0,唤醒头结点的下一个节点,被唤醒的节点自然就回去获取锁 线程池为什么需要线程池java中每次创建和回收线程都回去网站推广引流平台内核创建及回收,这有可能导致创建和销毁花的时间比处理任务花的时间还多,所以需要线程池来提高线程复用性

怎么使用线程池?spring有ThreadPoolTaskExecutor,底层用了jdk的ThreadPoolExecutorThreadPoolExecutor的几个重要参数corePoolSize:核心线程数

maximumPoolSize:最大线程数keepAliveTime:线程空余时间workQueue:阻塞队列handler:拒绝策略AbortPolicy:当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。

CallerRunsPoli网站推广引流平台cy:当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务DiscardOldestPolicy:当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。

DiscardPolicy:当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务线程池创建线程过程首先会判断当前活跃线程数是否小于corePoolSize,如果小于,就直接创建新的线程执行任务如果大于corePoolSize,就判断workQueue阻塞队列是否已满,如果还没满,就将任务放到阻塞队列中。

如果workQueue已满,就判断当前活跃线程数是否网站推广引流平台大于maximumPoolSize,如果没大于,就创建新的线程执行任务如果大于maximumPoolSize,则执行拒绝策略如何指定线程池线程数假设运行任务的cpu核数是N,cpu密集型任务线程数可以设置成N+1,io密集型任务可以设置成2N

线程数不是越大越好,设置的过大可能会使系统有大量上下文切换开销ctl参数高3位表示线程池状态,低29位表示线程数量线程池的五种状态RUNNING状态说明:线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。

状态切换:线程池的初始化状态是RUNNING换句话说,线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0!S网站推广引流平台HUTDOWN状态说明:线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务。

状态切换:调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWNSTOP状态说明:线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务状态切换:调用线程池的shutdownNow()接口时,线程池由(RUNNING or SHUTDOWN ) -> STOP。

TIDYING状态说明:当所有的任务已终止,ctl记录的”任务数量”为0,线程池会变为TIDYING状态当线程池变为TIDYING状态时,会执行钩子函数terminated()ter网站推广引流平台minated()在ThreadPoolExecutor类中是空的,若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。

状态切换:当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING 当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。

TERMINATED状态说明:线程池彻底终止,就变成TERMINATED状态状态切换:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED网站推广引流平台

内存模型为什么要有java内存模型?java为了屏蔽硬件和操作系统访问内存的各种差异,提出了java内存模型的规范,保证了java在各平台下对内存的访问都能得到一致的效果java内存模型的主要内容java内存模型的抽象结构:线程间的共享变量存储在主内存中,每个线程有自己的本地内存,本地内存存储了共享变量的副本。

线程对变量的所有操作都必须在本地内存中进行,不能直接读写主内存的变量,主内存和工作内存的交互由java内存模型定义的8种操作完成happen-before规则:某些重要场景下,这一组操作都不能进行重新排序,前面一个操作结果必须对后续操作可见

对volatile语义的探讨:volatile网站推广引流平台关键字可以实现可见性和有序性,java内存模型为了实现其可见性和有序性,定义了四种内存屏障规范,其实就是在volatile前后加上内存屏障,使编译器和cpu无法重新排序,使其有序可见

Java从编译到执行,发生了什么? 为什么说java是跨平台语言,可以“一次编译,到处运行”?java源代码会被编译成class文件,class文件是运行在JVM之上的,当我们安装jdk时,可以发现jdk是分不同操作系统的,jdk里包含jvm,所以java依赖着jvm实现了跨平台

java从源码到执行的过程编译:java文件经过语法分析、语义分析、注解处理 最后才生成会class文件加载装载:装载则把class文件装网站推广引流平台载至JVM连接验证:验证类是否符合java规范和jvm规范准备:为类的静态变量分配内存,初始化为系统的初始值

解析:将符号引用转换为直接引用初始化:为类的静态变量赋予正确的初始值,收集class文件的静态变量,静态代码块,静态方法到clinit方法,从上到下执行解释:则是把字节码转换成操作系统可识别的执行指令,在JVM中会有字节码解释器和即时编译器(JIT编译器)。

在解释时会对代码进行分析,查看是否为「热点代码」,如果为「热点代码」则触发JIT编译,下次执行时就无需重复进行解释,提高解释速度执行:调用系统的硬件执行最终的程序指令双亲委派模型 JDK中默认类加载器AppClassLoader(加载网站推广引流平台classpath下的所有类)

Ext ClassLoader(加载扩展包类库)BootStrap ClassLoader(加载java核心类库)AppClassLoader的父加载器为Ext ClassLoader、Ext ClassLoader的父加载器为BootStrap ClassLoader。

这里的父子关系并不是通过继承实现的,而是组合什么是双亲委派机制?加载器在加载过程中,先把类交由父类加载器进行加载,父类加载器没找到才由自身加载双亲委派机制目的:为了防止内存中存在多份同样的字节码(安全)。

如何打破双亲委派机制?自定义ClassLoader,重写loadClass方法(只要不依次往上网站推广引流平台交给父加载器进行加载,就算是打破双亲委派机制)打破双亲委派机制Tomact为了Web应用程序类之间隔离,为每个应用程序创建WebAppClassLoader类加载器

为了Web应用程序类之间共享,把ShareClassLoader作为WebAppClassLoader的父类加载器,如果WebAppClassLoader加载器找不到,则尝试用ShareClassLoader进行加载

为了Tomcat本身与Web应用程序类隔离,用CatalinaClassLoader类加载器进行隔离,CatalinaClassLoader加载Tomcat本身的类为了Tomcat与Web应用程序类共享,用CommonC网站推广引流平台lassLoader作为CatalinaClassLoader和ShareClassLoader的父类加载器

ShareClassLoader、CatalinaClassLoader、CommonClassLoader的目录可以在Tomcat的catalina.properties进行配置线程上下文加载器:由于类加载的规则,很可能导致父加载器加载时依赖子加载器的类,导致无法加载成功(BootStrap ClassLoader无法加载第三方库的类),所以存在「线程上下文加载器」来进行加载。

垃圾回收机制 什么是垃圾:只要对象不再被使用,那即是垃圾如何判断为垃圾:可达性分析算法和引用计算算法,JVM使网站推广引流平台用的是可达性分析算法什么是GC Roots:GC Roots是一组必须活跃的引用,跟GC Roots无关联的引用即是垃圾,可被回收

常见的垃圾回收算法:标记清除、标记复制、标记整理为什么需要分代:只有少部分对象会存活很长时间在堆内存上都会在物理或逻辑上进行分代,为了使「stop the word」持续的时间尽可能短以及提高并发式GC所能应付的内存分配速率。

Minor GC:当Eden区满了则触发,从GC Roots往下遍历,年轻代GC不关心老年代对象什么是card table【卡表】:空间换时间(类似bitmap),在老年代对象持有年轻代对象引用时,能够避免扫描老年代的所有对象进而顺利进行Min网站推广引流平台or GC

堆内存占比:年轻代占堆内存1/3,老年代占堆内存2/3Eden区占年轻代8/10,Survivor区占年轻代2/10(其中From 和To 各站1/10)List集合的继承体系CollectionSet。

HashSetListLinkedListArrayList底层数据结构ArrayList底层数据结构是数组,LinkedList底层数据结构是链表为什么有了数组还要用ArrayList?数组有一个特点,使用时必须指定大小,而ArrayList不用,在实际使用时,往往数组大小是不固定的,而ArrayList是实现了动态扩容的,所以一般使用ArrayList

ArrayList初始化和扩网站推广引流平台容过程new ArrayList()的时候,初始化一个空数组第一次调用add()方法的时候,会给数组初始化一个大小,这个大小默认是10在使用ArrayList每一次add的时候,都会去判断数组空间够不够,如果够,那么直接追加上去;如果不够,就需要扩容

每次扩容扩为原来的1.5倍,扩容完后,对数组进行拷贝CopyOnWriteArrayList(线程安全的List)copy on write技术:想修改,先复制,再替换add()方法实现:先加锁,复制一个新的数组,往新的数组里添加数据,最后把array指向新数组

CopyOnWriteArrayList的缺点耗费内存,每次set()/add()都会复网站推广引流平台制一个新数组出来CopyOnWriteArrayList只能保证数据最终一致性,不能保证实时一致性MapMap的继承体系

MapHashMap 底层结构:数组+链表/红黑树LinkedHashMap 底层结构:数组+链表+双向链表TreeMap 底层结构:红黑树ConcurrentHashMap 底层结构:数组+链表/红黑树

HashMap构造方法:HashMap有几个构造方法,最重要的作用是指定数组初始长度和负载因子,不指定,默认长度是16,默认负载因子是0.75HashMap的长度只能是2次幂,传10进去默认长度会是16(tableSizeFor方法)

负载因子的大小决定着HashMap的扩容,网站推广引流平台负载因子不能调的太大,太大容易增加hash冲突的概率怎么用key定位元素在数组中的位置?先算出key的hash值,然后高16位和低16位异或运算,产生最终的hash值,这样可以增加随机性,减少冲突,再用数组长度-1 & hash得到元素在数组中的位置

put方法的过程对key做hash运算,计算出元素在数组中的位置如果没有hash碰撞,就直接放到数组中,如果碰撞了,需要根据当前节点下是链表还是红黑树来进行插入如果有相同的key,就直接替换原来的值,如果没有就执行插入操作

最后判断是否需要扩容get方法过程对key做hash运算,计算出元素在数组中的位置没有hash冲突就直接返回,有hash冲突就根网站推广引流平台据当前节点下是链表还是红黑树来取出HashMap怎么判断一个元素是否相同?

hash值相同 && (equals方法 || == 返回true)什么情况下会用到红黑树?数组大小大于64且链表长度大于8时,链表会转成红黑树,红黑树大小为6时会退化为链表LinkedHashMap:

继承了HashMap,在HashMap的基础上维护了一个双向链表,遍历的时候使用双向链表,所以LinkedHashMap是插入有序的TreeMap:key不能为null,通过Comparator排序,如果Comparator为null,那么就使用自然排序

java7和java8中HashMap的不同java7在扩容时使用的头网站推广引流平台插法,java8使用的是尾插法,java7中没有引入红黑树SpringMVCmvc含义C:Controller 控制器,作用:接受请求->调用业务类->派发页面

M:Model,包括service,dao,entityV:View流程说明客户端(浏览器)发送请求,直接请求到 DispatcherServletDispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。

解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理HandlerAdapter 会根据 Han网站推广引流平台dler来调用真正的处理器开处理请求,并处理相应的业务逻辑。

处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 ViewViewResolver 会根据逻辑 View 查找实际的 ViewDispaterServlet 把返回的 Model 传给 View(视图渲染)。

把 View 返回给请求者(浏览器)Spring基础 SpringIOCSpringIOC解决的是对象管理和对象依赖的问题,本来是要自己new对象,现在把对象交给IOC容器管理IOC容器可以理解为一个工厂,我们把对象交给工厂,工厂管理这些对象的创建和依赖,等需要对网站推广引流平台象的时候,从工厂里取就可以

控制反转:把原有自己掌控的事交给别人去管理,它更多的是一种思想或设计模式依赖注入:依赖注入是spring中实现控制反转的方式,对象无需自行创建或管理依赖关系,依赖关系将会被自动注入为什么要使用IOC容器?主要的好处在于使用IOC容器可以将对象统一管理,以及降低耦合度

IOC容器中怎么定义bean?注解XMLjava config基于groovy dsl配置SpringAOPSpringAOP解决的是非业务代码抽取的问题,AOP底层技术是动态代理,在spring中是依赖BeanPostProcessor实现的

如果需要在方法上注入重复性非业务代码,就可以用SpringAOP网站推广引流平台,所谓面向切面编程,就是在方法前后增加非业务代码Spring生命周期Spring在启动时需要扫描在XML/注解/java config中需要被spring管理的信息,将这些信息封装成BeanDefinition,并放入BeanDefinitionMap中(实际就是把元数据加载起来,到这里还没实例化对象)

遍历BeanDefinitionMap,执行BeanFactoryPostProcessor这个工厂后置处理器通过实例化对象(这里只是创建对象,还没有实例化)注入相关属性初始化:首先判断bean有没有实现Aware接口,如果存在则填充相关资源

接着执行BeanPostProcessor后置处理器,网站推广引流平台会先执行BeanPostProcessor的before方法再执行init相关方法,比如@PostConstruct方法,实现了InitializingBean的接口,init-method定义的方法

最后执行行BeanPostProcessor的after方法(AOP的关键)销毁时需要执行配置的相关的destroy方法mysql事务&&锁机制&&MVCC为什么需要事务事务是为了保证数据的最终一致性事务四大特性

原子性、一致性、隔离性、持久性原子性由undo log保证持久性由redo log 保证隔离性由数据库隔离级别供我们选择,分别有read uncommit,read commit,repe网站推广引流平台atable read,serializable

一致性是事务的目的,一致性由应用程序来保证事务并发会存在各种问题,分别有脏读、重复读、幻读问题上面的不同隔离级别可以解决掉由于并发事务所造成的问题,而隔离级别实际上就是由MySQL锁来实现的为什么需要MVCC。

频繁加锁会导致数据库性能低下,引入了MVCC多版本控制来实现读写不阻塞,提高数据库性能,MVCC原理即通过read view 以及undo log来实现mysql调优 调优方法尽量使用覆盖索引减少回表,意味着select的时候尽量指明字段,而不是select *

考虑建立联合索引,将区分度最高的字段放在最左,同时要考虑最左匹配原则对索引进行函网站推广引流平台数操作或表达式计算会导致索引失效利用子查询优化超多分页场景使用explain查看执行计划开启事务后,在事务内尽量只操作数据库,并尽量减少持有锁的时间(比如既需要插入有需要更新的情况下,先插入再更新)

在索引使用正确的情况下仍然由慢查询,怎么优化冷热数据分离加一层缓存如果有字符串查询慢,可以使用es根据查询条件维度,增加聚合表(空间换时间)写性能瓶颈怎么解决?升级主从架构,读写分离分库分表这篇文章就写到这里啦,自认相当浅显也并不全面,但是拿来在碎片时间复习,回忆知识点也是可以的,最后说说我对八股文的看法,背八股文应付面试当然不是学习提升的最终目的,但是八股文可以帮你梳理知识脉络,让你先知道该学习啥网站推广引流平台,知识点大概长什么样,学习总要先“知其然”,之后再慢慢“知其所以然”,后端知识体系的建立真的不是一日之功,路漫漫其修远兮,我们一起上下求索吧

扫描二维码推送至手机访问。

版权声明:本文由海南拓宏网络科技工作室发布,如需转载请注明出处。

本文链接:http://4blc.com/post/571.html

分享给朋友:

“编程面试八股文(面试 八股文指的是什么)” 的相关文章

阿里java笔试题目(阿里笔试题库 java)

本文分享给大家的是: 热文导读 | 点击标题阅读讲真,计算机专业可能快“一统天下”了!如果找不到好工作,你一定不是计算机专业老师,我建议你多挂点人 作为一枚计算机软件专业的学生党,从进入大学校园的第一门课程《职业发展概论》上就明白一个道理:“在计算机软件行业,学不...

java培训口碑比较好的(java培训课程哪家好)

今天给各位分享 从毕业生就业说起  又到一年大学毕业季国内研究机构麦可思研究院针对大学生就业的最新报告显示,计算机相关专业再次霸占各种榜单  毕业半年平均月薪最高专业:计算机科学与技术,5452元  毕业三年平均月薪最高专业:计算机科学与技术,。 8665元。  就业满意度...

java是个啥(java主要是做什么的)

本文分享给大家的是:   无论你是否是计算机科学专业的学生,你都可能听说过Java,它是最受欢迎的编程语言之一,拥有巨大的职业机会有数以百万计的Java 程序员从 Java 编程中赚取可观的薪水  学习Java能做什么?  移动应用程序开发   Java是开发Android...

java开发工程师前景(java开发能做什么工作)

本篇文章给大家谈谈 在.jar包的引入、xml的配置等方面这就是以前的jar包引入工程的方式——手动复制进来尤其是早期的java .jar版本,差个0.1甚至是0.01都能出大毛病,所以那时候我们作项目就是一个项目作完,作另一个项目时将上一个经过测试了的项目的jars包们考过来,...

大连java培训机构有哪些(大连java招聘信息)

本文分享给大家的是: 如今,中国已经进入互联网高速发展期,各大公司在招聘时都会需要编程人员,而Java作为程序语言中较为便捷和高效的代表,已经成为许多企业招人时的首选于是,很多人为了程序员的高薪资想要通过培训转行,那么大连正规Java培训收费多少呢?今天“好程序员”就来带大家分析一...

计算机专业读什么大学好(计算机专业学)

本文分享给大家的是: 翻开计算机本科专业目录,我们会看到计算机是个大类,计算机专业类包括计算机科学与技术、软件工程、网络工程、信息安全等七八个专业其中,最核心、最基础的专业就是计算机科学与技术,这些也是各院校计算机系招生的主要专业。 计算机类专业的学生所要学习的不仅是会使用...