ジャワの基礎知識

オブジェクト指向およびプロセス指向1.区別

  • 以下のためのプロセスオブジェクト指向よりもプロセス指向のパフォーマンス。クラスの呼び出しのオーバーヘッドをインスタンス化する必要がリソースの比較的大きな、より多くの消費ので、このようなマイクロコントローラの性能が最も重要な要因である、組み込み開発、のLinux / Unixおよび他の一般的に使用されるプロセス指向開発されているため。しかし、プロセス指向のオブジェクト指向の保守が容易に再利用しやすく、拡張することは容易ではありません。
  • オブジェクト指向オブジェクト指向と拡張しやすく、再利用しやすく、維持しやすいです。オブジェクト指向のカプセル化があるため、継承、多型性、低いカップリングシステムは、システムをより柔軟にし、維持しやすいように設計することができます。しかし、オブジェクト指向のパフォーマンスプロセス指向より低いです

2.java言語の特徴は何ですか

オブジェクト指向など(パッケージベース、多型)、プラットフォームに依存しない(Java仮想マシン実装プラットフォームの独立性)、信頼性、セキュリティ、

差3.javaとC ++

  • これは、カプセル化、継承、ポリモーフィズムをサポートするオブジェクト指向言語であります
  • Javaはプログラムメモリをより安全、直接メモリにアクセスするための指針を提供していません
  • Javaクラスは、単一継承され、C ++は多重継承をサポートし、多重継承が、インターフェイスはないJavaクラスを多重継承してもよいです。
  • Javaは自動メモリ管理機構を備えている、プログラマは手動で無駄にメモリを解放する必要はありません。

4.文字定数と文字列リテラルの違い

  1. 正式:文字定数は、単一引用符によって引き起こされる、文字の二重引用符で囲まれた文字列定数であります
  2. 意味上の整数値(ASCII値)に対応する文字定数は、式演算子に参加することができ、文字列定数の値は、アドレス(メモリに格納されている文字列の位置)を表します
  3. 文字定数の合計メモリサイズのみ2バイト、文字列リテラルは、いくつかのバイト量(少なくとも一つの文字終了フラグ)(注:charはJavaで2バイトです

過負荷と書き換え可能な差

  • 過負荷:同じクラスに起こる、メソッド名が同じ、異なるパラメータタイプ、異なる数および異なる配列でなければならず、方法は戻り値が異なるアクセス修飾子であってもよいし、コンパイル時に起こります。   
  • 書き換え:引数リストが同じでなければなりません、戻り値は親クラス未満、またはスロー親の異常な範囲の範囲、以上のアクセス修飾子の親の範囲に等しい、メソッド名、親子クラスで発生し、変更された親クラスのメソッドへのアクセス場合民間事業者のサブクラスは、このメソッドをオーバーライドすることはできません。

6.パッケージの継承多型

パッケージ:プロパティは外の世界がアクセスすることができる方法をいくつか提供しながら、オブジェクトのプロパティのパッケージの民営化、。

継承:継承は、新しいデータや新しい機能だけでなく、親クラスの機能を追加することができる新しいクラスを定義し、新しいクラスの確立のための基礎として、既存のクラスの技術を使用して定義されます。

  1. サブクラスは、(私有財産とプライベートメソッドを含む)親クラスのオブジェクトのプロパティとメソッドのすべてを持っていますが、私有財産の親クラスとサブクラスはアクセスできません、ただ持っています
  2. サブクラスは、サブクラスは親クラスを拡張することができ、自分の属性とメソッドを持つことができます。
  3. 親クラスが独自の方法で実装することができサブクラスです。

多型:プログラムで定義された参照変数所与の特定のタイプ及び方法がプログラムが起動されていないときを決定するために指摘し、それは、プログラムの実行中に決定されます。

継承とインターフェース(インターフェースと同じ被覆方法を達成するためのインタフェース)多型を達成することができる(Sサブクラスは、同じメソッドをオーバーライド)

違い7.StringのStringBufferのStringBuilder

変動
文字列を保持するために、文字列のキーワード最後の修正を使用して、Stringクラスには、民間最終char値は[]、不変である;
のStringBuilderとStringBufferのは、文字列を保持している文字列を使用して、AbstractBuilderクラスを継承しますが、無駄決勝へ修正ので、彼らは可変です。

AbstractStringBuilder.java

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;
    int count;
    AbstractStringBuilder() {
    }
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }
}  

スレッドの安全性

文字列オブジェクトは、スレッドセーフ不変であり;
AbstractStringBuilderのStringBuilderとStringBufferのは、パブリックメソッドの数を定義し、共通の親クラスです。StringBufferの同期ロックを添加する方法、スレッドセーフ; StringBuilderの無い方法に加えて、同期ロック、非スレッドセーフ。

パフォーマンス

