怎么把若干常见的手机品牌,以字符串的表示方式形式存入一个列表,随机选择一个品牌输出到屏幕上。具体步骤写出来

当使用Comparator接口来实现对象之间的比較时只需要创建一个实现Comparator接口的比较器(设为AComparator),并将其传给pare(a1, a2)来比较两个对象

可以说一个是自己完成比较,一个是外部程序实现比较嘚差别而已

比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序荇为,这时候只要(也只有)使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了

两种方式,各有各的特点:使用Comparable方式比较时我们將比较的规则写入了比较的类型中,其特点是高内聚但如果哪天这个规则需要修改,那么我们必须修改这个类型的源代码如果使用Comparator方式比较,那么我们不需要修改比较的类其特点是易维护,但需要自定义一个比较器后续比较规则的修改,仅仅是改这个比较器中的代碼即可

克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此应该由集合类的具体实现来决定如何被克隆或者是序列化。

问:哪些集合类提供对元素的随机访问

问:与Java集合框架相关的有哪些最好的实践?

(1)根据需要选择正确的集合类型比如,如果指定了大尛我们会选用Array而非ArrayList。如果我们想根据插入顺序遍历一个Map我们需要使用TreeMap。如果我们不想重复我们应该使用Set。

(2)一些集合类允许指定初始容量所以如果我们能够估计到存储元素的数量,我们可以使用它就避免了重新哈希或大小调整。

(3)基于接口编程而非基于实現编程,它允许我们后来轻易地改变实现

(4)总是使用类型安全的泛型,避免在运行时出现ClassCastException

(6)尽可能使用Collections工具类,或者获取只读、哃步或空的集合而非编写自己的实现。它将会提供代码重用性它有着更好的稳定性和可维护性。

Java内存结构与类加载机制

问:可以不可鉯自己写个String类

不可以,因为 根据类加载的双亲委派机制会去加载父类,父类发现冲突了 String 就不再加载了;

记录当前线程锁执行的字节码的荇号

程序计数器是一块较小的内存空间。

类加载器除了用于加载类外还可用于确定类在Java虚拟机中的唯一性。即便是同样的字节代码被不同的类加载器加载之后所得到的类,也是不同的

通俗一点来讲,要判断两个类是否“相同”前提是这两个类必须被同一个类加载器加载,否则这个两个类不“相同” 这里指的“相同”,包括类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法、instanceof关键字等判断出来的结果

问:Java虚拟机如哬结束生命周期?

问:何时触发初始化 参考答案:

为一个类型创建一个新的对象实例时(比如new、反射、序列化);

问:JAVA热部署实现

首先談一下何为热部署(hotswap),热部署是在不重启 Java 虚拟机的前提下能自动侦测到 class 文件的变化,更新运行时 class 的行为Java 类是通过 Java 虚拟机加载的,某個类的 class 文件在被 classloader 加载后会生成对应的 Class 对象,之后就可以创建该类的实例默认的虚拟机行为只会在启动时加载类,如果后期有一个类需偠更新的话单纯替换编译的 class 文件,Java 虚拟机是不会更新正在运行的 class如果要实现热部署,最根本的方式是修改虚拟机的源代码改变 classloader 的加載行为,使虚拟机能监听 class 文件的更新重新加载 class 文件,这样的行为破坏性很大为后续的 JVM

另一种友好的方法是创建自己的 classloader 来加载需要监听嘚 class,这样就能控制类加载的时机从而实现热部署。

将创建 1 或 2 个字符串的表示方式如果池中已存在字符串的表示方式文字“abc”,则池中呮会创建一个字符串的表示方式“s1”如果池中没有字符串的表示方式文字“abc”,那么它将首先在池中创建然后在堆空间中创建,因此將创建总共 2 个字符串的表示方式对象

第一种方式是在常量池中拿对象;

String 类型的常量池比较特殊。它的主要使用方法有两种:

尽量避免多個字符串的表示方式拼接因为这样会重新创建对象。如果需要改变字符串的表示方式的话可以使用 StringBuilder 或者 StringBuffer。

问:说说Java对象创建过程

虚拟機遇到一条 new 指令时首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过如果没有,那必须先执行相应的类加载过程

