20210213のJavaに関する記事は7件です。

JAVAのデータ型や変数について

はじめに

今回はJAVAのデータ型や変数について書いていきたいと思います。

変数

変数はデータを入れる箱になります。データを入れたり、出したりできます。
変数名をつけて、データ型を定義する必要があります。
クラス変数とかインスタンス変数とかあったりするのですが、今回は割愛します。

定義の仕方
// 基本型
int num = 0; 
char character = 'a';
// 参照型
String hello = "helloWorld";
int[] numList = {1,2,3};

【データ型】基本型(プリミティブ型)と参照型

基本型(プリミティブ型)

データ型名 入る値
byte 8ビット整数
short 16ビット整数
int 32ビット整数
long 64ビット整数
float 32ビット単精度浮動小数点数
double 64ビット倍精度浮動小数点数 
boolean true か false
char 16ビットUnicode文字

javaには8種類の基本型が存在します。
数字を扱うデータ型でもいろんな種類があるのですが、使うメモリ数が違ってくるので大きければいいというわけではなく
適切なデータ型を定義する必要があります。

参照型

基本型とは違い、値そのものを保持するのではなく、値が置いてある場所を保持します。
例えば「配列」や文字列を扱う「string」が参照型にあたります。

基本型と参照型の違い

違い
// 基本型
int num1 = 1; 
int num2 = num1;
num1++;
// num1の値は2 num2の値は1 

// 参照型
int[] num1 = {1};
int[] num2 = num1;
num1[0]++;
// num1[0]の値は2 num2[0]の値は2

基本型の方は値を入れているので、num2 = num1 はnum1の中の値1をnum2に入れているとなり、num1++しただけなら
num2の方は変わることはありません。
ですが、参照型の方はnum2 = num1は値ではなくデータの場所を渡しているのでnum2とnum1は同じ場所の値を見ていることになるのです。
その為、num1++した場合、同じ場所を見ているnum2も2が返ってくるのです。

ラッパークラス

 基本型は値を入れているだけで、値に対する操作をするメソッドがありません。
 そこで基本データ型をオブジェクトとして扱えるようにするラッパークラスが存在するのです

データ型 ラッパークラス
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character
ラッパークラス
int num = 0;
Integer num2 = new Integer(num);
// 下記でも可能
Integer num3 = num;

ジェネリクスで使えない時とかに使うようです。
(ListやOptinoal等に基本型は使えない)

まとめ

いかがだったでしょうか!
今回はJAVAのデータ型、変数についてまとめてみました。
たまに参照型使って沼にハマることがあるので覚えときましょう!

ご覧いただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

eclipseを使ってSpringBootでHello World

流れ

  • eclipseのインストール
  • SpringBootプロジェクトの作成
  • Hello Worldを表示

eclipseのインストール

eclipseをここからインストールします
https://mergedoc.osdn.jp/
リンクを開いたら、バージョンやOSなどを選択して、インストールします。
今回は、Eclipse2020 → Java Windows64bit Full Editionを選択し、Downloadをクリックしました。

ダウンロードが完了したら、解凍します。
zipファイルの解凍には、7-Zipを使用してください。
今回は、Cドライブ直下に解答しました。

pleiadesというフォルダが作成されます。
これでeclipseのインストールは完了です。

eclipseを起動してみます。
pleiades\eclipse\eclipse.exeを起動します。
(ショートカットをデスクトップ等に作成しておくと便利です)
起動すると、ワークスペースのディレクトリ—選択という画面が表示されます。
このワークスペースの中に、ソースファイルなどを作成していきます。
今回は、変更せず、「../workspace」のまま、起動しました。

起動すると、Eclipseの開発画面が立ち上がります。
Eclipseの開発準備はこれで完了です。

SpringBootプロジェクトの作成

eclipseの開発画面が開けたら、左上にある「ファイル(F)」から
「ファイル(F)」→「新規(N)」→「プロジェクト(R)...」と順にクリックし、
プロジェクトを作成していきます。

ウィザードを選択の画面では、「Spring スターター・プロジェクト」を選択します。
選択すると、設定変更画面が表示されます。
名前やパッケージ名、使用する言語、ビルドツールなどが選択できます。

今回は、名前やパッケージ名等は、初期値のままで作成します。
「型」というところが、ビルドツールです。今回は、Mavenにします。
Mavenは「pom.xml」ファイルを使用して管理します。
今回は、パッケージングも「Jar」のままにします。
設定画面

