20210907のJavaに関する記事は9件です。

JDKをインストールして実行環境を作る(後編)

<目次> ◆ Open JDK のインストールと設定 ・インストール ・フォルダ構成 ・PATHとJAVA_HOMEの設定 ◆ お試しJava ・コマンドプロンプトで「Hello World!」 ◆ Open JDK のインストールと設定 ・インストール インストールは以下から行います。 http://jdk.java.net/ https://bit.ly/3DPaiuS zipファイルがダウンロードされるので、任意の場所に展開します。 ・フォルダ構成 フォルダ構成について概要を説明します。 <bin> 以下の記事の説明がわかりやすかったので、引用させていただきます。 参考 - 東京ウェブ制作 大和賢一郎代表 FAQ(よくある質問と回答) http://www.1mouke.com/hpbldr_faq/faq00000059.html bin は binary(バイナリ)の頭文字です。 ソフトウェアを構成するファイルの動作モジュールのことを「バイナリファイル」と呼びます。 車で言えば「エンジンの中身のパーツ」に相当します。例えば車を運転する時、私たちは「エンジンがついている」ことは知っていますが「エンジンの中にどんなパーツが入っているか?」は知りませんし、知る必要もありません。それを知らなくても運転はできますから、車は走ります。 ソフトウェアも同じで、bin は エンジンなのです。 bin のなかに何が入っているか?を、普通のユーザは知る必要はありませんし、勝手にいじってしまうと、エンジンを壊してしまう恐れもあるのです。 なお bin フォルダというのは、ホームページビルダーに限らず、多くのアプリケーションソフトに存在します。 いずれにせよ、さわったり、いじったりせずに、そのまま、そっとしておくのが賢明だと思われます。 <conf> プロパティファイルが格納されているフォルダです。 プロパティファイルについては以下の記事の説明がわかりやすかったので引用させていただきます。 参考 - POTEPAN STYLE ” 【Java基礎】プロパティファイルから情報を読み込む ”(2019-10-30) https://style.potepan.com/articles/16758.html プロパティファイルとは? プロパティファイルとは、キーと値でプログラムで使用する設定値などを保存するためのファイルです。Javaアプリケーションの設定ファイルとして一般的に使われています。 プロパティファイルには、プログラムの既定値やデータベースの接続情報などの情報を保存します。このような情報は後から変更になったり、開発/本番などの環境によって内容が違ってくるため、プロパティファイルに記述しておくことで、後から変更が発生してもコンパイルなしでプログラムの動作を変えられます。 次のJavaプログラムを見てください。 ソースコードの中にデータベースのホスト名や認証情報が直接書かれています。 このようなプログラムだと、データベースの接続先が変わるたびに、再コンパイルが必要となり、ソースの管理や運用面で非常に手間になります。 Connection connection = DriverManager.getConnection( "jdbc:postgresql://dev-database01:5432/dbname", "dev-user", "dev-password"); Statement statement = connection.createStatement(); データベースの情報をプロパティファイルから読み込むように、プログラムを書き換えたものが次の例です。 外部のファイルからデータベースの情報を読み込んでいるため、Javaのソースコード上から環境依存する情報が消えました。これにより、接続先が変わってもJavaの再コンパイルは不要になりました。 ResourceBundle rb = ResourceBundle.getBundle("sample"); Connection connection = DriverManager.getConnection( rb.getString("db"), rb.getString("user"), rb.getString("password")); Statement statement = connection.createStatement(); ▪️ プロパティファイル(sample.properties) #この行はコメントです。 db=jdbc:postgresql://dev-database01:5432/dbname user=dev-user password=dev-password <include> ヘッダファイル(インクルードファイル)が格納されているフォルダです。 - e-Words https://bit.ly/3h59aK8 より引用 ヘッダファイルとは、C言語やC++言語などで用いられる、関数などの宣言のみを記したファイル。他のプログラムのソースコードなどに取り込んで一体化することで、宣言された関数などを呼び出して利用できるようにする。 C言語などの処理系にはソースコードに外部のファイルの内容を取り込んで結合するインクルードの仕組みが用意されており、「#include <ファイルのパス>」というディレクティブを記述することでプリプロセッサがその位置にパスで指定されたファイルの内容を展開してくれる。 <jmods> JMODファイルが格納されているフォルダです。 -tyablog.net ” Java JMODファイルとは、JARファイルとの違い。 ”(2020-04-05) https://tyablog.net/2020/04/05/java-how-different-jmod-and-jar/ より引用 JMODファイルは、Java9から追加された、 モジュールという単位で、 クラスファイルとネイティブコードなどをZipアーカイブしたファイルです。 JMODファイルは、Javaのコンパイル、リンク時に利用する為のファイルです。 JARのように、ランタイム時に参照して実行するようなことはできません。 実行時に使おうとすると、下記の例外が発生します。 ”java.lang.module.ResolutionException” あくまでビルド時に使うもの。 特に JIMAGE (カスタムRuntime) を生成するのを目的に利用します。 <legal> 各モジュールの著作権およびライセンス関連のファイルです。 <lib> これといった説明がされている記事がありませんでした、ライブラリフォルダという感じでしょうか(尻切れトンボですみません、、進みます) ・JAVA_HOMEとPATHの設定 環境変数の設定は、コントロールパネル>システムとセキュリティ>システム>システムの詳細設定>環境変数 から設定を行います。 <JAVA_HOME> JAVA_HOMEは他のアプリケーションがJavaを利用する際に参照する環境変数で、インストールしたディレクトリまでのパスを設定します。 システム環境変数の「新規」ボタンから以下を入力し、OKボタンを押下します。 変数名:JAVA_HOME 変数値:インストールしたディレクトリまでのパス 確認のため、環境変数画面のOKボタンを押下し、コマンドプロンプトで set JAVA_HOME で実行し、JAVA_HOMR=指定したパス が表示されれば完了です。 <PATH> PATHには実行に必要なjava.exeやjava.c.exeなど、Java実行に必要なモジュールの存在するディレクトリ(binフォルダ)までのパスを設定します。 設定する際には、binフォルダまでのフルパスの代わりに%JAVA_HOME%\bin と指定します。 このようにすることで、今後異なるJDKを使用する場合やJDKのバージョンが変わったりする場合でもPATHの設定ではなくJAVA_HOMEの設定を変更するだけで済むようになります。 PATHは他のアプリケーションが使用しているパスも登録されており重要度が高いため、直接PATHを編集しなくてよくすべき、ということです。 登録は環境変数でPATHを選択し編集、編集の新規で%JAVA_HOME%\binを追加すれば完了です。 ◆ お試しJava ・コマンドプロンプトで「Hello World!」 実際にJavaファイルを手作成し、コンパイルして実行してみましょう。 今回は「Hello World!」と出力するだけのJavaファイル(Otameshi.java など)を作成し、任意の場所(C:\Java\Otameshi など)に配置します。 コマンドプロンプトを開き、作成したJavaファイルを格納したディレクトリまで移動します。(cd C:\Java\Otameshi) javac コマンド(javac.exe)でコンパイルします。 先ほど実行ファイルが格納されているbinフォルダにPATHを通したので、そのままのディレクトリからjavacコマンドを実行することができます。 javac Otameshi.java を実行するとコンパイルされ、同じフォルダ内にclassファイル(Otameshi.class)が作成されます。 javaコマンド(java.exe)で実行します。 こちらも先ほど同様binフォルダに格納されているファイルなので、カレントディレクトリのまま実行できます。 java Otameshi を実行すると「Hello World!」と出力されます。 参考文献 この記事は以下の情報を参考に執筆いたしました。 -Let'sプログラミング ” OpenJDKのダウンロード及びインストール ” https://www.javadrive.jp/start/install/index1.html -Let'sプログラミング ” PATHの設定及び環境変数JAVA_HOMEの設定 ” https://www.javadrive.jp/start/install/index4.html -TechAcademyマガジン ” Javaのプログラムをコマンドプロンプトでコンパイルする方法を現役エンジニアが解説【初心者向け】 ”(2018-01-01) https://techacademy.jp/magazine/22824
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity] Android NativePluginの実装の仕方