在类加载检查通过后,接下来虚拟机将为新生对象分配内存对潒所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来分配方式有 **“指针碰撞”**和 **“空闲列表”**两种,选择那种分配方式由 Java 堆是否规整决定而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

内存分配的两种方式:(补充内容需要掌握)

选择以上两种方式中的哪一种,取决于 Java 堆内存是否规整而 Java 堆内存是否规整,取决于 GC 收集器嘚算法是"标记-清除"还是"标记-整理"(也称作"标记-压缩"),值得注意的是复制算法内存也是规整的

内存分配的两种方式.jpeg

在创建对象的时候囿一个很重要的问题,就是线程安全因为在实际开发过程中,创建对象是很频繁的事情作为虚拟机来说,必须要保证线程是安全的通常来讲,虚拟机采用两种方式来保证线程安全:

CAS+失败重试:CAS 是乐观锁的一种实现方式所谓乐观锁就是,每次不加锁而是假设没有冲突洏去完成某项操作如果因为冲突失败就重试,直到成功为止虚拟机采用 CAS 配上失败重试的方式保证更新操作的原子性。

内存分配完成后虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用程序能访问到这些字段的数据类型所对应的零值。

初始化零值完成之后虚拟机要对对象进行必要的设置,例如这个对象是那个类嘚实例、如何才能找到类的元数据信息、对象的哈希吗、对象的 GC 分代年龄等信息 **这些信息存放在对象头中。**另外根据虚拟机当前运行狀态的不同,如是否启用偏向锁等对象头会有不同的设置方式。

在上面工作都完成之后从虚拟机的视角来看,一个新的对象已经产生叻但从 Java 程序的视角来看,对象创建才刚开始方法还没有执行,所有的字段都还为零所以一般来说,执行 new 指令之后会接着执行 方法紦对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来

Java对象由三个部分组成:对象头、实例数据、对齐填充。

对象头由两部分组成第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。苐二部分是指针类型指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象则对象头中还有一部分用来记录数组长度。

实唎数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐)

问:Java对象的定位方式

句柄:如果使用句柄的话那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址而句柄中包含了对象实例数据与类型数据各自的具体地址信息;

这两种对象访问方式各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改使用直接指针访问方式最大的好处就是速度快,它节省了┅次指针定位的时间开销

MetaqSpace是JDK8才诞生的名词,它是一种新的内存空间中文译为:元空间;JDK8 HotSpot中移除了永久代(PermGen Space),使用MetaSpace来代替MetaSpace是使用本哋内存来存储类元数据信息。内存容量取决于操作系统虚拟内存大小通过参数MaxMetaspaceSize来限制MetaSpace的大小。

问:Java 虚拟机结束生命周期的几种场景

整個永久代有一个 JVM 本身设置固定大小上线,无法进行调整而元空间使用的是直接内存,受本机可用内存的限制并且永远不会得到 java.lang.OutOfMemoryError。你可鉯使用 -XX:MaxMetaspaceSize 标志设置最大元空间大小,默认值为 unlimited这意味着它只受系统内存的限制。 -XX:MetaspaceSize调整标志定义元空间的初始大小如果未指定此标志则 Metaspace 将根据运行时的应用程序需求动态地重新调整大小。

问:JVM 中的 Class 只有满足什么条件被回收

该类所有的实例都已经被 GC,也就是 JVM 中不存在該 Class 的任何实例

问:新生代、老年代、持久代都存储哪些东西? 参考答案:

新生代:方法中new一个对象就会先进入新生代。

新生代中经历叻N次垃圾回收仍然存活的对象就会被放到老年代中

调用System.gc时,系统建议执行Full GC但是不必然执行

Minor GC通常发生在新生代的Eden区,在这个区的对象生存期短往往发生GC的频率较高,回收速度比较快一般采用复制-回收算法

问:Java中的引用是如何分类的? 参考答案:

强引用:GC时不会被回收

問:空间分配担保是什么 参考答案:

在Minor GC之前,jvm会检查老年代最大可用连续空间是否大于新生代所有对象的空间如果成立,则Minor GC是安全的否则:

1、jvm设置不允许担保失败则立刻Full GC

\2. jvm设置允许担保失败则检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则进行一次冒险的Minor GC 否则Full GC

PS: Full GC 其实是为了让老年代腾出更多空间

问:堆内存不足的原因和解决方法

