АРХИВ ПО ТЭГУ "JAVA"
НОЯБРЬ 19, 2014

Hi,

Very interesting thing: Java compiler generate pretty clever code when you operate with strings, i.e. when you concatenate two or more Strings JVM creates StringBuilder transparently to a programmer and concatenates passed strings using that builder object and only then assigns the value to resulting string.

So typical interview question «What is more efficient for concatenating strings: ‘plus’ operator on strings or using StringBuilder class?» you can simply answer «both ways are efficient, and actually almost the same». Let’s do some disassembling now to make sure. I was using both Java 1.6 and Java 1.7 to test my statement.

  1. class Str{
  2.   public static void main(String[] args) {
  3.     String s = "first";
  4.     int i = 5;
  5.     String s2 = "second";
  6.  
  7.     String res = s + i + " " + s2;
  8.  
  9.     System.out.println(res);
  10.   }
  11. }

And now bytecode generated using javac (Java 1.7):

Compiled from «Str.java»
  1. class Str {
  2.   Str();
  3.     Code:
  4.        0: aload_0      
  5.        1: invokespecial #1                  // Method java/lang/Object."":()V
  6.        4: return        
  7.  
  8.   public static void main(java.lang.String[]);
  9.     Code:
  10.        0: ldc           #2                  // String first
  11.        2: astore_1      
  12.        3: iconst_5      
  13.        4: istore_2      
  14.        5: ldc           #3                  // String second
  15.        7: astore_3      
  16.        8: new           #4                  // class java/lang/StringBuilder
  17.       11: dup          
  18.       12: invokespecial #5                  // Method java/lang/StringBuilder."":()V
  19.       15: aload_1      
  20.       16: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  21.       19: iload_2      
  22.       20: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  23.       23: ldc           #8                  // String  
  24.       25: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  25.       28: aload_3      
  26.       29: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  27.       32: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  28.       35: astore        4
  29.       37: getstatic     #10                 // Field java/lang/System.out:Ljava/io/PrintStream;
  30.       40: aload         4
  31.       42: invokevirtual #11                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  32.       45: return        
  33. }
АПРЕЛЬ 9, 2014
МАРТ 19, 2014

Кукуня,

Как дела?

Сегодня вышла новая Java 8, или не сегодня, но я сегодня об этом узнал icon smile Java 8 released %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news

Список фичей:

ОКТЯБРЬ 19, 2013

Йо,

Несложные вродь задачки, прикольно порешать иногда, жаль нет времени разобраться со второй. Но ничего, может быть в поябрьском поучаствую еще разочек и уже решу все. А сейчас пора навестить племянницу icon smile Odesk coding game %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Код код код (закомичу после контест дедлайла).

http://www.codingame.com/cg/?target=language&id=2#!ranking:odesk:myltik

Screen Shot 2013 10 19 at 1.01.16 PM Odesk coding game %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

ИЮНЬ 6, 2012

euro 2012 logo Приветик news

Хей,

Как всё? Что новенького?

Послезавтра стартует Чемпионат Европы 2012 (Евро 2012). Турнир откроют в 20:00 по Москве матчем Польша — Греция, не самые интересные команды, но поляки все таки хозяева чемпа, должны выйти как минимум из группы icon smile Приветик news Наши сыграют в тот же день с сильными Чехами, придется не легко хотя бы потому, что в воротах у чешской сборной играет Петя Чех. Ну а выиграют турнир кнешно же немцы. Ну или англичане, т.к. никто на них уже не ставит давно после кучи провальных чемпов прошлых годов.

Кстати, а какие вы спрашиваете вопросы на собеседовании по Java?

А у вас есть велосипед? Если да, то какой? И как вы его используете? Ну там на работу например ездите или гонки гоняете.

Пишу в блог и параллельно фишку и собираю билды.. жуть. Пойду доделаю.

Приятного вечера!

АВГУСТ 19, 2011

oracle hate sux Grails/Java   Insert LARGE CLOB into Oracle 9i %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Hi.

Ох уж этот оракл, юзабильность это не о нем.

На этот раз проблема с Oracle 9i драйвером для Java. Возникла проблема сохранения CLOB / BLOB данных в базу, используя драйвер для Oracle 9i. На 10g все вроде как даже работает..

Так вот когда пытаешься работать с CLOB / BLOB, то возникают различные ексепшены типа

  • java.sql.SQLException: Data size bigger than max size for this type: 50584
  • java.sql.SQLException: operation not allowed: streams type cannot be used in batching