「次へ(N)」をクリックします。

ライブラリの依存関係を追加します。
あとからpom.xmlを編集する事でも追加できます。
今回は、「Spring Web」、「Thymeleaf」を追加します。
Spring Webはwebアプリケーションを作る場合に必要です。
Thymeleafはテンプレートエンジンです。※なしでやってみたら「Whitelabel Error Page」が表示されました。
とりあえず、今はこの2つで進めてみてください。

無題.png
※自分が最初はじめた時は、他の依存関係等、無駄に色々調べたりして、
苦労した記憶があるので、まずは「Web」選択して完了して動かしてみたほうが良いと思います。
他の依存関係は、必要になった時にまた調べたら良いです。

これでSpringBootプロジェクトの作成ができました。

Hello Worldを表示

画面にHello Worldを表示させていきます。
全体の流れは以下の様です。
1. HTMLの作成
2. Controllerクラスの作成
3. 実行

HTMLの作成をします。
src\main\resourcesの直下のtemplatesを右クリックし
「新規(W)」→「その他(O)...」と進み、HTMLファイルを作成します。
HTMLファイルを編集します。今回は、「Hello World」を書き込みます。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
  <h1>Hello World</h1>
</body>
</html>

Controllerクラスの作成をします
src\main\java\com\example下のdemoを右クリックし、
「新規(W)」→「クラス」と進み、Java クラスを作成します。
(src\main\java→com.example.demoと表記されているかも)

今回は、名前に「HelloController」と入力し、作成しました。
HelloControllerを編集します。

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping(value="/")
    public String index() {
        return "index";
    }
}

returnには、表示するHTMLファイルの名前を指定します。
RequestMappingのvalueがURLで指定する値です。

実行します
プロジェクトを右クリックし、(今回では、demo[boot]と表示されてる箇所)
「実行(R)」→「Spring Boot アプリケーション」をクリックし、実行します。

コンソールにエラーが表示されなければ実行成功です。
ブラウザを開き、以下のURLを入力します。
http://localhost:8080/」

Hello Worldが表示されたら成功です。
eclipseを使ってSpringBootでHello Worldを表示させることができました

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Circle CIでの自動デプロイ(SpringBootアプリケーション)のためのconfig.yml

version: 2 # バージョンは「2」とする
jobs: # 実行するタスクの定義
  build: # ビルドする内容をいかに記述
    working_directory: <アプリケーションのルートディレクトリ> 

    docker: # Dockerの設定
      - image: circleci/openjdk:11-stretch # Dockerfileの「From」に記述したベースイメージ

    steps: # 実行するコマンドを以下に記述

      - checkout:
          path: <circleciフォルダの階層>

      - restore_cache: pom.xmlが変わった時の差分を取得
          key: portfolio-{{ checksum "pom.xml" }}

      - run: mvn dependency:go-offline # プロジェクトのdependencyを取得する

      - save_cache: # プロジェクトのdependencyを取得するを保存
          paths:
            - ~/.m2
          key: portfolio-{{ checksum "pom.xml" }}

      - run: mvn clean install # テスト実行

      - store_test_results: # テスト メタデータを `target/surefire-reports` ディレクトリからアップロードし、CircleCI ダッシュボードに表示されるようにします
          path: target/surefire-reports # mave sure-fireプラグインというのが必要

      - store_artifacts: # uberjarファイルをアーティファクトとして保存します
          path: target/<jarファイル>


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaで学ぶアルゴリズム 第4弾:ランダムな順列

#Javaで学ぶアルゴリズム < ランダムな順列 >

はじめに

Javaは授業で触れただけで全くの初心者であり,何もわかっていない.なので,基本的なアルゴリズムをJavaで実装し,アルゴリズムの理解を深めるとともに,Javaにも慣れていきたい.
その第4弾としてランダムな順列を扱う.

ランダムな順列

順列とは並びである.ここでは,$1$~$N$までの値をランダムに並べた順列を生成するアルゴリズムについて,最悪のアルゴリズムとそれの改良版を学び,最適な順列生成についての理解を深める.

最悪のアルゴリズム

以下に方法を示す.これは,$N^2$オーダーの繰り返しを行う効率の悪い方法である.ここでは,$1$~$6$の値を例に扱う.
image.png
この方法では,範囲内の乱数を得て,リストにないものを取り入れていくという無作為な抽出のような方法であり,上図にも書いているように,無駄な操作が増えることが予想される.