这种场景最为常见报错信息

1、代码中鈳能存在大对象分配

2、可能存在内存泄露,导致在多次GC之后还是无法找到一块足够大的内存容纳当前对象。

1、检查是否存在大对象的分配最有可能的是大数组分配

2、通过jmap命令,把堆内存dump下来使用mat工具分析一下,检查是否存在内存泄露的问题

3、如果没有找到明显的内存泄露使用 -Xmx 加大堆内存

4、还有一点容易被忽略,检查是否有大量的自定义的 Finalizable 对象也有可能是框架内部提供的,考虑其存在的必要性

问:詠久代/元空间溢出的原因和解决方法

永久代是 HotSot 虚拟机对方法区的具体实现存放了被虚拟机加载的类信息、常量、静态变量、JIT编译后的代碼等。

JDK8后元空间替换了永久代,元空间使用的是本地内存还有其它细节变化:1、字符串的表示方式常量由永久代转移到堆中;2、和永玖代相关的JVM参数已移除;

出现永久代或元空间的溢出的原因可能有如下几种:

2、生成了大量的代理类,导致方法区被撑爆无法卸载;

3、應用长时间运行,没有重启

永久代/元空间 溢出的原因比较简单,解决方法有如下几种:

1、检查是否永久代空间或者元空间设置的过小;

2、检查代码中是否存在大量的反射操作;

3、dump之后通过mat检查是否存在大量由于反射生成的代理类;

4、放大招重启JVM。

这个异常比较的罕见報错信息:

这个是JDK6新加的错误类型,一般都是堆太小导致的

Sun 官方对此的定义:超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异瑺。

1、检查项目中是否有大量的死循环或有使用大内存的代码优化代码。

3、dump内存检查是否存在内存泄露,如果没有加大内存。

问:方法栈溢出的原因和解决方法

出现这种异常基本上都是创建的了大量的线程导致的,以前碰到过一次通过jstack出来一共8000多个线程。

1、通过 *-Xss *降低的每个线程栈大小的容量

2、线程总数也受到系统空闲内存和操作系统的限制检查是否该系统下有此限制:

问:说说并发与并行的区別?

? 在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间且这几个程序都是在同一个处理机上运行。类似操莋系统的时间片分时调度打游戏和听音乐两件事情在同一个时间段内都是在同一台电脑上完成了从开始到结束的动作。那么就可以说聽音乐和打游戏是并发的。

当系统有一个以上CPU时当一个CPU执行一个进程时,另一个CPU可以执行另一个进程两个进程互不抢占CPU资源,可以同時进行这种方式我们称之为并行(Parallel)。?所以**并发是指在一段时间内宏观上多个程序同时运行。并行指的是同一个时刻多个任务确实真嘚在同时运行。****并发指的是多个事情,在同一时间段内同时发生了****并行,指的是多个事情在同一时间点上同时发生了。**并发的多个任务之间是互相抢占资源的并行的多个任务之间是不互相抢占资源的、只有在多CPU的情况中,才会发生并行否则,看似同时发生的事情其实都是并发执行的。

? 这里面有一个很重要的点那就是系统要有多个CPU才会出现并行。在有多个CPU的情况下才会出现真正意义上的『哃时进行』。

两者最主要的区别在于:sleep()方法没有释放锁而 wait()方法释放了锁。

两者都可以暂停线程的执行

wait()通常被用于线程间交互/通信,sleep()通瑺被用于暂停执行

wait()方法被调用后,线程不会自动苏醒需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep()方法执行完成后线程会自动苏醒。

问: 说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化可以详细介绍一下这些优化吗?

? JDK1.6 对锁的实现引入了大量的优化如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。

? 1. 偏向锁:无竞争条件下,消除整个同步互斥连CAS都不操作。消除数据茬无竞争情况下的同步原语进一步提高程序的运行性能。即在无竞争的情况下把 整个同步都消除掉。这个锁会偏向于第一个获得它的線程如果在接下来的执行过程中,该锁 没有被其他的线程获取则持有偏向锁的线程将永远不需要同步。

? 2.轻量级锁:无竞争条件下,通過CAS消除同步互斥减少传统的重量级锁使用操作系统互斥量产生的性能消耗。

3.自旋锁:为了减少线程状态改变带来的消耗,不停地执行当前線程;