はじめに Unityで使用するNativePluginのタスクがあったのでとりあえずテストでサンプルを作成してみました。 ここでは、UnityでAndroidのNativeアラートを表示させるまでの忘却録です。 準備 macOS Catalina: 10.15.7 Unity 2018.4.19f Android Studio 4.0.1 Android Studioでプロジェクトを作成 今回は「AndroidStudio4.0.1」で作成していきます。 「Select a Project Template」で「No Activity」を選択 Projectの概要を決めていきます。「Package name」はサンプルなので適当です。言語は「Java」を選択しました。 ライブラリ用モジュールを作成する 「File」→「New」→「NewModule」を選択 「Select a Module Type」で「Android Library」を選択 「Module name」もサンプルなので適当にそのままにしました。 左上にあるプルダウンから「Android」を選択しておきます。 「mylibrary」が出来てます。 Plugin開発には不必要なAppディレクトリを削除する 「File」→「Project Structure」を選択 左サイドバーの「Modules」を選択して「app」を選択。赤丸の「-」で削除します。 「Remove Module」で削除確認されますが、「Yes」です。 Unity機能をAndroidから使用する準備 Android側からUnityのクラスを認識するために「jar」ファイルをインポートする必要があります。 Android 用に開発されたプラグインを使用して、Unity の外部で作成された Java や C++ コードを C# スクリプトから呼び出しすることができます。これにより、他の方法では Unity で使用できない OS の呼び出しやサードパーティのコードライブラリなどの機能にアクセスできます。Unity によるプラグインの使用方法の詳細については、プラグイン のドキュメントを参照してください。 以下のページでは、Android プロジェクトで使用する独自のプラグインを作成する手順を説明します。これらのページの情報は、Unity のネイティブプラグインの作成方法をすでに理解していることを前提としています。ネイティブプラグインとその使用の詳細については、ネイティブプラグイン のドキュメントを参照してください。 https://docs.unity3d.com/ja/current/Manual/PluginsForAndroid.html 場所はUnityがインストールされてるディレクトリにあります。 ファイル名: classes.jar 下記は、UnityHubを使用していた場合の格納場所です。 /Applications/Unity/Hub/Editor/2018.4.19f1/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar Androidプロジェクトの「libs」ディレクトリへ「classes.jar」をコピーします。 Gradleの設定からclasses.jarを外す Gradleの設定からclasses.jarを外さないと、出力されるaarファイルに含まれてしまいUnityのビルド時にエラーが出てしまうので外さないといけません。ということで、「build.gradle」を編集します。 下記、箇所を変更。また、追記します。 build.gradle // 26行目 NG: implementation fileTree(dir: "libs", include: ["*.jar"]) ↓ OK: compileOnly fileTree(dir: 'libs', include: ['classes.jar']) // 追記箇所 android.libraryVariants.all{ variant-> variant.outputs.each{output-> output.packageLibrary.exclude('libs/classes.jar') } } 完成形は下記。右上に出ている「SyncNow」を押下して完了 Unityで呼び出すNativeAlertDialogのサンプル 該当箇所からClassを作成します。 該当コード AndroidNativeDialog.java package jp.co.test.mylibrary; import android.app.AlertDialog; import android.content.Context; public class AndroidNativeDialog { static public void showNativeDialog(Context context, String title, String message) { new AlertDialog.Builder(context) .setTitle(title) .setMessage(message) .setPositiveButton("はい", null) .setNegativeButton("いいえ", null) .show(); } } ビルド 画面右側に「Gradle」のアイコンがありますので、設定画面を表示します。 「mylibrary」→「Tasks」→「build」→「assemble」をダブルクリックでビルドが始まります。 成功すると「BUILD SUCCESSFUL in 時間」が表示されます。 aarの場所 左上から「Project」を選択し、「mylibrary」→「build」→「outputs」→「aar」の中にあります。 該当のファイルから「Reveal in Finder」でFinderが開いてくれます。 aarをUnityプロジェクトへ配置する UnityプロジェクトをAndroidにSwitchPlatformします。 該当のaarは「Assets」→「Plugins」→「Android」のディレクトリを無ければ作成して配置します。 Unity側の対応(呼び出し方法)サンプル 飛び出す際に「AndroidJavaClass」、「AndroidJavaObject」を使います。 サンプルでは、ShowNativeDialog()をButtonEventで使用しました。 ButtonView.cs using UnityEngine; public class ButtonView : MonoBehaviour { public void ShowNativeDialog() { #if UNITY_ANDROID AndroidJavaClass nativeDialog = new AndroidJavaClass ("jp.co.test.mylibrary.AndroidNativeDialog"); AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); context.Call ("runOnUiThread", new AndroidJavaRunnable(() => { nativeDialog.CallStatic ( "showNativeDialog", context, "タイトル", "本文テキスト" ); })); #elif UNITY_EDITOR UnityEngine.Debug.Log("On Click!"); #endif } } サンプルフォルダ構成 Unity配置 ボタンを押下するとアラートダイヤログを表示 ビルドして実機で確認します。 成果物
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