ソースコード
random_permutation1.java
//2020/12/16
//@Yuya Shimizu
//-----------------------------------
//*     ランダムな順列(非効率)    *
//-----------------------------------

import java.awt.*;
import java.awt.event.*;

//パネルの設定
class random_Panel1 extends Panel{
    //乱数生成関数
    int irnd(int n){        //1~nの乱数
        return (int)(Math.random()*n+1);
    }

    //ランダムな順列を生成して表示する関数
    public void paint(Graphics g){
        final int N = 20;   //最大値20
        int[] a = new int[N+1];
        int i,j,flag;

        a[1] = irnd(N); //step1

        //step2
        for (i=2; i<=N; i++){
            do {
                a[i] = irnd(N); //step3
                flag = 0;
                for (j=1; j<i; j++){
                    if (a[i] == a[j]){
                        flag = 1; break;
                    }
                }
            }while (flag==1);
        }

        String s = "";

        for (i=1; i<=N; i++)
            s = s + a[i] + ",";
        g.drawString(s, 10, 20);
    }
}

//フレームの設定
class random_Frame1 extends Frame{
    public random_Frame1(){
        setSize(400, 100);//400×100の大きさでフレームを作成
        //×ボタンを押したら終了
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        Panel p=new random_Panel1();//パネルオブジェクトpに先ほど設定したパネルを指定
        add(p); //フレームにそのパネルを貼り付け
    }
}

//クラス
public class random_permutation1{
    //メイン関数
    public static void main(String[] args){
        Frame w=new random_Frame1();
        w.show();
    }
}
出力

random_permutation1.PNG

改良版アルゴリズム

以下に方法を示す.これは,$N^2$オーダーを$2N$オーダーにできる効率的に改良された方法である.
image.png
この方法であれば,もうすでに取り入れたものは範囲として省かれ,最悪のアルゴリズムのように無駄な操作はなくなると予想される.このことからも改良されていると分かる.

ソースコード
random_permutation2.java
//2020/12/16
//@Yuya Shimizu
//-----------------------------------
//*     ランダムな順列(改良版)    *
//-----------------------------------

import java.awt.*;
import java.awt.event.*;

//パネルの設定
class random_Panel2 extends Panel{
    //乱数生成関数
    int irnd(int n){        //1~nの乱数
        return (int)(Math.random()*n+1);
    }
    //ランダムな順列を生成して表示する関数
    public void paint(Graphics g){
        final int N = 20;   //最大値20
        int[] a = new int[N+1];
        int i,j,d;

        //step1
        for (i=1; i<=N; i++)
            a[i] = i;

        //step2以降
        for (i=N; i>1; i--){
            j = irnd(i-1);
            d = a[i];
            a[i] = a[j];
            a[j] = d;
        }

        String s = "";

        for (i=1; i<=N; i++)
            s = s + a[i] + ",";
        g.drawString(s, 10, 20);
    }
}

//フレームの設定
class random_Frame2 extends Frame{
    public random_Frame2(){
        setSize(400, 100);//400×100の大きさでフレームを作成
        //×ボタンを押したら終了
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        Panel p=new random_Panel2();//パネルオブジェクトpに先ほど設定したパネルを指定
        add(p); //フレームにそのパネルを貼り付け
    }
}

//クラス
public class random_permutation2{
    //メイン関数
    public static void main(String[] args){
        Frame w=new random_Frame2();
        w.show();
    }
}
出力

random_permutation2.PNG

感想

今回はたった20個のデータを扱うようなプログラムであったため,最悪のアルゴリズムと改良版のアルゴリズムとの違いを体験することはできなかった.しかしながら,最悪となり得るアルゴリズムを学ぶことができたため,順列を生成する際には,この方法を避けることは意識できると思う.

参考文献

Javaによるはじめてのアルゴリズム入門  河西 朝雄 著 技術評論社

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Effective Java(第3版)の個人的なまとめ【項目1】 コンストラクタの代わりにstaticメソッドを検討する

Effective Javaを学んだ個人的なまとめです。

結論

インスタンスの生成や利用を考えるときに、コンストラクタの利用を無意識に考えるのではなく、staticファクトリメソッドも検討に入れよう。

コンストラクタを利用する場合と比較してどのようなメリットとデメリットがあるのか。