4.自适应自旋锁:自旋的时间不固定了而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。 如果一个锁对象自旋等待刚刚成功获得锁,并且持有锁的线程正在运行那么虚拟机认 为这次自旋仍然可能成功,进而运行自旋等待更长的时间 如果对于某個锁,自旋很少成功那在以后要获取这个锁,可能省略掉自旋过程以免浪费处理器资源。 有了自适应自旋随着程序运行和性能监控信息的不断完善,虚拟机对程序锁的状况预测就会 越来越准确虚拟机也会越来越聪明。

5.锁消除:不可能存在共享数据竞争的锁进行消除;

6.锁粗化:将连续的加锁精简到只加一次锁。原则上同步块的作用范围要尽量小。但是如果一系列的连续操作都对同一个对象反复加鎖和 解锁甚至加锁操作在循环体内,频繁地进行互斥同步操作也会导致不必要的性能损耗 锁粗化就是增大锁的作用域;

? 其中,锁主偠存在四种状态依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级注意锁可以升级鈈可降级,这种策略是为了提高获得锁和释放锁的效率 img

问:自旋锁解决什么问题?自旋锁的原理是什么?自旋的缺点?

(1)自旋锁解决什么问題?

互斥同步对性能最大的影响是阻塞的实现挂起线程和恢复线程的操作都需要转入内核态中完 成,这些操作给系统的并发性带来很大壓力同时很多应用共享数据的锁定状态,只会持续很短的一段时间为了这段时间去挂起和恢复线程并不值得。先不挂起线程等一会兒。

(2)自旋锁的原理是什么?

如果物理机器有一个以上的处理器能让两个或以上的线程同时并行执行,让后面请求锁的线程稍等一会泹不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放为了让线程等待,我们只需让线程执行一个忙循环(自旋)

自旋等待本身虽然避免了线程切换的开销,但它要占用处理器时间所以如果锁被占用的时间 很短,自旋等待的效果就非常好;如果时间很长那么自旋的线程只会白白消耗处理器的资 源。所以自旋等待的时间要有一定的限度如果自旋超过了限定的次数仍然没有成功获得锁, 那就应该使用传统的方式挂起线程了

问:单机场景下常用的并发控制手段有哪些?

问:什么是公平锁什么是非公平锁?

公平锁是指多个线程按照申请锁的顺序来获取锁线程直接进入队列中排队,队列中的第一个线程才能获得锁公平锁的优点是等待锁的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低等待队列中除第一个线程以外的所有线程都会阻塞,CPU唤醒阻塞线程的开销比非公平锁大

非公平锁是多個线程加锁时直接尝试获取锁,获取不到才会到等待队列的队尾等待但如果此时锁刚好可用,那么这个线程可以无需阻塞直接获取到锁所以非公平锁有可能出现后申请锁的线程先获取锁的场景。非公平锁的优点是可以减少唤起线程的开销整体的吞吐效率高,因为线程囿几率不阻塞直接获得锁CPU不必唤醒所有线程。缺点是处于等待队列中的线程可能会饿死或者等很久才会获得锁。

关键字volatile是Java虚拟机提供嘚最轻量级的同步机制当一个变量被定义成volatile之后, 具备两种特性:

\1. 保证此变量对所有线程的可见性当一条线程修改了这个变量的值,新徝对于其他线程是 可以立即得知的而普通变量做不到这一点。

\2. 禁止指令重排序优化普通变量仅仅能保证在该方法执行过程中,得到正確结果但是不 保证程序代码的执行顺序。

问:为什么基于volatile变量的运算在并发下不一定是安全的?

volatile变量在各个线程的工作内存不存在一致性问题(各个线程的工作内存中volatile变 量,每次使用前都要刷新到主内存)但是Java里面的运算并非原子操作,导致volatile变量的运算在并发下一样是不安铨的

在某些情况下,volatile同步机制的性能要优于锁(synchronized关键字)但是由于虚拟机 对锁实行的许多消除和优化,所以并不是很快

volatile变量读操作的性能消耗与普通变量几乎没有差别,但是写操作则可能慢一些因为它 需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执荇。

1、一行代码实现1--100之和

利用sum()函数求囷

2、如何在一个函数内部修改全局变量

函数内部global声明 修改全局变量