google-java-formatのjava16対応

はじめに javaのバージョンアップに伴い、google-java-formatのバージョンを1.7から1.11.0にあげてspotlessを実行したら以下のようなエラーが出た。 これはJava16のJEP 396の影響とのこと。 Caused by: java.lang.IllegalAccessError: class com.google.googlejavaformat.java.JavaInput (in unnamed module @0x615edab4) cannot access class com.sun.tools.javac.parser.Tokens$TokenKind (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.parser to unnamed module @0x615edab4 at com.google.googlejavaformat.java.JavaInput.buildToks(JavaInput.java:349) at com.google.googlejavaformat.java.JavaInput.buildToks(JavaInput.java:334) at com.google.googlejavaformat.java.JavaInput.<init>(JavaInput.java:276) at com.google.googlejavaformat.java.Formatter.getFormatReplacements(Formatter.java:280) at com.google.googlejavaformat.java.Formatter.formatSource(Formatter.java:267) at com.google.googlejavaformat.java.Formatter.formatSource(Formatter.java:233) 解決方法 以下の設定をgradle.propertiesに記載し、プロジェクトのホーム直下においてあげれば良い。 org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java基礎⑤]配列 拡張for文 ArrayListクラス

初めに 今回は配列について学習しました。 配列の基本の形 public class Main { public static void main(String[] args) { String[] array = {"りんご","メロン","おにぎり","卵"}; // この下で、arrayを出力してみよう System.out.println(array[0]); } } String型の配列なので、ここに数値を入れてしまうとエラーになります。 ちなみに以下のように一つずつ配列に格納することもできます。 #配列名を宣言 String[] array; #配列の長さを決める array = new String[2] #配列に格納 array[0] = "戦士" 配列の長さを求めるにはSystem.out.println(team.length);です。 これを使えば前回学習したfor文で配列の中身を取り出せます。 配列×for文 public class Main { public static void main(String[] args) { String[] fruit = {"りんご", "メロン", "みかん"}; for (int i = 0; i < fruit.length; i++) { System.out.println(fruit[i] + "を拾った"); } } } Javaの拡張for文 Javaでは配列の中身を処理する際に、拡張for文をよく使用するそうです。 ↑の文を、拡張for文に修正します。 public class Main { public static void main(String[] args) { String[] fruit = {"りんご", "メロン", "みかん"}; for (String i : fruit) { System.out.println(i + "を拾った"); } } } ArrayListクラスについて 配列の要素数を後から変更することができるなど便利な機能を持っているようです。 // ArrayListに要素を追加する import java.util.*; public class Main { public static void main(String[] args) { ArrayList<String> fruit = new ArrayList<String>(); // ここに、要素を追加するコードを記述する fruit.add("りんご"); fruit.add("メロン"); fruit.add("みかん"); for (String i : fruit) { System.out.println(fruit); } } } // ArrayListの要素を上書きするには? fruit.set(2,"夏みかん"); // ArrayListの要素を削除するには? fruit.remove(2); // ArrayListの要素の個数を出力するには? System.out.println(fruit.size()); 終わり 今回は配列について学習しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Word文書をTIFF形式に変換

TIFFは、ビットマップ画像の符号化形式の一種です。タグと呼ばれる識別子を使うことによって、様々な形式のビットマップ画像を柔軟に表現できると思われています。今日は、Free Spire.doc for Javaという無料のライブラリを利用して、Word文書をTIFF形式に変換する方法を紹介したいと思います。さあ、参りましょう~ 下準備 1.E-iceblueの公式サイトからFree Spire.doc for Java無料版をダウンロードしてください。 2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.doc.jarを参照に追加してください。 import com.spire.doc.*; public class WordToTiff { public static void main(String[] args) { Document doc = new Document(); doc.loadFromFile("inputfile.docx"); doc.saveToTiff("ToTiff.tiff"); } } 実行結果  
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Silver 3章 演算子と分岐文②

基本データ型の型変換 基本データ型で宣言した変数は、宣言時の型で扱えるデータの範囲内であれば値を代入できる 上記の方向に反して型変換を行おうとするとコンパイルエラーになる 小さな物をより大きな箱に入れるのは暗黙で可能 大きな物をより小さな箱に入れるのは明示が必要(入らないと困るから) 基本データ型の暗黙型変換 変数への代入、メソッドの引数、戻り値による代入で自動で型変換が行われる データ型ごとのデータ容量が小さい型から大きい型に順番に変換する事は可能 キャストを利用した型変換 暗黙型変換とは逆の順序で()キャストによって実行可能 キャスト演算子の実行例 public static void main(String[] args) { double d = 10.5; //int i = d; int型からDouble型は暗黙型変換は不可 int i = (int)d; System.out.println("iの値:" + i); //foo(i);  同じ理由で不可 foo((short)i); } static void foo(short a) { System.out.println("aの値:" + a); } iの値:10 double型からint型になるため小数は切り捨て aの値:10 引数としてFoo()メソッドにiがshort型で渡される 型変換の注意点 計算時の暗黙型変換 大きい物と小さい物を組み合わせる時は二つ共大きい物として扱う (大きい方が扱いに注意が必要だから) short s1 = 10; s1 = ++s1; //OK s1 = s1 + 1; //NG short型変数s1 と int型1 の計算では計算前に両方int型へ //しかし代入先はshort型変数であるためエラーとなる ラッパークラスとBoxing/Unboxing Integerクラスの利用:基本データ型を参照型に変換し、暗黙型変換を行わない対応がある public static void main(String[] args) { int i1 = 100; Integer obj = i1; // Boxing :Integerクラスの変数に代入 int i2 = obj; // Unboxing:int型変数に代入 method(i2); // int型でメソッドの引数に渡す } static void method(Integer obj) { // Integer型で受け取る int i = obj + 100; // 計算も可能:参照型同士の計算では暗黙型変更は行われない System.out.println(i); // ←200 } 暗黙の型変換が行われない事によるエラー例 double d1 = 10; //OK doublega型の変数d1 へint型10を代入する際に暗黙で型変換が実行 Double d2 = 10; //NG 参照型のDouble型変数では暗黙の変換が行われず、型が異なりエラーとなる Java変数までの感想 値や変数、計算にとにかく細かい注意が必要 データ型の設定についてはデータ領域、容量の違いによる実行速度を意識させられる データ型の設定によりデータ領域を厳密に管理できれば、より処理の早いプログラムが組める PHP,Javascriptではほとんど意識していなかった項目だが、Java変数の基礎に1日かかった if else-if文 条件判定の結果によって処理を実行する 上から順に条件式が評価され、あるTrue条件が返った処理分のみ実行される int a = 10; if(a > 0){ System.out.println("aは正の値です。"); if(a % 2 == 0){ System.out.println("aは偶数です。"); } }else{ if(a == 0){ System.out.println("aは0です。"); }else{ System.out.println("aは負の値です。"); } } aは正の値です。 aは偶数です。 この辺はPHP,jsと同じ if文の中にif文を入れられる 条件式if()の{}を除いた形でTrueだと下1行までの処理が実行される int i = 10; if( i >= 5 ) System.out.println("iは5以上です"); System.out.println("この処理はif文に関係なく必ず実行される") 三項演算子 条件式 ? 式1 : 式2 条件式がTrueなら式1を実行し、Falseなら式2を実行する int num = 20; String str = "numの値は"; str += num < 10 ? "10未満" : "10以上"; //str = str + (条件式 num < 10 ? 式1"10未満" : 式2"10以上") //str = str + "10以上" //三項演算子を式の中に組み込む事も可能。シンプルに見えるが理解しにくい。 System.out.println(str); //numの値は10以上 } Switch文 Switch(式)   case 値:     処理内容     Break; Switch文から抜ける   case 値:     処理内容   default :  最後までSwitch文から抜けなかった時の処理 public static void main(String[] args) { int num = 2; switch(num){ case 1: // numの値が1の場合の処理 System.out.println("numの値は1です。"); break; // breakによりswitchから抜ける case 2: // numの値が2の場合の処理 System.out.println("numの値は2です。"); // break文がないため、次のdefaultの処理文も実行 default: // numの値が1以外の場合の以下が実行される System.out.println("defaultです。"); } } numの値は2です。 defaultです。 caseに合致後の挙動について public static void main(String[] args) { int num = 3; switch(num){ case 1: case 2: // num値が1か2の場合、実行される System.out.println("1 または 2 "); break; case 3: case 4: // num値が3か4の場合、実行される System.out.println("3 または 4 "); break; default: // num値が1から4以外の場合、実行される System.out.println("default"); } } 3 または 4 少し混乱しました caseに合致しない場合、その処理は行われず次のcaseの判定に進むのですが それは最初にcase条件の合致が発生するまでの話で case合致から合致したcaseの処理が終わると、あとは上から順番に各caseの処理を実行する様子 試しに全てのbreakをコメントアウトし、変数numを2に代えると、default処理まで実行される public static void main(String[] args) { int num = 1; switch(num){ case 1: case 2: // num値が1か2の場合、実行される System.out.println("1 または 2 "); // break; case 3: case 4: // num値が3か4の場合、実行される System.out.println("3 または 4 "); // break; default: // num値が1から4以外の場合、実行される System.out.println("default"); } } 1 または 2 3 または 4 default caseに指定する値の注意点 public static void main(String[] args) { int num = 0; int a = 10; final int b = 20; switch(num){ case a: // コンパイルエラー System.out.println("case a :の実行"); case b: System.out.println("case b :の実行"); case 30: System.out.println("case c :の実行"); } String s1 = "A"; final String s2 = "B"; final String[] s3 = {"C"}; switch("X"){ case s1: // コンパイルエラー System.out.println("case s1 :の実行"); case s2: System.out.println("case s2 :の実行"); case s3[0]: // コンパイルエラー System.out.println("case s3[0]:の実行"); } } caseで変数の指定はできない caseで定数(finalを付加した変数)の指定はできる finalを付加した配列では、変数の参照先の配列は固定されるが配列要素の変更は可能なため指定できない 3章の感想 変数の扱いはプログラムを書く上では必須の知識と思われるが、その部分のルールがとにかく厳密に決められていて、きちんと理解しないと演算、判定式、分岐文、ループ処理など基礎的な挙動を実装することも難しい。 まだクラスやオブジェクトに触れていないが、すでにJavaが難しいと言われる理由がなんとなくわかった。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Couchbase Server Java SDKによるアプリケーション開発へのロードマップ

はじめに Couchbase Server Java SDKによるアプリケーション開発に関する記事を、カテゴリー別に整理しています。 基本機能解説 Couchbase Server Java SDK解説:分散トランザクション API解説と利用例 本記事の関連情報として以下があります。 Couchbase Java SDK解説:分散トランザクションの内部メカニズム Couchbase Java SDK解説:分散トランザクション〜エラー処理を理解する Couchbase Java SDK解説:分散トランザクションプログラミング入門 Couchbase Server Java SDK解説: フィールドレベルの暗号化 Couchbase ServerリアクティブAPI解説(JAVA) チュートリアル Spring Boot + Spring Data: JSONデータベースCouchbaseを使ってJavaオブジェクトをそのまま保存する リアクティブプログラミングをNoSQLで「体験」してみる(Couchbase Reactive APIに触れる) アドバンスド機能解説 CouchbaseにおけるHA/DR対応 (Java SDK注解) 参考情報
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Top 100 Java Interview Questions with Answers

Guru99.comなるJavaのチュートリアルが載っているサイトがある。 それのTop 100 Java Interview Questions with Answersセクションをまとめてみた。 Top 100 Java Interview Questions with Answers 1. Inner ClassとSub Classの違い 内部クラスは、クラス内にネストされたクラス サブクラスは、スーパークラスを継承しているクラス 2. Javaクラスのアクセス指定子は何ですか? Public:どこからでもアクセス可能 Protected:同じクラス、サブクラス、同じパッケージから参照可能 デフォルト:同じパッケージからのみアクセス可能 Private:同じクラスからのみ 3. Static methods と static variablesの目的は何? Staticなフィールドはプログラム全体で1つしかないことが保証される インスタンスを生成しなくても使える、クラスに紐付いている、クラスで1つの変数 全てのオブジェクトで共有されるメソッドまたは変数を作成する 4. データのカプセル化とは何ですか? カプセル化は、プロパティとメソッドを1つのユニットに結合するための概念。データを隠す目的にも役立つ 5. シングルトンクラスとは? シングルトンクラスは、1つのインスタンスしか持つことができないデザインパターン 例)いくつかのドライバー制限・ライセンス問題のために、データベースへの接続が1つだけになる制限がある場合 6. Javaのループとは何ですか? For While Do While 7. 無限ループとは? 無限ループは条件無しで実行され、無限に実行される for (;;){ } 8. continueステートメントとbreakステートメントの違いは? break: ループを即座中断 continue: 現在のループを中断、次のループへ 9. Doubleとfloatの違い Double は8バイト Floatは4バイト Javaの数値リテラルで小数を表す場合、デフォルトでdouble型になる。floatとして解釈させたい場合は末尾にfが必要 10. Javaのfinalキーワードとは? Finalを使用することで定数が宣言できる。 値は1回しか割り当てることができず、割当後に定数の値を変更することはできない。 クラスがfinalとして宣言されている場合、サブクラス化することができない。 11. 三項演算子とは何ですか? Boolen値の評価に基づいて、変数に割り当てる値を決めることができるなど status = (rank == 1) ? “Done” : “Pending”; 12. Javaで乱数を生成するにはどうすれば良いですか? Math.random() を使用すると 0.1 ~ 1.0未満の乱数を生成できる Randomクラスを利用する 13. Default switch caseとは? Switch文の条件が一致しない場合にdefaultケースが実行されます。 14. 全てのクラスの派生元であるJavaの基本クラスは何ですか? java.lang.object 15. Javaのmain()は任意データを返すことができますか> できません。 常にvoid型戻り値で宣言されます。 16. Javaのパッケージとは何ですか? パッケージを利用すると、コードをモジュール化でき、適切に再利用することができる。パッケージ化されたコードは、他のクラスにインポートして使用できる 17. 抽象メソッドを持たずに抽象クラスとして宣言できますか? できます。 抽象メソッドがなくても、クラス名の前にabstractキーワードを使用して抽象クラスを作成できます。 ただし、クラスに抽象メソッドが1つでもある場合、抽象クラスとして宣言する必要がある。 18. 抽象クラスとインターフェースの違いは何ですか? インターフェースは実装のないpublic staticメソッドの宣言のみを持つ 抽象クラスは具体的な実装の有無に関係なく、アクセス指定子を持つメンバーを持つことができる インターフェースを実装するクラスは、インターフェースの全てのメソッドを実装する必要がある 複数のインターフェースを実装できるが、1つの抽象クラスしか持つことができない 19. 抽象クラスとインターフェースのパフォーマンスについて インターフェースには追加のインダイレクションが必要なため、抽象クラスの方が速い また、インターフェースは全てのメソッドを実装する必要がある 20. パッケージをインポートすると、サブパッケージもインポートされますか? 必要に応じて、個別にインポートする必要がある。 21. クラスのmainメソッドをprivateとして宣言できますか? できません。 public staticである必要が有ります。 privateで実行すると、コンパイルエラーは発生しないが、ランタイムエラーが発生する。 22. 値渡しではなく、参照渡しで関数に引数を渡すにはどうすれば良いですか? Javaでは、参照ではなく値によってのみ引数を関数に渡しことができます。 23. オブジェクトはどのようにシリアル化(連続化)されますか? シリアライズ:Javaのインスタンスをバイト列として出力すること。 Serializableインターフェースを実装するクラスのオブジェクトは全て、シリアル化され、その状態はバイトストリームに保存される。 24. シリアル化が必要とされる場合はどんな時ですか? データをネットワーク経由で送信する必要がある場合、シリアル化が使用される。 25. Tryブロック後に例外処理のためにCatchブロックが続くことは必須ですか? Tryブロックのあとには、Catch、finallyブロックが続く必要がある。 Tryブロックからスローされた例外は、catchブロックでキャッチするか、コードの中止がfinallyブロックに配置される前に実行する特定のタスクのいずれかである必要がある。 26. 例外ブロックで何らかの例外が発生した場合でも、finallyブロックをスキップする方法はありますか? 例外が発生するとfinallyブロックが常に実行されるます。 唯一の保言う方は、tryブロックの最後に次のコードを書き込むことで、コードを強制的に中止すること System.exit(0); 27. クラスのコンストラクターが呼び出される時は? コンストラクターは新しいキーワードでオブジェクトが作成されるたびに呼ばれる。 28. クラスに複数のコンストラクターを含めることはできますか? できる。 異なるパラメーターを持つ複数のコンストラクターを持つことができる。 使用されるコンストラクターはオブジェクト作成中に渡される引数によって異なる。 29. staticメソッドはオーバーライドできますか? できません。 Staticメソッドは個々のオブジェクトではなく、クラスに属し、コンパイル時に解決されます。 30. 出力はどうなりますか? Displaying from subClass Printing from superclass 31. String はJavaのデータ型ですか? Stringは、Java.Lang.Stringクラスのオブジェクトです。 つまり、Stringクラスの全ての組み込みメソッドをStringオブジェクトで使用することができる。 32. いくつのStringオブジェクトが作成されますか? 2つ 同じ文字列を参照する場合は、同じオブジェクトへの参照となる。 33. Javaの文字列が不変として呼び出される理由 Javaでは、値が文字列に割り当てられると、文字列オブジェクトは不変として呼ばれ、変更できず、変更された場合は、新しいオブジェクトがさくせされる。 34. 配列とベクター(Vector)の違い 配列は、同じプリミティブ型のデータをグループ化し、本質的に静的 ベクトルは本質的に動的であり、異なるデータ型のデータを保持できる 35. マルチスレッドとは何ですか? マルチスレッドは、1つのプログラム内で複数のタスクを実行するプログラミング概念 スレッドは同じプロセススタックを共有して、並行して実行される。 36. Runnable インターフェースがJavaで使用される理由 Runnableインターフェースはマルチスレッドを利用するため 37. Javaでマルチスレッドを実装する2つの方法は何ですか? Java.Lang.Runnableインターフェースを使用する。 Java.Lang.Threadクラスを継承する 38. データに多くの変更が必要な場合、どの設定を使用する必要がありますか? StringBuffersは本質的に動的であり、不変Stringとは異なり、StringBufferオブジェクトの値を変更できるため、データの変更が多い場合には常にStringBufferを使用することが推奨される Stringだと、毎回オブジェクトが作成され、余計なオーバーヘッドが発生する 39. SwitchステートメントでBreakを使用する目的は何ですか? 有効なケース後にbreakし、他のケースが実行されないようにするため 40. JavaでのGCはどのように行われるか Javaは、オブジェクトが参照されなくなるとGCが行われ、オブジェクトが行われ、オブジェクトは自動的に破棄される。 41. mainメソッドの前でもどのようにコードを実行できますか? 42. クラスを同時にスーパークラスとサブクラスにすることはできますか? できる 43. クラスでコンストラクターが定義されていない場合、クラスのオブジェクトはどのように作成されますか? 定義されない場合も、デフォルトのコンストラクターが暗黙的に使用されるため、オブジェクトは正常に作成される。 44. マルチスレッドで、リソースが複数のスレッドに同時に使用されないようにするためにはどうすれば良いですか? Synchronizedキーワードを使用することで、1つのスレッドのみが共有リソースが使用でき、他のスレッドがリソースを使用している他のスレッドから開放された場合にのみ他のスレッドがリソースの制御を取得できる 45. オブジェクトのクラスのコンストラクターを複数回呼び出すことはできますか? 新しいキーワードを使用して、オブジェクトを作成するとコンストラクターが自動的に呼び出されます。作成後に再度呼び出すことはできません。 46. ClassAとClassBという2つのクラスがある。ClassBからClassAのプライベートメンバーにアクセスできますか? アクセスできない。 47. 同じ名前のメソッドをクラスに含めることはできますか? 定義できる。パラメーター数・型が異なれば定義可能 48. Javaオブジェクトのコピーを作成するにはどうすれば良いですか? Clone()はCloneableインターフェースのメソッドであるため、オブジェクトのコピーを作成するには、Cloneableインターフェースを実装する必要がある。 49. 継承を使用する利点は何ですか? 継承を使用すると、サブクラスがスーパークラスのコードを再利用することができる。 ポリモーフィズムは既存お派生クラスに影響を与えずに新しい機能を導入できる大きな利点 50. クラスの変数とメソッドのデフォルトのアクセス指定子は何ですか? 変数とメソッドのデフォルトのアクセス指定子はパッケージで保護されている。つまり、変数とクラスは、パッケージ外ではなく、同じパッケージ内の他のクラスで使用できる。 51. Javaクラスでポインターの使用はできますか? できません。 Javaにはポインターの概念がない 52. クラスを継承できないように、制限するにはどうしたらよい? Finalキーワードを使う。 Public Final Class Stone { } 53. Protectedアクセス指定子のスコープは? Public: Class, Package, Subclass, World Protected: Class, Package, Subclass No modifier: Class, Package Private: Class 54. スタックとキューの違いは? スタック、キューともにデータのコレクションのプレースホルダーである。 スタック:LIFO キュー:FIFO 55. Javaでは、変数のシリアル化をどのように禁止できますか? Transientキーワードを使用する 56. プリミティブデータ型をオブジェクトとして使用するにはどうすればよいですか? ラッパークラスを使用してオブジェクトとして処理できる。 Integerはプリミティブデータ型intのラッパークラスです。 57. コンパイル時にどのタイプの例外がキャッチされますか? チャックされた例外は、プログラムのコンパイル時にキャッチできます。 コードを正常にコンパイルするには、コードでtry catchブロックを使用して、チャックされた例外を処理する必要が有ります。 58. スレッドの様々な状態を説明してください Ready: スレッドが作成されると、準備完了状態になります。 Running: 現在実行中のスレッドは実行状態です。 Waiting: 特定のリソースを解放するために別のスレッドを待機している Dead: 実行後にデッド状態になったスレッド 59. 明示的なコンストラクターが定義されている場合でも、クラスのデフォルトコンストラクターを使用できますか? 明示的なコンストラクターが定義されている場合は、定義されているコンストラクターのみを使用できる。 60. 同じメソッド名と引数を使用し、異なる戻り値の型を使用していメソッドをオーバーライドできますか? オーバーライドは、メソッド名、引数、戻り値の型が全く同じでなければオーバーライドにならない。 61. 次のコードの出力はどうなりますか? 4 62. staticメソッドないから non-staticメソッドを呼び出すことはできますか? Non-staticメソッドはクラスのオブジェクトによって所有され、オブジェクトレベルのスコープを持つ。 呼び出すためには、クラスのオブジェクトを作成し、オブジェクト参照を使用してこれらのメソッドを呼び出す。 63. Javaプログラムを実行するために設定する必要がある2つの環境変数 Path変数 CLASSPATH変数 64. Javaで変数を初期化せずに使用できますか? Javaでは、有効な値による事前の初期化を行わないと、コンパイルエラーとなる。 65. クラスを複数のクラスから継承できますか? Javaでは、複数のクラスからの継承である多重継承はサポートされておらず、1つのクラスからの継承である単一継承のみ。 66. コンストラクターはクラス名と異なる名前を持つことができますか? 名前が違う場合は、コンストラクターとして機能せず、通常のメソッドとなる。 67. Round(3.7)、Ceil(3.7)の出力はどうなりますか? 4 4 Round: 四捨五入 Ceil: 切り上げ Floor: 切り捨て 68. Javaでgotoを使用して特定の行に移動できますか? Javaにgoto機能のサポートはない。 69. デッドスレッドを再び開始できますか? Javaでは、デッド状態のスレッドを再び再開することはできない。 70. 次のクラス宣言は正しいですか? Public abstract final class testClass { } 抽象クラスはFinalとして宣言できないため、正しくない。 71. Javaプログラムを実行するには、各マシンでJDKが必要ですか? JDKはJavaの開発きっとであり、開発にのみ必要である Javaプログラムを実行するには、JREのみで十分。 72. equalsメソッドと==演算子の違いは? Equalsメソッドは、オブジェクトの内容を比較 ==演算子は、オブジェクトの参照を比較している。 String str1 = new String(“Hello World”) String str2 = new String(“Hello World”) Str1とstr2を比較すると Eqalsメソッドではtrue ==演算子ではfalse となる。 73. Javaにおいて、C言語のコードで実装を提供することはできますか? はい。 JavaからCの処理を呼ぶ方法(JNI/JNA/SWIG) - Qiita できそう。 74. Javaでデストラクタの定義は? デストラクタ:インスタンスが破棄された際に実行される。コンストラクタの逆。 Javaにデストラクタの概念はなく、独自のガーベージコレクションがあるため、オブジェクトの参照がなくなると、自動的にオブジェクトを破棄する。 75. 変数は、ローカルとstaticを両方同時に使えますか? ローカル変数をstaticとして定義するとコンパイルエラーとなる。 76. インターフェースに静的(static)メソッドを使用できますか? 静的メソッドはどのクラスでもオーバーライドできませんが、インターフェースのメソッドはデフォルトでは抽象であり、インターフェースを実装するクラスに実装することになっている。よって、インターフェースに静的メソッドを含めることに意味がない。 77. インターフェースを実装するクラスでは、インターフェースで定義されている変数の値を変更できますか? インターフェースで定義されている全ての変数は、定数のようなものなので値を変更すことはできない。 78. JavaのGCによってメモリ不足になることはありませんか? GCによるメモリ解放より、オブジェクト生成が速いペースで行われると、使用可能なメモリリソースが一杯になる可能性があるため、メモリ不足にならないことはない。 GCはメモリ不足を保証するものではない。 79. mainメソッドにvoid以外の戻り値の型を設定できますか? いいえ、Javaのmainメソッドの戻り値はvoidのみ Mainメソッドの完了時に値を返す必要がある場合は、System.exit(int status)を使用できる。 80. GCが完了したら、オブジェクトに再度アクセスすることは可能ですか? オブジェクトがGCで破棄されると、ヒープ領域に存在しなくなるため、再びアクセスすることはできず、再度参照する方法もない。 ヒープ領域:動的に確保と解放を繰り返せるメモリ領域のこと。プログラム実行時に、OSからソフトウェアに対して、一定量のヒープ領域が与えられる。ソフトウェアは必要に応じて、任意にヒープ領域を確保・解放できる。データの仮置き場や臨時の作業台のような存在。 81. スレッドプログラミングでは、どのメソッドが全てのスレッドの必須実装ですか? Run()はRunnablインターフェースのメソッド 82. プログラムでデータベース接続を制御し、一度に1つのスレッドのみがデータベースに接続を確立できるようにする必要があります。このロジックを実装するにはどうすればよい? 同期の概念を使用して実装できる。 データベース関連のコードは、Synchronizedキーワードを持つメソッドに配置できるため、一度に1つのスレッドのみがアクセスできる。 83. プログラマーが例外を手動でスローするにはどうすれば良いですか? Throwキーワードを使用することで、例外が、catchブロックで処理される。 84. 作成したクラスを他のクラスがそのクラスのオブジェクトを作成できないようにしたい。 クラスのコンストラクターをprivateとして宣言すると、他のクラスからアクセスできなくなる。 85. Javaでのオブジェクトの保存方法 Javaでは、各オブジェクトの作成時にヒープからメモリスペースを取得する。 GCで解放されると、ヒープが再割り当てされ、新しいオブジェクトに対して使用することができる。 86. ヒープ上のオブジェクトのサイズをどのように確認できるか? そんな方法はない。 87. 次のクラスで、多くのメモリが割り当てられるのはどっち? クラスA:3つのメソッド、4つの変数、オブジェクトなし クラスB:5つのメソッド、3つの変数、オブジェクトなし オブジェクト作成前にメモリ割り当ては生じないので、ヒープは度のクラスにも割り当てられない。 88. プログラムで例外が処理されない場合にどうなる? Try catch ブロックを使用していない場合、プログラムが中止され、例外後のステートメントは実行されない。 89. クラスに複数のコンストラクターが定義されていて、別のコンストラクターの本体から呼び出すことは可能か? this()で別のコンストラクターから1つのコンストラクターを呼び出すことができる。 90. 無名クラスとはどういう意味ですか? 無名クラスは、1行のコードで名前無しで定義されたクラス あるメソッドの中で、宣言され、その中でしか使わない。 import java.util.*; class Application { public static void main(String[] args) { List<Employee> list = new ArrayList<>(); // 省略 Collections.sort(list, new Comparator<Employee>() { public int compare(Employee e1, Employee e2) { return Integer.compare(e1.getAge(), e2.getAge()); } }); } } new Comparator<Employee>()…が無名クラス 91. 宣言後に、配列のサイズを増やす方法はありますか? 配列は、静的であり、サイズを指定したあとの変更はできない。 92. アプリケーションに複数のクラスがある場合、複数のクラスにmainメソッドを含めることはできますか? 可能であるが、エントリポイントは特定のクラスのmainメソッドのみから開始される。 93. オブジェクトのデータを永続化したいための最良のアプローチは? シリアル化の概念を使用すること Serializable について - Qiita 94. Javaのローカルクラスとは何ですか? 特定のメソッド内で新しいクラスを定義すること、 定義されているブロックの外部では使用できない。 95. StringとStringBufferを比較できますか? StringとStringBufferは両方ともStringオブジェクトを表しますが、相互に比較することはできず、比較しようとするとエラーが発生する。 96. オブジェクトのセットの操作のAPIはどれですか? ArrayList HashMap TreeSet TreeMap 97. 他の型をboolean型にキャストできますか? できない。 98. オーバライドされた場合、メソッドに異なる戻り値を使用できますか? できるけど、メソッド名がおなじで、同様のパラメーターを持つこと 99. 例外クラスの基本クラスは何ですか? Javaでは、Java.lang.Throwableは全ての例外クラスのスーパークラス 100. 継承におけるコンストラクタの呼び出しの順序は何ですか? 軽症の場合、派生クラスの新しいオブジェクトが作成されると、最初にスーパークラスのコンストラクターが呼び出され、次に派生クラスのコンストラクターが呼び出される。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OpenJDKのインストール(mac)

はじめに 最近PCを入替えたので備忘を兼ねてメモ 最新版だけ入れておけばいいんだけど、レガシーなシステムだといまだに JDK8 を使っていたりするので、OpenJDK いれて切り替えができるまでの手順を残しておく やりたいこと OpenJDK のインストール バージョンの切替ができること 環境情報 % sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H1323 やったこと homebrew で OpenJDK のインストール バージョンの切替 1.homebrew で OpenJDK のインストール adoptopenjdk の OpenJDK をインストールします。 今回は、8, 11 のインストールを行います # JDK 8 のインストール % brew install adoptopenjdk8 --cask ? adoptopenjdk8 was successfully installed! # JDK 11 のインストール % brew install adoptopenjd11 --cask ? adoptopenjdk11 was successfully installed! 無事、インストールできました。 ※そういえばいつのまにか「cask」コマンドの使い方が変わっていたんですね ※「brew cask install xxx」 → 「brew install xxx --cask」 ここまでで、インストールされた OpenJDK のバージョンを確認しておきます % /usr/libexec/java_home -V Matching Java Virtual Machines (2): 11.0.11, x86_64: "AdoptOpenJDK 11" /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home 1.8.0_292, x86_64: "AdoptOpenJDK 8" /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home ちゃんと、 8, 11 が入ってますね また、この時点時点では、 OpenJDK11 が有効化されているようです java -version openjdk version "11.0.11" 2021-04-20 OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9) OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode) 2.バージョンの切替 では、バージョンの切替をやっていきます。 やることとしては、JAVA_HOMEにパスを通しておけばOKですね 現在 OpenJDK 11 が有効になっているので、これを 8 に切り替えます % export JAVA_HOME=`/usr/libexec/java_home -v 1.8` % java -version openjdk version "1.8.0_292" OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_292-b10) OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.292-b10, mixed mode) できました。 同様に、11 にしたいときは、 % export JAVA_HOME=`/usr/libexec/java_home -v 11` % java -version openjdk version "11.0.11" 2021-04-20 OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9) OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)``` とすればOKです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む