Аха, можете попробовать, ни для какого типа данных у меня не получилось сохранить большой объект простым способом. А я пробовал много чего: CLOB, BLOB, LONG, LONG RAW. Но фига — больше 4-50kb не сохраняет.
В итоге пришел к изврашенному решению описанному где то в потайных документациях оракла. Решение использует Java JDBC для сохранения модели если это оракл драйвер версии 9. Для других баз и других версий оракла будет использоваться стандартное сохранение доменного класса Grails.
Моделька Grails
package my.com
  1.  
  2. class MyDomain {
  3.  
  4.  String bigData
  5.  
  6.  static constraints = {
  7.   bigData(maxSize: 1024 * 1024) // 1 MB
  8.  }
  9.  
  10.  static mapping = {
  11.   bigData type:"text" // this will create CLOB data type column
  12.  }
  13. }
Методы сервиса для сохранения большого CLOB’а
def isOracle9Driver = {
  1.   boolean isOracle9 = false
  2.  
  3.   try {
  4.    Connection conn = sessionFactory.getCurrentSession().connection()
  5.    DatabaseMetaData dbmd = conn.getMetaData()
  6.  
  7.    if (dbmd != null) {
  8.     String dbName = dbmd.getDatabaseProductName()
  9.     String dbDriverVer = dbmd.getDriverVersion()
  10.  
  11.     if ("Oracle".equals(dbName) && (dbDriverVer != null && dbDriverVer.startsWith("9."))) {
  12.      isOracle9 = true
  13.     }
  14.    }
  15.   } catch (Exception e) {
  16.    log.warn "Error getting DB Driver version — " + e.getMessage()
  17.    e.printStackTrace()
  18.   }
  19.  
  20.   return isOracle9
  21.  }
  22.  
  23.  def saveMyDomain(def bigData) {
  24.  
  25.   // RAW SQL USING JDBC FOR Oracle 9i DRIVER
  26.   if (isOracle9Driver()) {
  27.  
  28.    Connection conn = sessionFactory.getCurrentSession().connection()
  29.    PreparedStatement stmt
  30.    CallableStatement callableStmt
  31.  
  32.    try {
  33.  
  34.     //
  35.     // Insert new entry with empty clob
  36.     String sql = "BEGIN INSERT INTO my_domain (id,version,big_data) values (HIBERNATE_SEQUENCE.NEXTVAL,1,empty_clob()) RETURNING id INTO ?; END;"
  37.     callableStmt = conn.prepareCall(sql)
  38.     callableStmt.registerOutParameter(1, Types.INTEGER);
  39.     callableStmt.executeUpdate()
  40.  
  41.     long newId = callableStmt.getLong(1)
  42.     if (newId < 0) {
  43.      throw new IllegalStateException("Cannot get autogenerated ID of my_domain: got id=" + newId)
  44.     }
  45.     callableStmt.close()
  46.  
  47.     //
  48.     // Select for update
  49.     sql = "SELECT big_data FROM my_domain WHERE id=? FOR UPDATE"
  50.     stmt = conn.prepareStatement(sql)
  51.     stmt.setLong(1, newId)
  52.  
  53.     ResultSet rss = stmt.executeQuery()
  54.     if (!rss.next()){
  55.      throw new IllegalStateException("Cannot get result for 'select for update' of my_domain")
  56.     }
  57.  
  58.     //
  59.     // Update create entry with clob data
  60.     CLOB clob = (CLOB) rss.getClob("big_data")
  61.     clob.putString(1, bigData)
  62.  
  63.     sql = "UPDATE my_domain SET big_data=? WHERE id=?"
  64.     stmt = conn.prepareStatement(sql)
  65.     stmt.setClob(1, clob)
  66.     stmt.setLong(2, newId)
  67.     stmt.executeUpdate()
  68.     stmt.close()
  69.  
  70.     conn.commit()
  71.  
  72.     } catch (Exception e) {
  73.      log.error "Cannot save my_domain — " + e.getMessage()
  74.      e.printStackTrace()
  75.      conn.rollback()
  76.     } finally {
  77.      if (callableStmt != null) callableStmt.close()
  78.      if (stmt != null) stmt.close()
  79.     }
  80.   } else {
  81.    // DOMAIN CLASS SAVE
  82.    new MyDomain(
  83.      bigData: bigData
  84.     ).save(flush:true)
  85.   }
  86.  }
Страницы:12