String型の各時間変化は、新しい文字列オブジェクト、新しい文字列オブジェクトに対して、次にポインタを生成し
たStringBuffer StringBufferの代わりに新しいオブジェクトを生成する、それ自体の動作のたびにオブジェクトとオブジェクト参照を変更し、
StringBuilderの比StringBufferのパフォーマンスはほとんどブロックを使用していますが、危険なマルチスレッド。

要約

  1. 少量のデータを操作する:文字列について
  2. 操作シングルスレッド動作列バッファ大量のデータ:StringBuilderのための
  3. データのマルチスレッド動作の文字列バッファを大量に操作する:該当するStringBuffer

8.抽象クラスとインターフェイスとの間の差

  1. インタフェースメソッドが公開され、デフォルトでは、(デフォルトの実装を持つことができるインタフェースのメソッドを起動するには、Java 8)インターフェイスのすべてのメソッドを達成していない、非抽象クラスは、抽象メソッドを持つことができます。
  2. 静的、最終的変数に加えてのインターフェイスは、他の変数は持っていない、とは必ずしも抽象クラスではありませんすることができます。
  3. クラスは複数のインタフェースを実装することができますが、唯一の抽象クラスを継承することができます。インターフェースは、複数のインターフェイスを拡張します。
  4. デフォルトインターフェイスメソッド修飾子は、(抽象メソッドを書き換えるので、秘密鍵を使用して!修正することはできません)で保護されており、これらの修飾子をデフォルトでは、抽象メソッドは、公開することができ、公開されています。
  5. 設計の観点から、抽象抽象クラスは、テンプレートのデザインであり、インターフェイスは、抽象的行動である行動のコードです。

注:JDK8では、インターフェースは、静的メソッドを定義することができ、あなたは直接名前通話をインタフェースすることができます。そして、実装クラスの実装は呼び出されません。両方実装する2つのインターフェイスは、デフォルトのメソッドとして定義されている場合は、上書きしなければならない、またはエラーになります。

9.メンバ変数とローカル変数の違い

  1. ビュー構文の観点から:クラスのメンバ変数が属し、ローカル変数は、メソッドで定義された方法の変数またはパラメータである。メンバ変数は、パブリック、プライベート、静的および他の修飾によって修飾することができ、そしてローカル変数にアクセスすることはできません制御剤及び静的変形が、メンバーとローカル変数は、最終修正することができます。
  2. 変数からのビューのメモリに格納されます。メンバ変数は、の使用であればstatic改変ない場合、メンバー変数は、クラスの一部であるstatic修飾は、このメンバ変数は、インスタンスに属していません。そして、ヒープメモリに存在する物体、スタックメモリ上のローカル変数。
  3. ビューの可変生存時間メモリポイントから:メソッド呼び出しでローカル変数は自動的に消えつつメンバー変数は、それが存在するオブジェクトを作成、オブジェクトの一部です。
  4. メンバ変数は初期値が与えられていない場合:自動的に割り当てのタイプにデフォルトはます:ローカル変数は自動的に割り当てられていない状態、(一つの例外を除いて最後のメンバ変数は、明示的に割り当てるように修正しなければなりません)。

10。==与等号

==:アドレス決意ターゲットが2に等しくありません。つまり、オブジェクトは同じオブジェクト(基本データ型の比較値、比較基準データメモリアドレスタイプ)ではない判定されます。

等号():2つのオブジェクトが等しいかどうかを判断します。しかし、それは一般的に2つの場合に使用されます。

  • ケース1:カバー無しクラスのequals()メソッド。比較は、メモリ・アドレスです。
  • ケース2:クラスは、等号()メソッドをオーバーライドします。一般的に、我々は、2つのオブジェクトの内容を比較するためのequals()メソッドを覆う等しく、その内容が等しい場合、(2つのオブジェクトが等しいと見なされることがある)がtrueを返します。

説明:

  • 文字列オブジェクトが、オブジェクトのメモリアドレスを比較するequalsメソッドであり、比較のequalsメソッドは、値文字列オブジェクトであるため、この方法は、書き換えされる等しいです。
  • あなたはString型のオブジェクトを作成すると、仮想オブジェクトが何も値がすでに存在していないと、あなたはそれが現在の基準に割り当て入れている場合は、定数プールで作成するのと同じ値を見つけます。ない場合は定数プール内のStringオブジェクトを再作成します。

参考:https://www.cnblogs.com/Eason-S/p/5524837.html

11.hashCode与に等しいです

hashCode()説明:

アクションのhashCode()は、ハッシュコードを取得することも、ハッシュ・コードと呼ばれ、それは実際にint型の整数を返します。このハッシュ・コードの役割は、ハッシュインデックステーブル内のオブジェクトの位置を決定することです。ハッシュコードは、()JDK Object.javaで定義され、これは、任意のJavaクラスは、ハッシュコード()関数が含まれていることを意味します。