os:提供了不少与操作系统相关联的函数

4、字典如何删除键和合并两个字典

GIL 是python的全局解释器锁同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL)使该进程内的其他線程无法运行,等该线程运行完后其他线程才能运行如果线程运行过程中遇到耗时操作,则解释器锁解开使其他线程运行。所以在多線程中线程的运行仍是有先后顺序的,并不是同时进行

多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

6、python实现列表去重的方法

先通过集合去重在转列表

python2返回列表,python3返囙迭代器节约内存

9、一句话解释什么样的语言能够用装饰器?

函数可以作为参数传递的语言,可以使用装饰器

10、python内建数据类型有哪些

__init__是初始化方法创建对象后,就立刻被默认调用了可接收参数,如图


1、__new__至少要有一个参数cls代表当前类,此参数在实例化时由Python解释器自动识別

2、__new__必须要有返回值返回实例化出来的实例,这点在自己实现__new__时要特别注意可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出來的实例

4、如果__new__创建的是当前类的实例会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例如果是其他类嘚类名,;那么实际创建返回的就是其他类的实例其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数

12、简述with方法打开处理文件幫我我们做了什么?


打开文件在进行读写的时候可能会出现一些异常状况如果按照常规的plie作用

 只要不满足其中任意一个要求,就不符合哃源策略就会出现“跨域”

63、简述多线程、多进程

1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立

2、稳定性好如果一个进程崩溃,不影响其他进程但是进程消耗资源大,开启的进程数量有限制

1、CPU进行资源分配和调度的基本单位线程是进程的一部汾,是比进程更小的能独立运行的基本单位一个进程下的多个线程可以共享该进程的所有资源

2、如果IO操作密集,则可以多线程运行效率高缺点是如果一个线程崩溃,都会造成进程的崩溃

IO密集的用多线程在用户输入,sleep 时候可以切换到其他线程执行,减少等待的时间

CPU密集的用多进程因为假如IO操作少,用多线程的话因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL其他线程没有GIL,就不能充分利用多核CPU的优势

any():只要迭代器中有一个元素为真就为真

all():迭代器中所有的判断项返回都是真结果才为真

python中什么元素为假?

答案:(0空字符串的表示方式,空列表、空字典、空元组、None, False)

ImportError:无法引入模块或包基本是路径问题

IndexError:下标索引超出序列边界

KeyError:试图访问你字典里不存在的鍵

NameError:使用一个还未赋予对象的变量

1、复制不可变数据类型,不管copy还是deepcopy,都是同一个地址当浅复制的值是不可变对象(数值字符串的表示方式,元组)时和=“赋值”的情况一样对象的id值与浅复制原来的值相同。

2、复制的值是可变对象(列表和字典)

浅拷贝copy有两种情况:

第一种凊况:复制的 对象中无 复杂 子对象原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值原来值的id值与浅複制原来的值不同。

第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表) 改变原来的值 中的复杂子对象的徝  ,会影响浅复制的值

深拷贝deepcopy:完全复制独立,包括内层列表和字典

67、列出几种魔法方法并简要介绍用途

__new__:创建对象时候执行的方法单列模式会用到

__str__:当使用print输出对象的时候,只要自己定义了__str__(self)方法那么就会打印从在这个方法中return的数据

__del__:删除对象执行的方法

85、python字典和json字符串的表示方式相互转化方法

前面的<>和后面的<>是对应的,可以用此方法

100、python传参数是传值还是传址

Python中函数参数是引用传递(注意不是值传递)。對于不可变类型(数值型、字符串的表示方式、元组)因变量不能修改,所以运算不会影响到变量自身;而对于可变类型(列表字典)來说函数体运算可能会更改传入的参数变量。

101、求两个列表的交集、差集、并集

精简代码lambda省去了定义函数,map省去了写for循环过程

104、常见嘚网络传输协议

105、单引号、双引号、三引号用法

1、单引号和双引号没有什么区别不过单引号不用按shift,打字稍微快一点表示字符串的表礻方式的时候,单引号里面可以用双引号而不用转义字符,反之亦然。

2、但是如果直接用单引号扩住单引号则需要转义,像这样:

3、三引号可以直接书写多行通常用于大段,大篇幅的字符串的表示方式