? メリット

1.名前を持つことができる

コンストラクタはクラス名と同じであるため、任意の名前を持つことができない。staticメソッドの場合は、メソッドなのでその動作にあった名前をつけることができるためわかりやすい

2. インスタンスを生成する必要がない

キャッシュしているインスタンスの再利用をすることで不用意なインスタンスの生成を防ぎ、計算量、処理量を減らすことができる。(GoFデザインパターンのシングルトン)

3.任意のサブタイプのオブジェクトを返すことができる
4.返却するオブジェクトを入力によって変えることができる

コンストラクタと異なり、戻り値を任意に定められるため、型にあった任意のオブジェクトを返却することができる。

5.クラス作成時に返却されるオブジェクトのクラスがなくてもよい

ある種当たり前の話ですが、コンストラクタの存在のためにはクラスの定義が必要である。一方staticファクトリメソッドの場合はクラスが存在しなくてもよいため、柔軟な対応が可能となる。

? デメリット

1. publicあるいはprotectedのコンストラクタを持たないサブクラスを作れない

ただ逆に、継承ではなく、コンポジションを使うことをプログラマに促すことができるメリットもある。

2. staticファクトリメソッドを見つけるのが難しい

JavaDocが目立たせてくれない。ただ、IDEや命名規則によって解決することが可能ではある。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaでファイルやディレクトリのタイムスタンプを変更したい。

Javaでファイルやディレクトリのタイムスタンプを変更したい場合Files.setLastModifiedTimeを利用すると便利です。たとえば指定のファイルのタイムスタンプを現在時刻にしたい場合は以下のようなコードになります。

FileTime now = FileTime.from(Instant.now());
Path file = Paths.get("/path/to/file");
Files.setLastModifiedTime(file, now);

Files.setLastModifiedTimeの第2引数には時刻を指定します。Javaで時間や日付というとDateCalendarLocalDateTimeあたりをよく利用しますが、ここではFileTimeというあまりなじみのないものを利用することに注意する必要があります。

環境情報

$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)
$ javac -version
javac 11.0.3
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】MapをListに変換する方法

はじめに

本記事ではMapをListに変換する2通りの方法をアウトプットします。

Listを直接生成する方法

Map<String, String> TopBillionaires = new LinkedHashMap<>();
        TopBillionaires.put("$195bn", "Elon Musk");
        TopBillionaires.put("$185bn", "Jeff Bezos");
        TopBillionaires.put("$134bn", "Bill Gates");
        TopBillionaires.put("$102bn", "Mark Zuckerberg");
        TopBillionaires.put("$88.2bn", "Warren Buffett");
        TopBillionaires.put("$81bn", "Sergey Brin");

        List<String> keyList = new ArrayList<>(TopBillionaires.keySet());
        List<String> valueList = new ArrayList<>(TopBillionaires.values());

        System.out.println(keyList);
        System.out.println(valueList);

        //出力
        // [$195bn, $185bn, $134bn, $102bn, $88.2bn, $81bn]
        // [Elon Musk, Jeff Bezos, Bill Gates, Mark Zuckerberg, Warren Buffett, Sergey Brin]

Streamを利用する方法

以下では、StreamのCollectメソッドにCollectorsクラスのtoCollectionメソッドを渡しています。
出力結果はListを直接生成する方法と同じです。

Map<String, String> TopBillionaires = new LinkedHashMap<>();
        TopBillionaires.put("$195bn", "Elon Musk");
        TopBillionaires.put("$185bn", "Jeff Bezos");
        TopBillionaires.put("$134bn", "Bill Gates");
        TopBillionaires.put("$102bn", "Mark Zuckerberg");
        TopBillionaires.put("$88.2bn", "Warren Buffett");
        TopBillionaires.put("$81bn", "Sergey Brin");

        List<String> keyList = TopBillionaires.keySet().stream()
                .collect(Collectors.toCollection(ArrayList::new));
        List<String> valueList = TopBillionaires.values().stream()
                .collect(Collectors.toCollection(ArrayList::new));

        System.out.println(keyList);
        System.out.println(valueList);

        //出力
        // [$195bn, $185bn, $134bn, $102bn, $88.2bn, $81bn]
        // [Elon Musk, Jeff Bezos, Bill Gates, Mark Zuckerberg, Warren Buffett, Sergey Brin]

参照

Java Platform SE8 #インタフェースStream

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む