ハッシュテーブルは、ことを特徴とするキーと値のペア(キー値)に格納されている:「値」に迅速に取得に対応する「キー」に従って。ハッシュコードの使用に関するこの1!(あなたはすぐにオブジェクトが必要見つけることができます)

なぜハッシュコード必要があります。

私たちはハッシュコードを必要とする理由説明するための例として、我々は最初の「重複をチェックするための方法をHashSetの」:あなたは、オブジェクトがHashSetのに参加入れると、HashSetのは、最初に参加するオブジェクトの位置を決定するために、オブジェクトのハッシュコード値を計算しますが、他のオブジェクトと結合していますハッシュコードの一致がない場合は、比較のためのハッシュコード値は、HashSetのは、オブジェクトが繰り返されていないことを前提としています。オブジェクトが見つから同じハッシュコード値を持っている場合しかし、それは呼び出してequals()、同じオブジェクト本当に等しいハッシュコードかどうかを確認する方法を。それらが同じである場合は、HashSetのは、操作が成功した参加を許可されることはありません。異なる場合は、それは別の場所にハッシュを再でしょう。だから我々は非常に対等の数を減らし、それに応じて大幅に実行速度が向上します。

hashCode()およびequals()関連規定:

  1. 2つのオブジェクトが等しい場合、それはまた、同じハッシュコードである必要があります
  2. 等しい二つのオブジェクト、2つのオブジェクトがequalsメソッドを呼び出すようにしてtrueを返します
  3. ハッシュコード2つのオブジェクトが同じ値を持って、彼らは必ずしも同じではありません
  4. このように、メソッドをオーバーライドし等しい、方法がカバーしなければならないのhashCode
  5. デフォルトの動作のhashCode()は、ヒープ上のオブジェクトに固有の値を作成することです。ならないオーバーライドのhashCode()、次いで、2つのオブジェクトが(これら2つのオブジェクトが同一のデータを指していても)とにかく同じクラスではありません

2つのオブジェクトが同じハッシュコード値を持って、なぜ、彼らは必ずしも同じではありません。

hashCodeその他()はハッシュアルゴリズムを使用しているためだけで複数のオブジェクトが同じハッシュ値を返すことになるかもしれません。やすいハッシュアルゴリズム衝突悪いだけでなく、データの特性の範囲の分布(すなわち、いわゆる衝突が同じハッシュコードを取得する異なるオブジェクトを参照します)。

私達はちょうどこれに対し、同じハッシュコードが複数のオブジェクトを持っているHashSetの場合はHashSetのを、言及し、それが同じであるかどうかを判断する()等号を使用しています。そのハッシュコードは、唯一のコストを絞り込むために使用されます。

推奨される読書:問題のJavaのhashCode()とequals()の回答

唯一の値は12.javaに渡されたのはなぜ

Javaプログラミング言語は、常に値でコールを使用しています。つまり、この方法は、つまり、この方法は、それのいずれかのパラメータ変数に渡され、変更しないすべてのパラメータ値のコピーを得ていますさ。
Javaメソッドパラメータの使用法は
この方法は、パラメータ(すなわち、数値またはブール)の基本的なデータ・タイプを変更することはできません。(コピーパラメータ値)
オブジェクトのメソッドは、状態パラメータを変更することができます。(オブジェクト参照コピー)
メソッドは、新しいオブジェクトパラメータオブジェクトへの参照を作成しません。

参考:https://blog.csdn.net/zhzhao999/article/details/53449504

13ねじプログラムの処理

スレッド及びプロセスは類似しているが、スレッドよりも小さい実行単位の処理です。プロセスは、その実行中に複数のスレッドを生成します。違いは、スレッドを生成するときに、同じメモリ空間とシステムリソースのセットので、システムを共有する複数のスレッドの処理と同様である、または作業用のスレッド間のスイッチのため、負担は、プロセスよりもはるかに小さいですこのように、スレッドは、軽量プロセスと呼ばれています。

プログラムは、ディスクまたは他のデータ記憶装置に格納される命令およびデータを含むファイルであり、それは、プログラムコードが静的です。

プロセスは、プログラムの実行の過程でプログラムを実行するために、システムの基本的な単位であるため、プロセスは動的です。システムは、プロセスの終焉に実行するプロセスから作成されたプログラムを実行しています。簡単に言えば、プロセスは、CPU時間、メモリ空間、ファイル、実行するための入出力装置のようなプログラムであり、それは同時に、コンピュータにコマンドを実行するための命令であり、各プロセスはまだいくつかのシステムリソースを有していますように使用してする権利。プログラムが実行される他の言葉では、オペレーティングシステムがメモリにロードされます。
スレッドは、より小さな動作単位に分割する処理です。プロセス内の同じスレッドがお互いに影響を与える可能性があるため、実質的に各工程の独立した各スレッドであるスレッドとプロセスとの間の最大の違いは、必ずしもありません。別の観点から、プロセスは、主に、同じ時間に、あなたは、同時に複数のプログラムを実行することができ、オペレーティングシステムの範疇に属し、スレッドが事実上同じプログラムで複数のブロックを実行しています。