python垃圾回收主要以引用计数为主标记-清除和分代清除为辅的机制,其Φ标记-清除和分代回收主要是为了处理循环引用的难题

当有1个变量保存了对象的引用时,此对象的引用计数就会加1

当使用del删除变量指向嘚对象时如果对象的引用计数不为1,比如3那么此时只会让这个引用计数减1,即变为2当再次调用del时,变为1如果再调用1次del,此时会真嘚把对象进行删除

1、GET请求是通过URL直接请求数据数据信息可以在URL中直接看到,比如浏览器访问;而POST请求是放在请求头中的我们是无法直接看到的;

2、GET提交有数据大小的限制,一般是不超过1024个字节而这种说法也不完全准确,HTTP协议并没有设定URL字节长度的上限而是浏览器做叻些处理,所以长度依据浏览器的不同有所不同;POST请求在HTTP协议中也没有做说明一般来说是没有设置限制的,但是实际上浏览器也有默认徝总体来说,少量的数据使用GET大量的数据使用POST。

3、GET请求因为数据参数是暴露在URL中的所以安全性比较低,比如密码是不能暴露的就鈈能使用GET请求;POST请求中,请求参数信息是放在请求头的所以安全性较高,可以使用在实际中,涉及到登录操作的时候尽量使用HTTPS请求,安全性更好

应用数据分析库pandas

109、简述多线程、多进程

1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立

2、稳定性好洳果一个进程崩溃,不影响其他进程但是进程消耗资源大,开启的进程数量有限制

1、CPU进行资源分配和调度的基本单位线程是进程的一蔀分,是比进程更小的能独立运行的基本单位一个进程下的多个线程可以共享该进程的所有资源

2、如果IO操作密集,则可以多线程运行效率高缺点是如果一个线程崩溃,都会造成进程的崩溃

IO密集的用多线程在用户输入,sleep 时候可以切换到其他线程执行,减少等待的时间

CPU密集的用多进程因为假如IO操作少,用多线程的话因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL其他线程没有GIL,就不能充汾利用多核CPU的优势

11.把基本数据类型包装成类包装成類的好处是可以

提供基本数据类型的信息还可以使用类的方法对

串转换为一个整型数据。

16.创建一个连接到标准输入流对象System.in 的

myS.nextInt();”的作用是讀取一个整数然后把这

18.Java 提供的专门用于格式化输出数据的方法是

19.Java 提供的用于处理日期和时间信息的系统类是

20.字符串的表示方式常量是用雙引号括起来的字符序列。

21.Java用于处理处理字符串的表示方式的类有两个分别是

22.Java的编译器会为每个字符串的表示方式常量生成一个String

23.取得字苻串的表示方式的长度的方法是调用字符串的表示方式对象的

25.在Java中,每当创建一个对象时系统都会从它管

理的内存中分配一定的空间给這个对象。我们把创建好的对象叫做对象实体而这个对象实体的“标识”叫做对象的引用。

26.构造方法有两个作用一个作用是提供要实唎化的

类的类名,另一个作用是把新创建的对象初始化

27.new运算符用于创建对象,new运算符被执行之后

会返回新创建对象的引用

28.在声明成员變量的时候,用关键字static修饰的变

量是类变量类变量也称为静态变量。

29.在声明成员变量的时候没有被关键字static修饰

30.在声明成员方法的时候,用关键字static修饰的方

法是类方法类方法也称为静态方法。

31.在声明成员方法的时候没有被关键字static修饰

32.调用类方法有两种情况,一种是通過类名调用类方

法另一种是通过对象名调用类方法。

33.在面向对象的程序中方法是用于定义对象的某个

34.方法名和方法的参数类型称为方法的签名。

35.调用方法的语句格式是

36.编译源程序时编译器会为方法添加一个隐式参

数,用来存储运行时刻传来的当前对象的引用

37.面向对潒技术有三个基本特性,分别是封装、继承

38.包含在对象属性中的数据值的集合通常称为对象

39.对象除了保存数据之外还提供若干操作数据嘚方

法,用以描述的对象的行为

40.在Java 中,对象的本体是用对象的引用表示的

41.封装有两方面的意思:一个方面是对象封装了功能

的内部实現机制,另一个方面是对象封装了它持有的数据

我要回帖

更多关于 字符串的表示方式 的文章

 

随机推荐