본문 바로가기
코딩도전기/MVC

CODO Day25_JAVA_MVC(Linked List/Set Collection(HashSet))

by 코도꼬마 2023. 3. 8.

Linked List

  • 사용방법은 Array List와 같음
  • Array List와 달리 Linked List는 좌우 데이터의 주소를 기억하는 구조
  • 전체 index가 움직이지 않고 좌우 주소값만 기억하기 때문에 중간 index에 데이터 추가/삭제 시 효율적임
  • 중간에 값을 넣을 경우 속도가 빠르지만 마지막 위치에 넣을 경우 Array List보다 느림

 

  • index.jsp(AraayList와 LinkedList의 속도 비교)
    • 동기방식 : 서버에서 응답이 올 때까지 아무것도 할 수 없음(반복실행시키면 사)
                       테스트의 결과가 나올 때까지 브라우저의 로딩바가 계속 돌아감 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<style></style>
</head>
<body>
	<h3>AraayList와 LinkedList의 속도 비교</h3>
	<!-- ArrayList와 LinkedList에 100만개의 데이터를 넣어서 처리속도 비교 -->
	<form action="compare">
		<input type="text" name="cnt" value="1000000"/>개의 데이터를
		<select name="pos">
			<option value="last">끝 부분</option>
			<option value="mid">중간 부분</option>
		</select>에 넣기
		<button>시작</button>
	</form>
	<h3>ArrayList : ${arrList}</h3>
	<h3>LinkedList : ${lnkList}</h3>
</body>
<script></script>
</html>

 

  • CompareModel
package kr.co.web.model;

import java.util.ArrayList;
import java.util.LinkedList;

public class CompareModel {

	String pos;
	int cnt;
	long startTime;
	long endTime;
	
	ArrayList<String> arrList = new ArrayList<String>();
	LinkedList<String> lnkList = new LinkedList<String>();
	
	public CompareModel(String pos, String cnt) {
		//1.위치, 반복횟수 받아서 초기화
		this.pos = pos;
		this.cnt = Integer.parseInt(cnt);
		
		//2.ArrayList와 LinkedList에 100개의 데이터를 넣음(중간에 값을 넣기 위해 기본값 제공)
		for(int i = 1; i<=100; i ++) {
			arrList.add("data");
			lnkList.add("data");
		}
	}
	
	public String testArrayList() {
		
		startTime = System.currentTimeMillis();
		
		for(int i=0; i<=cnt; i++) {
			if(pos.equals("mid")) {
				arrList.add(55, "add data");
			}else {
				arrList.add("add data");
			}
		}
		
		endTime = System.currentTimeMillis();
		
		return "소요시간 : " + (endTime - startTime) + "ms";
	}
	
	public String testLinkedList() { 
		for(int i=0; i<=cnt; i++) {
			if(pos.equals("mid")) {
				lnkList.add(55, "add data");
			}else {
				lnkList.add("add data");
			}
		}
		
		endTime = System.currentTimeMillis();
		
		return pos + "에 소요시간 : " + (endTime - startTime) + "ms";
	}
	
}

 

  • CompareController
package kr.co.web.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.co.web.model.CompareModel;

@WebServlet("/compare")
public class CompareController extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		String cnt = req.getParameter("cnt");
		String pos = req.getParameter("pos");
		System.out.println(cnt+"/"+pos);
		CompareModel model = new CompareModel(pos, cnt);
		
		req.setAttribute("arrList", model.testArrayList());
		req.setAttribute("lnkList", model.testLinkedList());
		RequestDispatcher dis = req.getRequestDispatcher("index.jsp");
		dis.forward(req, resp);
	}

}

 

 

 

Set Collection

  • Set interface를 구현받는 HashSet / TreeSet이 있음
  • TreeSet은 잘 사용하지 않음
  • 순서가 유지 되지 않아 중복을 허용하지 않음(index가 없어서 중복값을 구별할 수 없기 때문)
  • List와 구현받는 인터페이스는 동일하기 때문에 기본적인 method는 같음

 

Written by zer0box

 

  • 검색기능(contain(), get())이 없는 대신에 하나씩 꺼낼 수 있는 Iterator를 제공
  • Set을 하나씩 가져오기 편리하도록 iterator()로 쪼갠 후 next()로 가져옴

Written by zer0box

 

  • index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<style>
	h4{
		display: inline;
	}
</style>
</head>
<body>
	<h3>Set에 데이터 넣기</h3>
	<form action="addData">
		<input type="text" name="data"/>
		<input type="submit" value="추가"/>
	</form>
	
	<a href="getData">Set에서 가져오기</a>
	<br/>
	<c:forEach items="${setList}" var="item">
		<h4>${item}</h4>
	</c:forEach>	
</body>
<script></script>
</html>

 

  • SetModel
package kr.co.web.model;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetModel {
	
	private static Set<String> set = new HashSet<String>(); //다형성 활용
	//Set도 Collection interface를 구현받으므로 List와 사용법이 비슷
	//add()로 추가, remove()로 삭제, size()로 크기확인, clear()로 비우기
	//검색이 불하능한 Set의 특성상 contains()나 get() 메서드는 사용 불가
	
	public void addData(String val) {
		//데이터 추가(중복값을 받지 않음)
		//객체는 같은 클래스라 하더라도 복사 시 일련번호가 달라서 중복으로 생각하지 않음
		set.add(val);
		//System.out.println("set의 데이터 수 : " + set.size());
	}

	public ArrayList<String> getData() {
		//set에서 데이터 뽑는 방법 1
		 //1.꺼내기 편하게 쪼개줌
		  Iterator<String> iter = set.iterator();  
		  ArrayList<String> list = new ArrayList<String>();
		  
		  while(iter.hasNext()) { //2.꺼낼 값이 있으면 true 
		  		String val = iter.next();
		  		//System.out.println(val);
		  		list.add(val);
		  } 
		  return list;
		//set에서 데이터 뽑는 방법 2(향상된 for문 활용-바람직한 방법X)
		/*
		 * 
		 * for(String val : set) { 
		 * 		list.add(val); 
		 * } return list;*/		
	}

}

 

  • SetController
package kr.co.web.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.co.web.model.SetModel;

@WebServlet(urlPatterns = {"/addData","/getData"})
public class SetController extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		String uri = req.getRequestURI();
		String ctx = req.getContextPath();
		String addr = uri.substring(ctx.length());
		
		RequestDispatcher dis;
		
		String data = req.getParameter("data");
		//System.out.println(data);
		
		SetModel model = new SetModel();		
		
		if(addr.equals("/addData")) {
			model.addData(data);
		}
		
		if(addr.equals("/getData")) {
			req.setAttribute("setList",model.getData());
		}

		dis = req.getRequestDispatcher("index.jsp");
		dis.forward(req, resp);
	}

}

가져오기 링크 클릭 후

'코딩도전기 > MVC' 카테고리의 다른 글

Servlet  (0) 2023.12.14
CODO Day26_JAVA_MVC(Map – Hash Map)  (2) 2023.03.09
CODO Day24~25_JAVA_MVC(Generic)  (0) 2023.03.07
CODO Day23~24_JAVA_MVC(Collection Framework - ArrayList/Vector)  (0) 2023.03.06
CODO Day23_JAVA_MVC(Exception)  (0) 2023.03.06