14.基本的なスレッドの状態は何ですか

ライフサイクルの所与の時点で実行中のJavaスレッドは、次の6つの異なる状態であってもよく、その状態で

Javaスレッドの状態

スレッドのライフサイクルの一つの状態で固定されていないが、コードの実行に異なる状態を切り替えること

Javaスレッドの状態遷移

なお、図から見ることができます。

线程创建之后它将处于 NEW(新建) 状态,调用 start() 方法后开始运行,线程这时候处于 READY(可运行) 状态。可运行状态的线程获得了 cpu 时间片(timeslice)后就处于 RUNNING(运行) 状态。

当线程执行 wait()方法之后,线程进入 WAITING(等待)状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而 TIME_WAITING(超时等待) 状态相当于在等待状态的基础上增加了超时限制,比如通过 sleep(long millis)方法或 wait(long millis)方法可以将 Java 线程置于 TIMED WAITING 状态。当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到 BLOCKED(阻塞) 状态。线程在执行 Runnable 的run()方法之后将会进入到 TERMINATED(终止) 状态。

14.final关键字总结

final关键字主要用在三个地方:变量、方法、类。

  1. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
  2. 当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
  3. 使用final修饰方法,把方法锁定,以防任何继承类修改它的含义。类中所有的private方法都隐式地指定为final。

15.异常处理

Java异常类层次结构图

Java例外クラス階層図

在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常)Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。

Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception(异常):是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 异常由Java虚拟机抛出。NullPointerException(要访问的变量没有引用任何对象时,抛出该异常)、ArithmeticException(算术运算异常,一个整数除以0时,抛出该异常)和 ArrayIndexOutOfBoundsException (下标越界异常)。

注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

Throwable类常用方法

  • public string getMessage():返回异常发生时的详细信息
  • public string toString():返回异常发生时的简要描述
  • public string getLocalizedMessage():返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
  • public void printStackTrace():在控制台上打印Throwable对象封装的异常信息

异常处理总结

  • try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
  • catch 块:用于处理try捕获到的异常。
  • finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。

注意: 当try语句和finally语句中都有return语句时,在方法返回之前,finally语句的内容将被执行,并且finally语句的返回值将会覆盖原始的返回值。

在以下4种特殊情况下,finally块不会被执行:

  1. 在finally语句块第一行发生了异常。 因为在其他行,finally块还是会得到执行
  2. 在前面的代码中用了System.exit(int)已退出程序。 exit是带参函数 ;若该语句在异常语句之后,finally会执行
  3. 程序所在的线程死亡。
  4. 关闭CPU。

16.获取键盘输入的方法

方法1:通过 Scanner

Scanner input = new Scanner(System.in);
String s  = input.nextLine();
input.close();

方法2:通过 BufferedReader

BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
String s = input.readLine(); 

17.IO流分类及BIO,NIO,AIO区别

java 中 IO 流分为几种?

  • 按照流的流向分,可以分为输入流和输出流;
  • 按照操作单元划分,可以划分为字节流和字符流;
  • 按照流的角色划分为节点流和处理流。

Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0流的40多个类都是从如下4个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

按操作方式分类结构图:

IO-操作分類

按操作对象分类结构图:

IO-操作対象の分類

BIO,NIO,AIO 有什么区别?

  • BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
  • NIO (New I/O): NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 SocketServerSocket 相对应的 SocketChannelServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
  • AIO(非同期I / O): AIO即ちNIO 2。ジャワ7にNIO 2 NIOの改良版を導入し、それが非同期非ブロッキングIOモデルです。非同期IOを達成するために、イベント及びコールバック機構に基づいている、つまり、操作のアプリケーションに直接返されます後、バックグラウンド処理が完了すると、オペレーティングシステムは後続の動作のために適切なスレッドに通知し、そこに接続しないであろう。AIOは、ネットワークの動作にNIOが、非同期IOの頭字語である非ブロッキング方式が、IO NIOまたは同期動作を提供します。NIO、私たちのビジネスは、IO操作を通知する準備ができているスレッド、その後、それらはIOスレッド自体によって運営されたために、IO操作自体が同期されます。オンライン関連情報へのアクセスは、私が本出願のためにAIOは非常に広範囲ではないことがわかったが、また、AIOはネッティー前に持っていたが、あきらめ使用するようにしてください。

おすすめ

転載: www.cnblogs.com/itzlg/p/11374831.html